基本术语
数据集:dataset
样本:sample 特征:feature
学习:learning 训练:training
维数:dimensionality 学习器:learner
预测:prediction 标签:label
分类:classification 回归:regression

1.1 什么是机器学习?

机器学习是一个研究领域,让计算机不需要进行明确的编程就具备学习能力
机器学习作为多门学科(数学、统计、计算机等)的交叉领域,其主旨是以数据驱动的方式,在数据上通过算法总结规律模式,并将此应用在新数据上
工程化概念:一个计算机程序利用经验E来学习任务T,性能是P,如果针对任务T的性能随着经验E的增加而不断增长,则称为机器学习。
以菊花和玫瑰识别为例,我们介绍一下 T、E 以及 P 具体是什么?
● 任务 T:编写程序识别菊花和玫瑰
● 经验 E:大量的菊花和玫瑰图片
● 性能指标 P:不同机器学习算法的性能衡量指标不一样,最常见便是准确率
3. 应用

1.2为什么使用机器学习?

传统方法:
第一章: 机器学习概览 - 图1

机器学习方法:

第一章: 机器学习概览 - 图2

机器学习帮助人类学习:

第一章: 机器学习概览 - 图3

机器学习可以发现不引人关注的关联和趋势,帮助发现不明显的规律,这个叫数据挖掘。
机器学习适用于:

  • 有解决方案(但解决方案需要进行大量人工微调或需要遵循大量规则)的问题:机器学习算法通常可以简化代码,相比传统方法有更好的性能。
  • 传统方法难以解决的复杂问题:最好的机器学习技术也许可以找到解决方案。
  • 环境有波动:机器学习算法可以适应新数据。
  • 洞察复杂问题和大量数据。

1.3机器学习的应用举例

第一章: 机器学习概览 - 图4

1.4机器学习的类型

第一章: 机器学习概览 - 图5

通常根据以下标准对机器学习类型进行分类:

  • 是否在人类监督下训练(有监督学习,无监督学习,半监督学习和强化学习)。
  • 是否可以动态地进行增量学习(在线学习和批量学习)。
  • 是简单的将新数据和已知数据匹配还是像科学家一样,对训练数据进行模式检测然后建立一个预测模型(基于实例的学习和基于模型的学习)。

1.4.1有监督学习和无监督学习

有监督学习

有监督学习的主要目的是使用有类标的训练(training) 数据构建模型,我们可以使用训练得到的模型对未来数据进行预测。此处,术语监督(supervised) 是指训练数据集中的每个样本均有一个已知的结果(标签 label)。

在监督学习中,根据其预测目标我们又可以拆分为回归分类

  • 回归(Regression):标签是连续值
  • 分类(Classisification):标签是离散值

有监督学习中回归问题的一个实际例子:
预测目标汽车的价格,用过给出一些特征(里程数、车龄、品牌等等)称作预测值,来预测一辆汽车的价格。这类任务称作回归(图 1-6)。要训练这个系统,你需要给出大量汽车样本,包括它们的预测值和标签(即它们的价格)。

注解:在机器学习中,一个属性就是一个数据类型(例如,“里程数”),取决于具体问题一个特征会有多个含义,但通常是属性加上它的值(例如,“里程=15000”)。许多人是不区分地使用属性和特征。

回归.png

有监督学习中分类问题的一个实际例子:
一个典型的监督学习任务是分类。垃圾邮件过滤器就是一个很好的例子:用许多带有归类(垃圾邮件或普通邮件)的邮件样本进行训练,过滤器必须还能对新邮件进行分类。
垃圾邮件分类.png

有监督学习(Supervised Learning)常见算法:

  • k-近邻算法
  • 线性回归
  • 逻辑回归
  • 支持向量机(SVM)
  • 决策树和随机森林
  • 神经网络

生活中分类和回归算法例子:

  • 分类
    • 图像识别(人脸识别、物体识别等)
    • 垃圾邮件识别
    • 情感分析
  • 回归
    • 房价预测
    • 电影的票房

🔎 回归问题可以转换分类问题? :某种意义上是可以的,我们是对预测目标的定义进行转换,就可以将回归问题转换成分类。因为回归和分类问题最大的区别是,其预测目标值是离散还是连续的,但原本连续与离散就可以是比较模糊的。例如,逻辑回归通常用来进行分类,它可以生成一个归属某一类的可能性的值(例如,20% 几率为垃圾邮件)。

