第一章 机器学习概览
· Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition, by Aurélien Géron (O’Reilly). Copyright 2019 Aurélien Géron, 978-1-492-03264-9.
· 学习时间:2022.03.28~2022.03.29
注:SciKit-Learn是SciKit库的一部分,SciKit意思是SciPy Tookits,名字来源于SciPy库,SciKit基于SciPy库构建,除了SciKit-Learn,还包含其他很多模块。SciKit-Learn库是专注于机器学习和数据挖掘的模块。本章基本没有涉及代码,结构如下:
文章目录
- 第一章 机器学习概览
- 19问
- 1.1 什么是机器学习
- 1.2 为什么使用机器学习
- 1.4 机器学习系统的类型
- 有监督学习
- 无监督学习
- 半监督学习
- 强化学习
- 批量学习
- 在线学习
- 基于实例的学习
- 基于模型的学习
- 1.5 机器学习的主要挑战
- 1.5.1 训练数据的数量不足
- 1.5.2 训练数据不具代表性
- 1.5.3 低质量数据
- 1.5.4 无关特征
- 1.5.5 过拟合训练数据
- 1.5.6 欠拟合训练数据
- 1.6 测试与验证
- 19问 - 答案
19问
在一切开始之前,可以看看以下十九个问题,如果能够回答上来,可以略过本章:(答案见最后)
1.如何定义机器学习?
2.机器学习在哪些问题上表现突出,你能给出四种类型吗?
3.什么是被标记的训练数据集?
4.最常见的两种监督学习任务是什么?
5.你能举出四种常见的无监督学习任务吗?
6.要让一个机器人在各种未知的地形中行走,你会使用什么类型的机器学习算法?
7.要将顾客分成多个组,你会使用什么类型的算法?
8.你会将垃圾邮件检测的问题列为监督学习还是无监督学习?
9.什么是在线学习系统?
10.什么是核外学习?
11.什么类型的学习算法依赖相似度来做出预测?
12.模型参数与学习算法的超参数之间有什么区别?
13.基于模型的学习算法搜索的是什么?它们最常使用的策略是什么?它们如何做出预测?
14.你能给出机器学习中的四个主要挑战吗?
15.如果模型在训练数据上表现很好,但是应用到新实例上的泛化结果却很糟糕,是怎么回事?能给出三种可能的解决方案吗?
16.什么是测试集,为什么要使用测试集?
17.验证集的目的是什么?
18.什么是train-dev集,什么时候需要它,怎么使用?
19.如果你用测试集来调超参数会出现什么错误?
答案见最后。
1.1 什么是机器学习
机器学习是一个研究领域,让计算机无须进行明确编程就具备学习能力。
更工程化的概念:一个计算机程序利用经验E来学习任务T,性能是P,如果针对任务T的性能P随着经验E不断增长,则称为机器学习。
1.2 为什么使用机器学习
机器学习的另一个亮点是善于处理对于传统方法而言太复杂或没有已知算法的问题。
机器学习适用于:
-
有解决方案(但解决方案需要进行大量人工微调或需要遵循大量规则)的问题:机器学习算法通常可以简化代码,相比传统方法有更好的性能。
-
传统方法难以解决的复杂问题:最好的机器学习技术也许可以找到解决方案。
-
环境有波动:机器学习算法可以适应新数据。
-
洞察复杂问题和大量数据。
1.4 机器学习系统的类型
是否在人类监督下训练(有监督学习、无监督学习、半监督学习和强化学习)。
是否可以动态地进行增量学习(在线学习和批量学习)。
是简单地将新的数据点和已知的数据点进行匹配,还是像科学家那样,对训练数据进行模式检测然后建立一个预测模型(基于实例的学习和基于模型的学习)。
这些标准之间互相并不排斥,你可以以你喜欢的方式将其任意组合。
例如,现在最先进的垃圾邮件过滤器可能是使用深度神经网络模型对垃圾邮件和常规邮件进行训练,完成动态学习。这使其成为一个在线的、基于模型的有监督学习系统。
有监督学习
在有监督学习中,提供给算法的包含所需解决方案的训练集称为标签。
分类任务是一个典型的有监督学习任务。
垃圾邮件过滤器就是一个很好的示例:通过大量的电子邮件示例及其所属的类别(垃圾邮件还是常规邮件)进行训练,然后学习如何对新邮件进行分类
另一个典型的任务是通过给定一组称为预测器的特征(里程、使用年限、品牌等)来预测一个目标数值(例如汽车的价格)。这种类型的任务称为回归。要训练这样一个系统,需要提供大量的汽车示例,包括它们的预测器和标签(即价格)。
在机器学习里,属性是一种数据类型(例如“里程”),而特征取决于上下文,可能有多个含义,但是通常状况下,特征意味着一个属性加上其值(例如,“里程=15 000”)。尽管如此,许多人还是在使用属性和特征这两个名词时不做区分。
这里是一些最重要的有监督学习算法(本书中会介绍):
-
k-近邻算法
-
线性回归
-
逻辑回归
-
支持向量机(SVM)
-
决策树和随机森林
-
神经网络
无监督学习
无监督学习的训练数据都是未经标记的。系统会在没有“老师”的情况下进行学习
这里有一些最重要地无监督学习算法(大部分会在第8章和第9章中介绍):
-
聚类算法
-
k-均值算法
-
DBSCAN
-
分层聚类分析(HCA)
-
异常检测和新颖性检测
-
单类SVM
-
孤立森林
-
可视化和降维
-
主成分分析(PCA)
-
核主成分分析
-
局部线性嵌入(LLE)
-
t-分布随机近邻嵌入(t-SNE)
-
关联规则学习
-
Apriori·Eclat
与之相关的一个任务是降维,降维的目的是在不丢失太多信息的前提下简化数据。方法之一是将多个相关特征合并为一个。
例如,汽车里程与其使用年限存在很大的相关性,所以降维算法会将它们合并成一个代表汽车磨损的特征。这个过程叫作特征提取
通常比较好的做法是,先使用降维算法减少训练数据的维度,再将其提供给另一个机器学习算法(例如有监督学习算法)。这会使它运行得更快,数据占用的磁盘空间和内存都会更小,在某些情况下,执行性能也会更高
另一个很重要地无监督任务是异常检测
例如,检测异常信用卡交易以防止欺诈,捕捉制造缺陷,或者在给另一种机器学习算法提供数据之前自动从数据集中移除异常值。
系统用正常实例进行训练,然后当看到新的实例时,它就可以判断出这个新实例看上去是正常还是异常
一个非常类似的任务是新颖性检测。它的目的是检测看起来与训练集中的所有实例不同的新实例。
这需要一个非常“干净”的训练集,没有你希望算法能检测到的任何实例。
例如,如果你有成千上万张狗的照片,其中1%是吉娃娃犬,那么一个新颖性检测算法不应将吉娃娃犬的新图片视为新颖。
另一方面,异常检测算法可能会认为这些狗非常罕见,与其他狗不同,可能会把它们归类为异常(没有对吉娃娃犬不敬的意思)
最后,还有一个常见地无监督任务是关联规则学习,其目的是挖掘大量数据,发现属性之间的有趣联系。
例如,假设你开了一家超市,在销售日志上运行关联规则之后发现买烧烤酱和薯片的人也倾向于购买牛排。那么,你可能会将这几样商品摆放得更近一些
半监督学习
由于通常给数据做标记是非常耗时和昂贵的,你往往会有很多未标记的数据而很少有已标记的数据。
有些算法可以处理部分已标记的数据。这被称为半监督学习
有些照片托管服务(例如Google相册)就是很好的示例。一旦你将所有的家庭照片上传到服务器后,它会自动识别出人物A出现在照片1、5和11中,人物B出现在照片2、5和7中。这是算法的无监督部分(聚类)。现在系统需要你做的只是告诉它这些人都是谁。给每个人一个标签之后,它就可以给每张照片中的每个人命名,这对于搜索图片非常重要。
大多数半监督学习算法是无监督算法和有监督算法的结合。
例如,深度信念网络(DBN)基于一种互相堆叠的无监督组件,这个组件叫作受限玻尔兹曼机(RBM)。受限玻尔兹曼机以无监督方式进行训练,然后使用有监督学习技术对整个系统进行微调。
强化学习
强化学习则是一个非常与众不同的“巨兽”。
它的学习系统(在其语境中称为智能体)能够观察环境,做出选择,执行动作,并获得回报(或者是以负面回报的形式获得惩罚)。
所以它必须自行学习什么是最好的策略,从而随着时间的推移获得最大的回报。策略代表智能体在特定情况下应该选择的动作。
例如,许多机器人通过强化学习算法来学习如何行走。DeepMind的AlphaGo项目也是一个强化学习的好示例。2017年5月,AlphaGo在围棋比赛中击败世界冠军柯洁而声名鹊起。通过分析数百万场比赛,然后自己跟自己下棋,它学到了制胜策略。要注意,在跟世界冠军对弈的时候,AlphaGo处于关闭学习状态,它只是应用它所学到的策略而已。
另一个给机器学习系统分类的标准是看系统是否可以从传入的数据流中进行增量学习。
批量学习
在批量学习中,系统无法进行增量学习——即必须使用所有可用数据进行训练。这需要大量时间和计算资源,所以通常都是离线完成的。
离线学习就是先训练系统,然后将其投入生产环境,这时学习过程停止,它只是将其所学到的应用出来。
如果希望批量学习系统学习新数据(例如新型垃圾邮件),需要在完整数据集(包括新数据和旧数据)的基础上重新训练系统的新版本,然后停用旧系统,
用新系统取而代之。幸运的是,整个训练、评估和启动机器学习系统的过程可以很轻易地实现自动化,所以即使是批量学习系统也能够适应变化。
只是需要不断地更新数据,并根据需要频繁地训练系统的新版本。
此外,使用完整数据集训练需要耗费大量的计算资源(CPU、内存空间、磁盘空间、磁盘I/O、网络I/O等)。
如果你的数据量非常大,并且每天从零开始自动执行训练系统,那最终你将为此花费大量的金钱。
而假如你面对的是海量数据,甚至可能无法再应用批量学习算法。
在线学习
在在线学习中,你可以循序渐进地给系统提供训练数据,逐步积累学习成果。
这种提供数据的方式可以是单独的,也可以采用小批量的小组数据来进行训练。
每一步学习都很快速并且便宜,这样系统就可以根据飞速写入的最新数据进行学习
对于这类系统——需要接收持续的数据流(例如股票价格),同时对数据流的变化做出快速或自主的反应,使用在线学习是一个非常好的方式。
如果你的计算资源有限,在线学习同样也是一个很好的选择:新的数据实例一旦经过在线学习系统的学习,就不再需要,你可以将其丢弃(除非你想回滚到前一个状态,再“重新学习”数据),这可以节省大量的空间。
对于超大数据集——超出一台计算机的主存储器的数据,在线学习算法也同样适用(这称为核外学习)。算法每次只加载部分数据,并针对这部分数据进行训练,然后不断重复这个过程,直到完成所有数据的训练。
核外学习通常是离线完成的(也就是不在实时(live)系统上),因此在线学习这个名字很容易让人产生误解。我们可以将其视为 增量学习 。
在线学习系统的一个重要参数是其适应不断变化的数据的速度,这就是所谓的学习率。
如果设置的学习率很高,那么系统将会迅速适应新数据,但同时也会很快忘记旧数据(你肯定不希望垃圾邮件过滤器只对最新显示的邮件进行标记)。反过来,如果学习率很低,系统会有更高的惰性,也就是说,学习会更缓慢,同时也会对新数据中的噪声或者非典型数据点(离群值)的序列更不敏感。
在线学习面临的一个重大挑战是,如果给系统输入不良数据,系统的性能将会逐渐下降。
现在某些实时系统的客户说不定已经注意到了这个现象。不良数据的来源可能是机器上发生故障的传感器,或者是有人对搜索引擎恶意刷屏以提高搜索结果排名等。为了降低这种风险,你需要密切监控系统,一旦检测到性能下降,就及时中断学习(可能还需要恢复到之前的工作状态)。
当然,同时你还需要监控输入数据,并对异常数据做出响应(例如,使用异常检测算法)。
另一种对机器学习系统进行分类的方法是看它们如何泛化。
大多数机器学习任务是要做出预测。这意味着系统需要通过给定的训练示例,在它此前并未见过的示例上进行预测(泛化)。
在训练数据上实现良好的性能指标固然重要,但是还不够充分。真正的目的是要在新的对象实例上表现出色。
泛化的主要方法有两种:基于实例的学习和基于模型的学习。
基于实例的学习
我们最司空见惯的学习方法就是简单地死记硬背。
如果以这种方式创建一个垃圾邮件过滤器,那么它可能只会标记那些与已被用户标记为垃圾邮件完全相同的邮件
这虽然不是最差的解决方案,但肯定也不是最好的。
除了完全相同的,你还可以通过编程让系统标记与已知的垃圾邮件非常相似的邮件。
这里需要两封邮件之间的相似度度量。一种(基本的)相似度度量方式是计算它们之间相同的单词数目。
如果一封新邮件与一封已知的垃圾邮件有许多单词相同,系统就可以将其标记为垃圾邮件。
这被称为基于实例的学习:系统用心学习这些示例,然后通过使用相似度度量来比较新实例和已经学习的实例(或它们的子集),从而泛化新实例。
基于模型的学习
从一组示例集中实现泛化的另一种方法是构建这些示例的模型,然后使用该模型进行预测。这称为基于模型的学习
举例来说,假设你想知道金钱是否让人感到快乐,你可以从经合组织(OECD)的网站上下载“幸福指数”的数据, 再从国际货币基金组织(IMF)的网站上找到人均GDP的统计数据,将数据并入表格,按照人均GDP排序,你会得到如表1-1所示的摘要。这里似乎有一个趋势!虽然数据包含噪声(即部分随机),但是仍然可以看出随着该国人均GDP的增加,生活满意度或多或少呈线性上升的趋势。所以你可以把生活满意度建模成一个关于人均GDP的线性函数。这个过程叫作 模型选择 。你为生活满意度选择了一个线性模型,该模型只有一个属性,就是人均GDP(见公式1-1)。这个模型有两个模型参数:θ0和θ1。通过调整这两个参数,可以用这个模型来代表任意线性函数,如图1-18所示。在使用模型之前,需要先定义参数θ0和θ1的值。怎么才能知道什么值可以使模型表现最佳呢?要回答这个问题,需要先确定怎么衡量模型的性能表现。要么定义一个效用函数(或适应度函数)来衡量模型有多好,要么定义一个成本函数来衡量模型有多差。对于线性回归问题,通常的选择是使用成本函数来衡量线性模型的预测与训练实例之间的差距,目的在于尽量使这个差距最小化。这正是线性回归算法的意义所在:通过你提供的训练样本,找出最符合提供数据的线性模型的参数,这称为 训练模型 。在这个案例中,算法找到的最优参数值为θ0=4.85和θ1=4.91×10-5。令人困惑的是,同一个词“模型”可以指模型的一种类型(例如,线性回归),到一个完全特定的模型架构(例如,有一个输入和一个输出的线性回归),或者到最后可用于预测的训练模型(例如,有一个输入和一个输出的线性回归,使用参数θ0=4.85和θ1=4.91×10-5)。
模型选择包括选择模型的类型和完全指定它的架构。训练一个模型意味着运行一种寻找模型参数的算法,使其最适合训练数据(希望能对新的数据做出好的预测)。
以下是这部分不成功的试验,输出为KeyError: ‘INEQUALITY’,以后有空了再来看看怎么修改。
# D:\Py-project\Python Learning\Hands-On Machine Learning\handson-ml2-master\datasets\lifesat\oecd_bli_2015.csv
# import as plt
# import numpy as np
# import pandas as pd
# import sklearn.linear_model
#
#
# def prepare_country_stats(oecd_bli, gdp_per_capita):
# oecd_bli = oecd_bli[oecd_bli["INEQUALITY"]=="TOT"]
# oecd_bli = oecd_bli.pivot(index="Country", columns="Indicator", values="Value")
# gdp_per_capita.rename(columns={"2015": "GDP per capita"}, inplace=True)
# gdp_per_capita.set_index("Country", inplace=True)
# full_country_stats = (left=oecd_bli, right=gdp_per_capita,
# left_index=True, right_index=True)
# full_country_stats.sort_values(by="GDP per capita", inplace=True)
# remove_indices = [0, 1, 6, 8, 33, 34, 35]
# keep_indices = list(set(range(36)) - set(remove_indices))
# return full_country_stats[["GDP per capita", 'Life satisfaction']].iloc[keep_indices]
# # Load the data
# oecd_bli = pd.read_csv("D:\Py-project\Python Learning\Hands-On Machine Learning\handson-ml2-master\datasets\lifesat\gdp_per_capita.csv",
# thousands=',', encoding='ISO-8859-1', on_bad_lines='skip')
# gdp_per_capita = pd.read_csv("D:\Py-project\Python Learning\Hands-On Machine Learning\handson-ml2-master\datasets\lifesat\oecd_bli_2015.csv",
# thousands=',', delimiter='\t', encoding='latin1', na_values="n/a")
# # Prepare the data
# country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)
# x = np.c_[country_stats["GDP per capita"]]
# y = np.c_[country_stats["Life satisfaction"]]
# # Visualize the data
# country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction')
# ()
# # Select a linear model
# model = sklearn.linear_model.LinearRegression()
# # Train the model
# (x, y)
# # Make a prediction for Cyprus
# x_new = [[22587]] # Cyprus's GDP per capita
# print((x_new)) # outputs [[ 5.96242338]]
# KeyError: 'INEQUALITY'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
简而言之:
研究数据。
选择模型。
使用训练数据进行训练(即前面学习算法搜索模型参数值,从而使成本函数最小化的过程)。
最后,应用模型对新示例进行预测(称为推断),希望模型的泛化结果不错。
以上就是一个典型的机器学习项目。
1.5 机器学习的主要挑战
由于你的主要任务是选择一种学习算法,并对某些数据进行训练,所以最可能出现的两个问题不外乎是“坏算法”和“坏数据”,让我们先从坏数据开始。
1.5.1 训练数据的数量不足
要教一个牙牙学语的小朋友什么是苹果,你只需要指着苹果说“苹果”(可能需要重复这个过程几次)就行了,然后孩子就能够识别各种颜色和形状的苹果了,
简直是天才!机器学习还没达到这一步,大部分机器学习算法需要大量的数据才能正常工作。即使是最简单的问题,很可能也需要成千上万个示例,
而对于诸如图像或语音识别等复杂问题,则可能需要数百万个示例(除非你可以重用现有模型的某些部分)。
对复杂问题而言,数据比算法更重要
这一想法被Peter Norvig等人进一步推广,于2009年发表论文“The Unreasonable Effectiveness of Data”。
不过需要指出的是,中小型数据集依然非常普遍,获得额外的训练数据并不总是一件轻而易举或物美价廉的事情,所以暂时先不要抛弃算法。
1.5.2 训练数据不具代表性
为了很好地实现泛化,至关重要的一点是对于将要泛化的新示例来说,训练数据一定要非常有代表性。无论使用的是基于实例的学习还是基于模型的学习
针对你想要泛化的案例使用具有代表性的训练集,这一点至关重要。不过说起来容易,做起来难:
如果样本集太小,将会出现采样噪声(即非代表性数据被选中);
而即便是非常大的样本数据,如果采样方式欠妥,也同样可能导致非代表性数据集,这就是所谓的采样偏差
1.5.3 低质量数据
显然,如果训练集满是错误、异常值和噪声(例如,低质量的测量产生的数据),系统将更难检测到底层模式,更不太可能表现良好。
所以花时间来清理训练数据是非常值得的投入。事实上,大多数数据科学家都会花费很大一部分时间来做这项工作。
如果某些实例明显是异常情况,那么直接将其丢弃,或者尝试手动修复错误,都会大有帮助。
如果某些实例缺少部分特征(例如,5%的顾客没有指定年龄),你必须决定是整体忽略这些特征、忽略这部分有缺失的实例、将缺失的值补充完整
(例如,填写年龄值的中位数),还是训练一个带这个特征的模型,再训练一个不带这个特征的模型。
1.5.4 无关特征
正如我们常说的:垃圾入,垃圾出。只有训练数据里包含足够多的相关特征以及较少的无关特征,系统才能够完成学习。
一个成功的机器学习项目,其关键部分是提取出一组好的用来训练的特征集。这个过程叫作 特征工程 ,包括以下几点:
-
特征选择(从现有特征中选择最有用的特征进行训练)。
-
特征提取(将现有特征进行整合,产生更有用的特征——正如前文提到的,降维算法可以提供帮助)。
-
通过收集新数据创建新特征。现在我们已经看了不少“坏数据”的示例,再来看几个“坏算法”的示例。
1.5.5 过拟合训练数据
假设你正在国外旅游,被出租车司机敲诈,你很可能会说,那个国家的所有出租车司机都是强盗。
过度概括是我们人类常做的事情,不幸的是,如果我们不小心,机器很可能也会陷入同样的陷阱。
在机器学习中,这称为过拟合,也就是指模型在训练数据上表现良好,但是泛化时却不尽如人意。
虽然诸如深度神经网络这类的复杂模型可以检测到数据中的微小模式,但是如果训练集本身是有噪声的,或者数据集太小(引入了采样噪声),
那么很可能会导致模型检测噪声本身的模式。很显然,这些模式不能泛化至新的实例。
举例来说,假设你给生活满意度模型提供了更多其他的属性,包括一些不具信息的属性(例如国家名)。在这种情况下,一个复杂模型可能会检测到这样的事实模式:训练数据中,名字中带有字母w的国家,如新西兰(New Zealand,生活满意度为7.3) 、挪威(Norway,生活满意度为7.4)、瑞典(Sweden,生活满意度为7.2)和瑞士(Switzerland,生活满意度为7.5),生活满意度均大于7。当把这个w满意度规则泛化到卢旺达(Rwanda)或津巴布韦(Zim-babwe)时,你对结果有多大的自信?
显然,训练数据中的这个模式仅仅是偶然产生的,但是模型无法判断这个模式是真实的还是噪声产生的结果。当模型相对于训练数据的数量和噪度都过于复杂时,会发生过拟合。可能的解决方案如下。
-
简化模型:可以选择较少参数的模型(例如,选择线性模型而不是高阶多项式模型)也可以减少训练数据中的属性数量,或者是约束模型。
- 通过约束模型使其更简单,并降低过拟合的风险,这个过程称为 正则化 。
- 应用正则化的程度可以通过一个超参数来控制。超参数是学习算法(不是模型)的参数。因此,它不受算法本身的影响。超参数必须在训练之前设置好,并且在训练期间保持不变。如果将正则化超参数设置为非常大的值,会得到一个几乎平坦的模型(斜率接近零)。
- 学习算法虽然肯定不会过拟合训练数据,但是也更加不可能找到一个好的解决方案。调整超参数是构建机器学习系统非常重要的组成部分。
- 通过约束模型使其更简单,并降低过拟合的风险,这个过程称为 正则化 。
-
收集更多的训练数据。
-
减少训练数据中的噪声(例如,修复数据错误和消除异常值)。
1.5.6 欠拟合训练数据
欠拟合和过拟合正好相反。它的产生通常是因为对于底层的数据结构来说,你的模型太过简单。例如,用线性模型来描述生活满意度就属于欠拟合。
现实情况远比模型复杂得多,所以即便是对于用来训练的示例,该模型产生的预测都一定是不准确的。解决这个问题的主要方式有:
-
选择一个带有更多参数、更强大的模型。
-
给学习算法提供更好的特征集(特征工程)。
-
减少模型中的约束(例如,减少正则化超参数)。
还有最后一个要讲的重要主题是:一旦训练了一个模型,你就不能只是“希望”它可以正确地对新的场景做出泛化,你还需要评估它,必要时做出一些调整。
现在我们看看怎么做到这一点。
1.6 测试与验证
了解一个模型对于新场景的泛化能力的唯一办法就是让模型真实地去处理新场景。做法之一是将其部署在生产环境中,然后监控它的输出。
这种做法不错,不过如果模型非常糟糕,你的用户就会抱怨,所以这显然不是最好的办法。更好的选择是将数据分割成两部分:训练集和测试集。
你可以用训练集的数据来训练模型,然后用测试集的数据来测试模型。应对新场景的误差率称为泛化误差(或者样例外误差),通过测试集来评估你的模型,就可以得到对这个误差的评估。这个估值可以告诉你模型在处理新场景时的能力如何。
如果训练误差很低(模型对于训练集来说很少出错),但是泛化误差很高,那么说明你的模型对于训练数据存在过拟合。
通常将80%的数据用于训练,而保持20%供测试用。但是,这取决于数据集的大小。
如果数据包含1000万个实例,那么保留1%意味着包含100 000个实例作为你的测试集,可能足以很好地估计泛化误差。
1996年David Wolpert在一篇著名论文中表明,如果你对数据绝对没有任何假设,那么就没有理由更偏好于某个模型,这称为没有免费的午餐(No Free Lunch,NFL)定理。对某些数据集来说,最佳模型是线性模型,而对于其他数据集来说,最佳模型可能是神经网络模型。不存在一个先验模型能保证一定工作得更好(这正是定理名称的由来)。
19问 - 答案
1.机器学习是关于构建可以从数据中学习的系统。学习意味着在一定的性能指标下,在某些任务上会变得越来越好。
2.机器学习非常适合没有算法解答的复杂问题,它可以替代一系列需要手动调整的规则,来构建适应不断变化的环境的系统并最终帮助人类(例如,数据挖掘)。
3.带标签的训练集是一个包含每个实例所需解决方案(也称为标签)的训练集。
4.两个最常见的有监督任务是回归和分类。
5.常见的无监督任务包括聚类、可视化、降维和关联规则学习。
6.如果我们想要机器人在各种未知的地形中学习行走,则强化学习可能会表现最好,因为这通常是强化学习要解决的典型问题。
也可以将强化学习问题表示为有监督学习或半监督学习问题,但这种情况不是很自然的想法。
7.如果你不知道如何定义组,则可以使用聚类算法(无监督学习)将客户划分为相似客户集群。
但是,如果你知道你想要拥有哪些组,那么可以将每个组的许多实例提供给分类算法(有监督学习),并将所有客户分类到这些组中。
8.垃圾邮件检测是一个典型的有监督学习问题:向该算法提供许多电子邮件及其标签(垃圾邮件或非垃圾邮件)。
9.与批量学习系统相反,在线学习系统能够进行增量学习。这使得它能够快速适应不断变化的数据和自动系统,并能够处理大量数据。
10.核外算法可以处理无法容纳在计算机主内存中的大量数据。核外学习算法将数据分成小批量,并使用在线学习技术从这些小批量数据中学习。
11.基于实例的学习系统努力通过死记硬背来学习训练数据。然后,当给定一个新的实例时,它将使用相似性度量来查找最相似的实例,并利用它们来进行预测。
12.一个模型具有一个或多个模型参数,这些参数确定在给定一个新实例的情况下该模型将预测什么(例如,线性模型的斜率)。
一种学习算法试图找到这些参数的最优值,以使该模型能很好地泛化到新实例。超参数是学习算法本身的参数,而不是模型的参数(例如,要应用正则化的数量)。
13.基于模型的学习算法搜索模型参数的最优值,以便模型可以很好地泛化到新实例。我们通常通过最小化成本函数来训练这样的系统,
该函数测量系统对训练数据进行预测时有多不准确,如果对模型进行了正则化则对模型复杂性要加上惩罚。为了进行预测,我们使用学习算法找到的模型参数值,
再将新实例的特征输入到模型的预测函数中。
14.机器学习中的一些主要挑战是数据的缺乏、数据质量差、数据的代表性不足、信息量不足、模型过于简单而欠拟合训练数据以及模型过于复杂而过拟合数据。
15.如果模型在训练数据上表现出色,但在新实例上的泛化效果很差,则该模型可能会过拟合训练数据(或者我们在训练数据上非常幸运)。
过拟合的可能解决方法是获取更多数据、简化模型(选择更简单的算法,减少使用的参数或特征的数量,或对模型进行正则化)或减少训练数据中的噪声。
16.测试数据集是用于在启动生产环境之前,估计模型在新实例上产生的泛化误差。
17.验证集是用于比较模型。这样就可以选择最佳模型并调整超参数。
18.当训练数据集与验证数据集和测试数据集中使用的数据之间不匹配时,可以使用train-dev集(该数据集应始终与模型投入生产环境后使用的数据尽可能接近)
train-dev集是训练集的一部分(模型未在其上训练过)。该模型在训练集的其他部分上进行训练,并在train dev集和验证集上进行评估。
如果模型在训练集上表现良好,但在train-dev集上表现不佳,则该模型可能过拟合训练集。如果它在训练集和train-dev集上均表现良好,
但在验证集上却表现不佳,那么训练数据与验证数据和测试数据之间可能存在明显的数据不匹配,你应该尝试改善训练数据,使其看起来更像验证数据和测试数据。
19.如果使用测试集来调整超参数,则可能会过拟合测试集,而且所测得的泛化误差会过于乐观(你可能会得到一个性能比预期差的模型)。