1.5 机器学习的主要挑战
简而言之,由于你的主要任务是选择一个模型并在一些数据上对其进行训练,因此可能出现问题的不外乎是“不良模型”和“不良数据”。让我们先从不良数据开始。
1.5.1 训练数据量不足
要让牙牙学语的孩子了解什么是苹果,你只需指着一个苹果说“苹果”(可能需要重复此过程很多次)就行了,然后孩子就能够识别出各种颜色和形状的苹果,简直是天才!
机器学习还没达到这一步,大多数机器学习算法需要大量数据才能正常工作。即使对于非常简单的问题,你通常也需要成千上万个样例,而对于图像或语音识别等复杂问题,你可能需要数百万个样例(除非你可以重用现有模型的某些部分)。
数据的不合理有效性
在2001年发表的一篇著名论文(https://homl.info/6)中,微软研究员Michele Banko和Eric Brill表明,给定足够的数据,截然不同的机器学习算法(包括相当简单的算法)在自然语言消歧[6]的复杂问题上表现几乎完全相同(如图1-21所示)。
图1-21:数据与算法的重要性[7]
正如作者所说:“这些结果表明我们可能需要重新思考如何在二者之间做权衡——将钱和时间花在算法开发上,还是花在语料库开发上”。
对复杂问题而言数据比算法更重要,这一想法被Peter Norvig等人进一步推广,于2009发表了题为“The Unreasonable Effectiveness of Data”(https://homl.info/7)的论文[8]。需要注意的是,中小型数据集仍然很普遍,获得额外的训练数据并不总是一件轻而易举或物美价廉的事情,所以暂时不要抛弃算法。
1.5.2 训练数据不具代表性
为了很好地实现泛化,训练数据必须能代表你想要泛化的新样例,这一点至关重要。
无论你使用基于实例的学习还是基于模型的学习,都是如此。
例如,你之前用于训练线性模型的国家数据集并不完全具有代表性,它不包含任何人均GDP低于23 500美元或高于62 500美元的国家。图1-22展示了添加这些国家信息之后的数据表现。
图1-22:更具代表性的训练样本
如果你在这个数据上训练一个线性模型,你会得到图1-22中的实线,旧模型用虚线表示。如你所见,添加了一些缺失的国家信息不仅显著地改变了模型,而且清楚地表明这种简单的线性模型可能永远不会那么准确。似乎非常富裕的国家并不比中等富裕国家更幸福(事实上,似乎稍微有点不幸福!),相反,一些贫穷国家似乎比许多富裕国家更幸福。
通过使用不具代表性的训练集,你训练了一个不太可能做出准确预测的模型,尤其是对于那些非常贫穷和非常富裕的国家。
使用代表你要泛化到的实例的训练集至关重要。不过说起来容易,做起来难:如果样本太小,那么会出现采样噪声(即非代表性数据被选中),但如果采样方法有缺陷,即使是非常大的样本也可能不具有代表性。这称为采样偏差。
采样偏差的示例
也许最著名的采样偏差示例发生在1936年美国总统大选期间,当时兰登与罗斯福展开较量:Literary Digest当时举行了一次非常大的民意调查,向大约1000万人发送邮件,并得到了240万个回复。因此做出了高度自信的预测——兰登将获得57%的选票。结果恰恰相反,罗斯福以62%的选票获胜。问题就在于Literary Digest的采样方法:
· 首先,为了获得民意调查的地址,Literary Digest使用了电话簿、杂志订阅名单、俱乐部会员名单等。而所有这些名单上的人往往都是更富裕的人,他们更有可能投票给共和党人(兰登)。
· 其次,只有不到25%的受访者做出了回答。这又一次引入了采样偏差,可能会排除不太关心政治的人、不喜欢Literary Digest的人和其他关键的群体。这是一种特殊类型的采样偏差,称为无反应偏差。
再举一个示例,假设你想建立一个系统来识别funk音乐视频。构建训练集的一种方法是在YouTube上搜索“funk music”并使用搜索到的视频。但这假定YouTube的搜索引擎返回一组代表YouTube上所有funk音乐视频的视频。实际上,搜索结果很可能偏向于流行艺术家(如果你住在巴西,你会看到很多“funk carioca”的视频,听起来一点也不像James Brown)。另外,你还能如何获得一个大型训练集?
1.5.3 低质量数据
显然,如果你的训练数据充满错误、异常值和噪声(例如,低质量的测量产生的数据),系统将更难检测到底层模式,也就更不太可能表现良好。花时间清洗训练数据通常是非常值得的。事实上,大多数数据科学家都会花费大量时间做这项工作。例如:
· 如果某些实例明显异常,则简单地丢弃它们或尝试手动修复错误可能会有所帮助。
· 如果某些实例缺少一些特征(例如,5%的客户没有说明自己的年龄),你必须决定是完全忽略此属性、忽略这些实例、将缺失值补充完整(例如,填写年龄的中位数),还是训练一个具有该特征的模型,再训练一个没有该特征的模型。
1.5.4 无关特征
俗话说:垃圾进,垃圾出。只有当训练数据包含足够多的相关特征并且没有太多无关特征时,系统才能够进行学习。机器学习项目成功的一个关键部分是提取出好的特征集来进行训练。这个过程称为特征工程,包括以下步骤:
· 特征选择(在现有特征中选择最有用的特征进行训练)。
· 特征提取(结合现有特征产生更有用的特征,正如我们之前看到的,降维算法可以提供帮助)。
· 通过收集新数据创建新特征。
现在我们已经看了不少不良数据的示例,下面来看几个不良算法的示例。
1.5.5 过拟合训练数据
假设你正在国外旅游,被出租车司机敲诈。你可能会说那个国家的所有出租车司机都是小偷。以偏概全是我们人类常做的事情,不幸的是,如果我们不小心,机器也会落入同样的陷阱。在机器学习中,这称为过拟合,也就是指该模型在训练数据上表现良好,但泛化效果不佳。
图1-23展示了严重过拟合训练数据的高阶多项式生活满意度模型。虽然它在训练数据上的表现比简单的线性模型好得多,但你真的相信它的预测吗?
图1-23:过拟合训练数据
虽然诸如深度神经网络这类的复杂模型可以检测数据中的细微模式,但如果训练集有噪声,或者数据集太小(引入了采样噪声),那么模型很可能会检测到噪声本身的模式(如出租车司机示例中那样)。显然,这些模式不会泛化到新实例。例如,假设你为生活满意度模型提供了更多属性,包括国家名称等无关属性。在这种情况下,一个复杂的模型可能会检测到一些模式,例如训练数据的名称中带有一个字母w的所有国家的生活满意度都大于7:新西兰(New Zealand,7.3)、挪威(Norway,7.6)、瑞典(Sweden,7.3)和瑞士(Switzerland,7.5)。你对w满意度规则泛化到卢旺达或津巴布韦有多大信心呢?显然,这种模式出现在训练数据中纯属偶然,但模型无法判断这种模式是真实的还是噪声产生的结果。
当模型相对于训练数据的数量和噪声过于复杂时,就会发生过拟合。以下是可能的解决方案:
· 通过选择参数较少的模型(例如,线性模型而不是高阶多项式模型)、减少训练数据中的属性数量或约束模型来简化模型。
· 收集更多训练数据。
· 减少训练数据中的噪声(例如,修复数据错误并移除异常值)。
通过约束模型使它更简单,并降低过拟合的风险,这个过程称为正则化。例如,我们之前定义的线性模型有两个参数:θ0和θ1。因此,该学习算法有两个自由度来调整模型使其适应训练数据,它可以调整直线的高度(θ0)和斜率(θ1)。如果我们强制θ1=0,该算法只有一个自由度,并且会更难正确地拟合数据:它所能做的就是向上或向下移动线以尽可能接近训练实例,所以它最终会在平均值附近。这确实是一个非常简单的模型!如果我们允许算法修改θ1,但强制它保持较小的值,那么该学习算法的自由度将在1到2之间。它生成的模型会比有两个自由度的模型更简单,但比只有一个自由度的模型要复杂一些。你希望在完美拟合训练数据和保持模型足够简单之间找到适当的平衡点,以确保模型能够较好地泛化。
图1-24展示了三种模型。点线表示在以圆形表示的国家(没有以正方形表示的国家)上训练的原始模型,实线是我们用所有国家(圆形和正方形)训练的第二个模型,虚线是用与第一个模型相同的数据训练的模型,但是有正则化约束。你可以看到正则化强制了模型的斜率较小:该模型与训练数据(圆形)的拟合不如第一个模型那么好,但它实际上可以更好地泛化到训练期间没看到过的新样例(正方形)。
图1-24:正则化降低了过拟合的风险
学习期间应用的正则化程度可以由超参数控制。超参数是学习算法(而非模型)的参数。因此,它不受学习算法本身的影响,必须在训练前设置并在训练期间保持不变。如果将正则化超参数设置得非常大,你将得到一个几乎平坦的模型(斜率接近于零)。学习算法虽然肯定不会过拟合训练数据,但也不太可能找到好的解决方案。调整超参数是构建机器学习系统的重要部分(你将在第2章中看到详细示例)。
1.5.6 欠拟合训练数据
你可能已经猜到了,欠拟合与过拟合正好相反:当模型太简单而无法学习数据的底层结构时,就会发生欠拟合。例如,生活满意度的线性模型容易出现欠拟合。因为现实情况总是比模型更复杂,所以它的预测必然是不准确的,即使是在训练样例上也是如此。
以下是解决此问题的主要方式:
· 选择具有更多参数的更强大的模型。
· 为学习算法提供更好的特征(特征工程)。
· 减少对模型的约束(例如通过减少正则化超参数)。
1.5.7 退后一步
到目前为止,你对机器学习有了一定了解。但是,我们介绍了太多的概念,你可能会感到有点迷茫,所以我们暂且退后一步,纵观一下全局:
· 机器学习是关于如何让机器更好地完成某些任务的理论,它从数据中学习而无须清晰地编写规则。
· 机器学习系统有许多类型:有监督和无监督,批量的和在线的,基于实例的和基于模型的。
· 在机器学习项目中,你从训练集中收集数据,然后将训练集提供给学习算法。如果该算法是基于模型的,它会调整一些参数以使模型拟合训练集(对训练集本身做出良好的预测),然后希望它也能够对新实例做出良好的预测。如果该算法是基于实例的,那么它会记住样例,并根据相似性度量将它们与学习过的实例进行比较,从而泛化到新实例。
· 如果训练集太小,或者数据不具有代表性、有噪声或被不相关的特征(垃圾进、垃圾出)污染,那么系统的表现不会很好。最后,你的模型既不能太简单(这种情况会导致欠拟合)也不能太复杂(这种情况会导致过拟合)。
还有最后一个要介绍的重要主题:一旦训练了一个模型,你就不能只是“希望”它泛化到新实例,你还需要评估它并在必要时对其进行微调。让我们看看如何做到这一点。