🔎 预测用户年龄是分类问题还是回归问题? :回归问题

无监督学习

在无监督学习中,我们将处理无类标数据或者是总体分布趋势不明朗的数据。通过无监督学习,我们可以在没有已知输出变量和反馈函数指导的情况下提取有效信息来探索数据的整体结构。

image.png

无监督学习(Unsupervised Learning)常见算法:

  • 聚类(Clustering)

K 均值
分层聚类分析(Hierarchical Cluster Analysis,HCA)
DBSCAN
期望最大值(Expectation-Maximization algorithm)通常作为牛顿迭代法(Newton-Raphson method)的替代

  • 异常检测和新颖性检测

单类SVM
孤立森林

  • 可视化和降维
    主成分分析(Principal Component Analysis,PCA)
    核主成分分析
    局部线性嵌入(Locally-Linear Embedding,LLE)
    t-分布邻域嵌入算法(t-distributed Stochastic Neighbor Embedding,t-SNE)
  • 关联性规则学习
    Apriori 算法
    Eclat 算法

生活中聚类算法例子:

  • 相似用户挖掘
  • 新闻发现

例如,假设你有一份关于你的博客访客的大量数据。你想运行一个聚类算法,检测相似访客的分组(图 1-8)。你不会告诉算法某个访客属于哪一类:它会自己找出关系,无需帮助。例如,算法可能注意到 40% 的访客是喜欢漫画书的男性,通常是晚上访问,20% 是科幻爱好者,他们是在周末访问等等。如果你使用层次聚类分析,它可能还会细分每个分组为更小的组。这可以帮助你为每个分组定位博文。

image.png

可视化算法也是极佳的非监督学习案例:给算法大量复杂的且不加标签的数据,算法输出数据的2D或3D图像(下图)。算法会试图保留数据的结构(即尝试保留输入的独立聚类,避免在图像中重叠),这样就可以明白数据是如何组织起来的,甚至识别出一些未知模式。

image.png

与此相关的任务之一是降维,无监督降维是数据特征预处理时常用的技术,用于清除数据中的噪声,它能够在最大程度保留相关信息的情况下,将数据压缩到一个维度较小的空间,但同时也可能降低某些算法在准确性方面的性能。降维的目的是在不能失去大部分信息的前提下简化数据。做法之一是合并若干相关的特征。例如,汽车的里程数与车龄高度相关,降维算法就会将它们合并成一个,表示汽车的磨损。这叫做特征提取,特征提取是特征工程当中的一个方法。

提示:在用训练集训练机器学习算法(比如有监督学习算法)时,最好对训练集进行降维。这样可以运行的更快,占用的硬盘和内存空间更少,性能也更好。

聚类降维.png

另一个重要的非监督任务是异常检测(anomaly detection) —— 例如,检测异常的信用卡转账以防欺诈,检测制造缺陷,或者在训练之前自动从训练数据集去除异常值。异常检测的系统使用正常值训练的,当它碰到一个新实例,它可以判断这个新实例是像正常值还是异常值。

image.png

最后,另一个常见的非监督任务是关联规则学习,它的目标是挖掘大量数据以发现属性间有趣的关系。例如,假设你拥有一个超市。在销售日志上运行关联规则,可能发现买了烧烤酱和薯片的人也会买牛排。因此,你可以将这些商品放在一起。

半监督学习

一些算法可以处理部分带标签的训练数据,通常是大量不带标签数据加上小部分带标签数据。这称作半监督学习(Semi-Supervised Learning)。
一些图片存储服务,比如 Google Photos,是半监督学习的好例子。一旦你上传了所有家庭相片,它就能自动识别相同的人 A 出现了相片 1、5、11 中,另一个人 B 出现在了相片 2、5、7 中。这是算法的非监督部分(聚类)。现在系统需要的就是你告诉这两个人是谁。只要给每个人一个标签,算法就可以命名每张照片中的每个人,特别适合搜索照片。

image.png

多数半监督学习算法是非监督和监督算法的结合。例如,深度信念网络(deep belief networks)是基于被称为互相叠加的受限玻尔兹曼机(restricted Boltzmann machines,RBM)的非监督组件。RBM 是先用非监督方法进行训练,再用监督学习方法进行整个系统微调。

三种学习方式(有监督学习,半监督学习和无监督学习)的演示对比
有监督学习 ,半监督学习和无监督学习的三种图示

强化学习

强化学习非常不同。它的学习系统在这里被称为智能体(agent),可以对环境进行观察,做出选择和执行动作,获得奖励(负面奖励则是惩罚,见下图)。然后它必须自己学习哪个是最佳策略(policy),以得到随时间推移的最大奖励。策略决定了智能体在给定情况下应该采取的动作,这是一个模拟智能人有趋利避害天性的系统。

image.png

例如,许多机器人运行强化学习算法以学习如何行走。DeepMind 的 AlphaGo 也是强化学习的例子:它在 2016 年三月击败了世界围棋冠军李世石(2017 年五月,AlphaGo 又击败了世界排名第一的柯洁)。它是通过分析数百万盘棋局学习制胜策略,然后自己和自己下棋。要注意,在比赛中机器学习是关闭的;AlphaGo 只是使用它学会的策略。

强化学习奖惩机制.png

1.4.2批量和在线学习

另一个用来分类机器学习的准则是,它是否能从导入的数据流进行持续学习。

批量学习(离线学习)

在批量学习中,系统不能进行持续增量学习:必须用所有可用数据进行训练。这通常会占用大量时间和计算资源,所以一般是离线做的。离线学习就是先训练系统,然后部署在生产环境且停止学习,它只是使用已经学到的策略。这称为离线学习
如果你想让一个批量学习系统学习新数据(例如垃圾邮件的新类型),就需要从头训练一个新版本,使用全部数据集(不仅有新数据也有老数据),然后停掉老系统,换上新系统。
这个方法很简单,通常可以满足需求,但是用全部数据集进行训练会花费大量时间,所以一般是每 24 小时或每周训练一个新系统。如果系统需要快速适应变化的数据(比如,预测股价变化),就需要一个响应更及时的方案。

在线学习

在在线学习中,是循序渐进地进行训练,逐步积累学习成果。可以一次一个或一次几个数据集(称为小批量)来进行训练。每个学习步骤都很快速且容易。所以系统可以动态地学习新数据。

在线学习流程:
第一章: 机器学习概览 - 图17

对于需要接收连续的数据流的系统(比如,股票价格),且需要自动对改变作出调整。如果计算资源有限,在线学习是一个不错的方案:一旦在线学习系统学习了新的数据实例,不再需要这些数据了。就可以扔掉这些数据(除非你想回到之前的状态,再次使用数据)。这样可以节省大量的空间。

面对机器的内存存不下的超大量数据集时,也可以用在线学习来训练系统(这称作核外学习,out-of-core learning)。算法每次只加载部分的数据,用这些数据进行训练,重复这个过程,直到用所有数据都进行了训练

核外学习整个过程通常是离线完成的(即,不在实时的系统上),所以在线学习这个名字会让人误解。可以把它当成持续增量学习。

第一章: 机器学习概览 - 图18

在线学习系统的一个重要参数是,它对不断变化的数据的适应速度:这就是学习率。如果设置的学习率过高,系统就可以快速适应新数据,但是也会快速忘记旧数据(你肯定不想让垃圾邮件过滤器只标记最新的垃圾邮件种类)。相反的,如果你设定的学习率很低,系统的惰性就会强:即,它学的很慢,但对新数据中的噪声或非典型数据点(离群值)不那么敏感。
在线学习面临的挑战之一是,如果不好的数据被用来进行训练,系统的性能就会逐渐下滑。如果这是一个实时响应的系统,用户就会注意到。例如,不好的数据可能来自失灵的传感器,或有人向搜索引擎传入垃圾信息以提高搜索排名。要减小这种风险,你需要密集监测,如果检测到性能下降,要快速中止(或是恢复到一个之前的状态)。你可能还要监测输入数据,对异常数据做出反应(比如,使用异常检测算法)。

1.4.3基于实例 vs 基于模型学习

另一种分类机器学习的方法是它们是如何进行泛化的。大多机器学习任务是做预测的。这意味着给定一定数量的训练样本,系统需要能对到之前没见到过的数据样本进行预测。对训练数据集有很好的性能还不够,真正的目标是对新实例预测的性能。

有两种主要的归纳方法:基于实例学习和基于模型学习。

基于实例学习

也许最简单的学习形式就是用记忆学习。如果用这种方法做一个垃圾邮件检测器,只需标记所有和用户标记的垃圾邮件相同的邮件 —— 这个方法不差,但肯定不是最好的。

不仅能标记和已知的垃圾邮件相同的邮件,你的垃圾邮件过滤器也要能标记类似垃圾邮件的邮件。这就需要测量两封邮件的相似性。一个(基本的)相似度测量方法是统计两封邮件包含的相同单词的数量。如果一封邮件含有许多垃圾邮件中的词,就会被标记为垃圾邮件。

这被称作基于实例学习:系统先用记忆学习案例,然后使用相似度测量推广到新的例子,例如:下图中新的实例被归为三角形。

image.png

基于模型学习

另一种从样本集进行归纳的方法是建立这些样本的模型,然后使用这个模型进行预测。这称作基于模型学习

image.png

例如,你想知道钱是否能让人快乐,你从 OECD 网站下载了 Better Life Index 指数数据,还从 IMF 下载了人均 GDP 数据。下表展示了摘要。

表 : 钱会使人幸福吗?

国家 人均GDP(美元) 生活满意度
匈牙利 12240 4.9
韩国 27195 5.8
法国 37675 6.5
澳大利亚 50962 7.3
美国 55805 7.2

用上表的数据画图

image.png

你看到趋势了吗?
确实能看到趋势!尽管数据有噪声(即,部分随机),看起来生活满意度是随着人均 GDP 的增长线性提高的。所以,你决定生活满意度建模为人均 GDP 的线性函数。这一步称作模型选择:你选一个生活满意度的线性模型,只有一个属性,人均 GDP(公式 1-1)。

image.png

这个模型有两个参数第一章: 机器学习概览 - 图23第一章: 机器学习概览 - 图24。通过调整这两个参数,你可以使你的模型表示任意线性函数,见图。

image.png


在使用模型之前,你需要确定两个参数第一章: 机器学习概览 - 图26第一章: 机器学习概览 - 图27的值。如何能知道哪个值可以使模型的性能最佳呢?要回答这个问题,你需要确定如何衡量模型的性能。你可以定义一个效用函数(或拟合函数)用来衡量模型是否够好,或者你可以定义一个代价函数来测量模型有多差。对于线性回归问题,人们一般是用代价函数测量线性模型的预测值和训练样本的距离差,目标是使距离差最小。
接下来就是线性回归算法,你用训练样本训练算法,算法找到使线性模型最拟合数据的参数。这称作训练模型。在我们的例子中,算法得到的最优参数值是:第一章: 机器学习概览 - 图28=4.85和第一章: 机器学习概览 - 图29=4.91x第一章: 机器学习概览 - 图30

现在模型已经最紧密地拟合到训练数据了,见图 。

image.png

最后,可以准备运行模型进行预测了。例如,假如你想知道塞浦路斯人有多幸福,但 OECD 没有它的数据。幸运的是,你可以用模型进行预测:查询塞浦路斯的人均 GDP,为 22587 美元,然后应用模型得到生活满意度,后者的值在4.85 + 22,587 × 4.91 ×第一章: 机器学习概览 - 图32= 5.96

通过Python代码实现:

  1. import matplotlib
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. import pandas as pd
  5. import sklearn
  6. # 加载数据
  7. oecd_bli = pd.read_csv("oecd_bli_2015.csv", thousands=',')
  8. gdp_per_capita = pd.read_csv("gdp_per_capita.csv",thousands=',',delimiter='\t',
  9. encoding='latin1', na_values="n/a")
  10. # 准备数据
  11. country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)
  12. X = np.c_[country_stats["GDP per capita"]]
  13. y = np.c_[country_stats["Life satisfaction"]]
  14. # 可视化数据
  15. country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction')
  16. plt.show()
  17. # 选择线性模型
  18. lin_reg_model = sklearn.linear_model.LinearRegression()
  19. # 训练模型
  20. lin_reg_model.fit(X, y)
  21. # 对塞浦路斯进行预测
  22. X_new = [[22587]] # 塞浦路斯的人均GDP
  23. print(lin_reg_model.predict(X_new)) # outputs [[ 5.96242338]]

注:如果你之前接触过基于实例学习算法,你会发现斯洛文尼亚的人均 GDP(20732 美元)和塞浦路斯差距很小,OECD 数据上斯洛文尼亚的生活满意度是 5.7,就可以预测塞浦路斯的生活满意度也是 5.7。如果放大一下范围,看一下接下来两个临近的国家,你会发现葡萄牙和西班牙的生活满意度分别是 5.1 和 6.5。对这三个值进行平均得到 5.77,就和基于模型的预测值很接近。这个简单的算法叫做k近邻回归(这个例子中,k=3)。

在前面的代码中替换线性回归模型为 K 近邻模型,只需更换下面一行:

下面这行代码:

  1. model = sklearn.linear_model.LinearRegression()

替换为:

  1. model = sklearn.neighbors.KNeighborsRegressor(n_neighbors=3)

如果一切顺利,你的模型就可以作出好的预测。如果不能,你可能需要使用更多的属性(就业率、健康、空气污染等等),获取更多更好的训练数据,或选择一个更好的模型(比如多项式回归模型)。

总结一下:

  • 研究数据
  • 选择模型
  • 用训练数据进行训练(即,学习算法搜寻模型参数值,使代价函数最小,例如梯度下降法)
  • 最后,使用模型对新案例进行预测(这称作推断),但愿这个模型泛化效果不差

这就是一个典型的机器学习项目。在第 2 章中,你会第一手地接触一个完整的项目。

我们已经学习了许多关于基础的内容:你现在知道了机器学习是关于什么的,为什么它这么有用,最常见的机器学习的分类,典型的项目工作流程。现在,让我们看一看学习中会出现那些问题,导致不能做出准确的预测。

1.5机器学习的主要挑战

简而言之,因为你的主要任务是选择一个学习算法并用一些数据进行训练,会导致错误的两件事就是“错误的算法”和“错误的数据”。我们从错误的数据开始。

1.5.1训练数据量不足

要让一个蹒跚学步的孩子知道什么是苹果,需要做的就是指着一个苹果说“苹果”(可能需要重复这个过程几次)。现在这个孩子就能认识所有形状和颜色的苹果。真是个天才!

机器学习还达不到这个程度;需要大量数据,才能让多数机器学习算法正常工作。即便对于非常简单的问题,一般也需要成千上万个样本数据,对于复杂的问题,比如图像或语音识别,你可能需要数百万个样本(除非你能重复使用部分存在的模型)。

数据不合理的有效性

在一篇 2001 年发表的著名论文中,微软研究员 Michele Banko 和 Eric Brill 展示了不同的机器学习算法,包括非常简单的算法,一旦有了大量数据进行训练,在进行去除语言歧义的测试中几乎有相同的性能(见图 )。

image.png

论文作者说:“结果说明,我们可能需要重新考虑在算法开发 vs 语料库发展上花费时间和金钱的取舍。”

对于复杂问题,数据比算法更重要的主张在 2009 年由 Norvig 发表的论文《The Unreasonable Effectiveness of Data》得到了进一步的推广。但是,应该注意到,小型和中型的数据集仍然是非常常见的,获得额外的训练数据并不总是轻易和廉价的,所以不要抛弃算法。

1.5.2没有代表性的训练数据

为了更好地进行泛化,让训练数据对新数据具有代表性是非常重要的。无论你用的是基于实例学习或基于模型学习,这点都很重要。

例如,我们之前用来训练线性模型的国家集合不够具有代表性:缺少了一些国家。下图展示了添加这些缺失国家之后的数据。

image.png

如果你用这份数据训练线性模型,得到的是实线,旧模型用虚线表示。可以看到,添加几个国家不仅可以显著地改变模型,它还说明如此简单的线性模型可能永远不会达到很好的性能。貌似非常富裕的国家没有中等富裕的国家快乐(事实上,非常富裕的国家看起来更不快乐),相反的,一些贫穷的国家看上去比富裕的国家还幸福。

使用了没有代表性的数据集,我们训练了一个不可能得到准确预测的模型,特别是对于非常贫穷和非常富裕的国家。

使用具有代表性的训练集对于推广到新案例是非常重要的。但是做起来比说起来要难:如果样本太小,就会有样本噪声(即,会有一定概率包含没有代表性的数据),但是即使是非常大的样本也可能没有代表性,如果取样方法错误的话。这叫做样本偏差

一个样本偏差的著名案例

样本偏差最有名的案例发生在 1936 年兰登和罗斯福的美国大选:《文学文摘》做了一个非常大的民调,给 1000 万人邮寄了调查信。得到了 240 万回信,非常有信心地预测兰登会以 57% 赢得大选。然而,罗斯福赢得了 62% 的选票。错误发生在《文学文摘》的取样方法:

  • 首先,为了获取发信地址,《文学文摘》使用了电话黄页、杂志订阅用户、俱乐部会员等相似的列表。所有这些列表都偏向于富裕人群,他们都倾向于投票给共和党(即兰登)。
  • 第二,只有 25% 的回答了调研。这就又一次引入了样本偏差,它排除了不关心政治的人、不喜欢《文学文摘》的人,和其它关键人群。这种特殊的样本偏差称作无应答偏差。

下面是另一个例子:假如你想创建一个能识别Funk音乐(Funk Music, 别名骚乐)视频的系统。建立训练集的方法之一是在 YouTube 上搜索“Funk Music”,使用搜索到的视频。但是这样就假定了 YouTube 的搜索引擎返回的视频集,是对 YouTube 上的所有Funk音乐有代表性的。事实上,搜索结果会偏向于人们歌手(如果你居住在巴西,你会得到许多“funk carioca”视频,它们和 James Brown 的截然不同)。从另一方面来讲,你怎么得到一个大的训练集呢?

1.5.3低质量数据

很明显,如果训练集中的错误、异常值和噪声太多(低质量测量方法引入的),系统检测出潜在规律的难度就会变大,性能就会降低。因此花费时间对训练数据进行清理是十分重要的。事实上,大多数据科学家的一大部分时间是做数据清洗工作的。例如:

  • 如果一些实例是明显的异常值,最好删掉它们或尝试手动修改错误数据;
  • 如果一些实例缺少特征(比如,你的 5% 的顾客没有说明年龄),你必须决定是否忽略这个特征、忽略这些实例、填入缺失值(比如,年龄中位数),或者训练一个含有这个特征的模型和一个不含有这个特征的模型,等等。

    1.5.4不相关的特征

计算机界有一个很有名的说法,叫”garbage in, garbage out” 。你的系统只有在训练数据包含足够相关特征、以及非相关特征不多的情况下,才能进行学习。机器学习项目成功的关键之一是用好的特征进行训练。这个过程称作特征工程,包括:

  • 特征选择:在所有存在的特征中选取最有用的特征进行训练。
  • 特征提取:组合存在的特征,生成一个更有用的特征(如前面看到的,可以使用降维算法)。
  • 收集新数据创建新特征。

现在,我们已经看过了许多坏数据的例子,接下来看几个坏算法的例子。

1.5.5过拟合训练数据

如果你在外国游玩打车的时候,当地的出租车司机绕路多收了你的钱。你可能会说这个国家所有的出租车司机都是小偷。过度归纳是我们人类经常做的,如果我们不小心,机器也会犯同样的错误。在机器学习中,这称作过拟合:意思是说,模型在训练数据上表现很好,但是在预测数据上做的不好。

下图展示了一个用高阶多项式回归模型拟合的生活满意度项目,它大大过拟合了训练数据。即使它比简单线性模型在训练数据上表现更好,但是你会相信它的预测结果吗?

image.png

复杂的模型,比如深度神经网络,可以检测数据中的细微规律,但是如果训练集有噪声,或者训练集太小(太小会引入样本噪声),模型就会去检测噪声本身的规律。很明显,这些规律不能推广到新实例。例如,假如你用更多的特征来训练生活满意度模型,包括不包含信息的属性,比如国家的名字。如此一来,负责的模型可能会检测出训练集中名字有 w 字母的国家的生活满意度大于 7:新西兰(7.3),挪威(7.4),瑞典(7.2)和瑞士(7.5)。你能相信这个 W-满意度法则推广到卢旺达和津巴布韦吗?很明显,这个规律只是训练集数据中偶然出现的,但是模型不能判断这个规律是真实的、还是噪声的结果。

警告:过拟合发生在相对于训练数据的量和噪声,模型过于复杂的情况。可能的解决方案有:

  • 简化模型,可以通过选择一个参数更少的模型(比如使用低阶的线性模型,而不是高阶多项式模型)、减少训练数据的特征数、或约束模型。
  • 收集更多的训练数据
  • 减小训练数据的噪声(比如,修改数据错误和去除异常值)

限定一个模型以让它更简单,降低过拟合的风险被称作正则化(regularization)。例如,我们之前定义的线性模型有两个参数:第一章: 机器学习概览 - 图36第一章: 机器学习概览 - 图37。它给了学习算法两个自由度让模型适应训练数据:可以调整截距第一章: 机器学习概览 - 图38和斜率第一章: 机器学习概览 - 图39。如果强制第一章: 机器学习概览 - 图40=0,算法就只剩一个自由度,拟合数据就会更为困难:能做的只是将在线下移动,尽可能地靠近训练实例,结果会在平均值附近。这就是一个非常简单的模型!如果我们允许算法可以修改第一章: 机器学习概览 - 图41,但是只能在一个很小的范围内修改,算法的自由度就会介于 1 和 2 之间。它要比两个自由度的模型简单,比 1 个自由度的模型要复杂。你的目标是在完美拟合数据和保持模型简单上寻找平衡,确保算法的泛化效果。

下图展示了三个模型:虚线表示用缺失部分国家的数据训练的原始模型,红色短划线是我们用所有国家训练的第二个模型,实线模型的训练数据和第一个相同,但进行了正则化限制。你可以看到正则化强制模型有一个小的斜率,它对训练数据的拟合不是那么好,但是对新样本的推广效果好。

image.png

正则化的度可以用一个超参数(hyperparameter)控制。超参数是一个学习算法的参数(而不是模型的)。这样,它是不会被学习算法本身影响的,它优于训练,在训练中是保持不变的。如果你设定的超参数非常大,就会得到一个几乎是平的模型(斜率接近于 0);这种学习算法几乎肯定不会过拟合训练数据,但是也很难得到一个好的解。调节超参数是创建机器学习算法非常重要的一部分(下一章你会看到一个详细的例子)。

1.5.6欠拟合训练数据

欠拟合是和过拟合相对的:当你的模型过于简单时就会发生。例如,生活满意度的线性模型倾向于欠拟合;现实要比这个模型复杂的多,所以预测很难准确,即使在训练样本上也很难准确。
解决这个问题的选项包括:

  • 选择一个更强大的模型,带有更多参数
  • 用更好的特征训练学习算法(特征工程)
  • 减小对模型的限制(比如,减小正则化超参数)

1.5.7总结回顾

现在,你已经知道了很多关于机器学习的知识。然而,学过了这么多概念,你可能会感到有些迷失,所以让我们总结回顾一下重要的部分:

  • 机器学习是让机器通过学习数据对某些任务做得更好,而不使用确定的代码规则。
  • 有许多不同类型的机器学习系统:有监督或非监督,批量或在线,基于实例或基于模型,等等。
  • 在机器学习项目中,我们从训练集中收集数据,然后对学习算法进行训练。如果算法是基于模型的,就调节一些参数,让模型拟合到训练集(即,对训练集本身作出好的预测),然后希望它对新样本也能有好预测。如果算法是基于实例的,就是用记忆学习样本,然后用相似度推广到新实例。
  • 如果训练集太小、数据没有代表性、含有噪声、或掺有不相关的特征(垃圾进,垃圾出),系统的性能不会好。最后,模型不能太简单(会发生欠拟合)或太复杂(会发生过拟合)。

还差最后一个主题要学习:训练完了一个模型,你不只希望将它推广到新样本。如果你想评估它,那么还需要作出必要的微调。一起来看一看。

1.6测试和验证

要知道一个模型推广到新样本的效果,唯一的办法就是真正的进行试验。一种方法是将模型部署到生产环境,监控它的输出性能。这么做可以,但是如果模型的性能很差,就会引起用户抱怨 —— 这不是最好的方法。

更好的选项是将你的数据分成两个集合:训练集和测试集。正如它们的名字,用训练集进行训练,用测试集进行测试。对新样本的误差率称作泛化误差(或样本外误差),通过模型对测试集的评估,你可以预估这个错误。这个值可以告诉你,你的模型对新样本的性能如何。

如果训练误差率低(即,你的模型在训练集上错误不多),但是推广误差率高,意味着模型对训练数据过拟合。

提示:一般使用 80% 的数据进行训练,保留20%用于测试。

1.6.1超参数调整和模型选择

因此,评估一个模型很简单:只要使用测试集。现在假设你在两个模型之间犹豫不决(比如一个线性模型和一个多项式模型):如何做决定呢?一种方法是两个都训练,,然后比较在测试集上的效果。

现在假设线性模型的效果更好,但是你想做一些正则化以避免过拟合。问题是:如何选择正则化超参数的值?一种选项是用 100 个不同的超参数训练100个不同的模型。假设你发现最佳的超参数的泛化误差率最低,比如只有 5%。然后就选用这个模型作为生产环境,但是实际中性能不佳,误差率达到了 15%。发生了什么呢?

答案在于,你在测试集上多次测量了推广误差率,调整了模型和超参数,以使模型最适合这个集合,也就是过拟合。这意味着模型对新数据的性能不会高。

这个问题通常的解决方案是,再保留一个集合,称作验证集,或者叫开发集(dev set)。用测试集和多个超参数训练多个模型,选择在验证集上有最佳性能的模型和超参数。当你对模型满意时,用测试集再做最后一次测试,以得到泛化误差率的预估。

为了避免“浪费”过多训练数据在验证集上,通常的办法是使用K折交叉验证(K fold):训练集分成互补的子集,每个模型用不同的子集训练,再用剩下的子集验证。一旦确定模型类型和超参数,最终的模型使用这些超参数和全部的训练集进行训练,用测试集得到泛化误差率。

1.6.2数据不匹配

在某些情况下,和容易获得大量训练数据,但是这些数据不能完全代表将用于生产环境的数据。
比如:假设你要创建一个手机APP来拍摄花朵并自动确定花朵的种类。你可以在网络上轻松下载数以百万计的花朵图片,但是这些网络上下载的图不能完全代表用户在移动设备上使用APP拍摄的图。这种情况,最重要的规则是:验证集和测试集必须在实际环境中使用具有相同代表性的数据,因此应该用专用代表性的图片所组成,你可以将其混洗然后一半放入测试集,一半放入训练集。但是在网络图片上训练模型之后,如果模型在验证集上的性能让人失望,你不知道是模型过拟合的原因还是因为网络图片与APP拍摄的图片之间不匹配。

机器学习算法的基本假设:在特征空间上距离接近的样本,他们属于同一个类别的概率会更高。

这里需要我们有 2 点认知:

  • 不对特征空间的先验分布进行假设,所有算法表现都是一样的
  • 机器学习的本质是在有限的已知数据上,通过复杂的高维特征空间,预测未知的样本

没有免费午餐公理

模型是观察的简化版本。简化意味着舍弃无法进行泛化的表面细节。但是,要确定舍弃什么数据、保留什么数据,必须要做假设。例如,线性模型的假设是数据基本上是线性的,实例和模型直线间的距离只是噪音,可以放心忽略。

在一篇 1996 年的著名论文中,David Wolpert 证明,如果完全不对数据做假设,就没有理由选择一个模型而不选另一个。这称作没有免费午餐(No Free Lunch)公理。对于一些数据集,最佳模型是线性模型,而对其它数据集是神经网络。没有一个模型可以保证效果更好(如这个公理的名字所示)。确信的唯一方法就是测试所有的模型。因为这是不可能的,实际中就必须要做一些对数据合理的假设,只评估几个合理的模型。例如,对于简单任务,你可能是用不同程度的正则化评估线性模型,对于复杂问题,你可能要评估几个神经网络模型。

1.7练习

本章中,我们学习了一些机器学习中最为重要的概念。下一章,我们会更加深入,并写一些代码。开始下章之前,确保你能回答下面的问题:

  1. 如何定义机器学习?
  2. 机器学习可以解决哪四类问题?
  3. 什么是带标签的训练集?
  4. 最常见的两种监督学习是什么?
  5. 指出四个常见的无监督学习?
  6. 要让一个机器人能在各种未知地形行走,你会采用什么类型的机器学习算法?
  7. 要对你的顾客进行分个组,你会采用哪类算法?
  8. 垃圾邮件检测是有监督学习问题,还是无监督学习问题?
  9. 什么是在线学习系统?
  10. 什么是核外学习?
  11. 什么学习算法是用相似度做预测?
  12. 模型参数和学习算法的超参数的区别是什么?
  13. 基于模型学习的算法搜寻的是什么?最成功的策略是什么?基于模型学习如何做预测?
  14. 机器学习的四个主要挑战是什么?
  15. 如果模型在训练集上表现好,但推广到新实例表现差,问题是什么?给出三个可能的解决方案。
  16. 什么是测试集,为什么要使用它?
  17. 验证集的目的是什么?
  18. 如果用测试集调节超参数,会发生什么?
  19. 什么是交叉验证,为什么它比验证集好?