导读:让我们看看你在学习过程中可能会遇到哪些问题,阻碍你做出准确的预测。
简单来说,由于你的主要任务是选择一种学习算法,并对某些数据进行训练,所以最可能出现的两个问题不外乎是坏算法和坏数据。
作者:奥雷利安·杰龙(Aurélien Géron)
本文摘编自《机器学习实战:基于Scikit-Learn和TensorFlow》,如需转载请联系我们
01 坏数据
让我们先从坏数据开始。
1. 训练数据的数量不足
要教一个牙牙学语的小朋友什么是苹果,你只需要指着苹果说“苹果”(可能需要重复这个过程几次)就行了,然后孩子们就能够识别各种颜色和形状的苹果了,简直是天才!
机器学习还没有到这一步,大部分机器学习算法需要大量的数据才能正常工作。即使是最简单的问题,很可能也需要成千上万个示例,而对于诸如图像或语音识别等复杂问题,则可能需要上千万的示例(除非你可以重用现有模型的某些部分)。
在2001年发表的一篇著名论文中,微软研究员 Michele Banko 和 Eric Brill 表明,截然不同的机器学习算法,包括相当简单的算法,在自然语言歧义消除这个复杂问题上,表现几乎完全一致(如图1-20所示)。
▲图1-20 数据对算法的重要性
正如作者所说:“这些结果表明,我们可能会重新思考如何在二者之间做权衡——将钱和时间花在算法的开发上,还是花在语料库的建设上。”
对复杂问题而言,数据比算法更重要,这一想法被Peter Norvig等人进一步推广,于2009年发表论文《数据的不合理有效性》。不过需要指出的是,中小型数据集依然非常普遍,获得额外的训练数据并不总是一件轻而易举或价廉物美的事情,所以暂时先不要抛弃算法。
2. 训练数据不具代表性
为了很好地实现泛化,至关重要的一点是,对于将要泛化的新示例来说,训练数据一定要非常有代表性。不论你使用的是基于实例的学习还是基于模型的学习,都是如此。
例如,前面我们用来训练线性模型的国家数据集并不具备完全的代表性,有部分国家的数据缺失。图1-21显示了补上缺失国家/地区信息之后的数据表现。
▲图1-21 一个更具代表性的训练样例
如果你用这个数据集训练线性模型,将会得到图中的实线,而虚线表示旧模型。正如你所见,添加部分缺失的国家信息,不仅显著地改变了模型,也更清楚地说明,这种线性模型可能永远不会有多准确。
看起来,某些非常富裕的国家并不比中等富裕国家幸福(事实上,看起来甚至是不幸福),反之,一些贫穷的国家也似乎比许多富国更加快乐。
使用不具代表性的训练集训练出来的模型不可能做出准确的预估,尤其是针对那些特别贫穷或特别富裕的国家。
针对你想要泛化的案例使用具有代表性的训练集,这一点至关重要。不过说起来容易,做起来难:如果样本集太小,将会出现采样噪声(即非代表性数据被选中);而即便是非常大的样本数据,如果采样方式欠妥,也同样可能导致非代表性数据集,这就是所谓的采样偏差。
最著名的采样偏差的案例,应该是发生在1936年美国总统大选期间,兰登对决罗斯福。《文学摘要》当时举行了一次非常大范围的民意调查,向约1000万人发送了邮件,并得到了240万个回复,因此做出了高度自信的预言——兰登将获得57%的选票。
结果恰恰相反,罗斯福赢得了62%的选票。问题就在于文学摘要的采样方式:
3. 质量差的数据
显然,如果训练集满是错误、异常值和噪声(例如,差质量的测量产生的数据),系统将更难检测到底层模式,更不太可能表现良好。所以花时间来清理训练数据是非常值得的投入。事实上,大多数数据科学家都会花费很大一部分时间来做这个。例如:
4. 无关特征
正如我们常说的:垃圾入,垃圾出。只有训练数据里包含足够多的相关特征,以及较少的无关特征,系统才能够完成学习。一个成功的机器学习项目,关键部分是提取出一组好的用来训练的特征集,这个过程,称之为特征工程,包括以下几点:
02 坏算法
现在我们已经看了不少“坏数据”的例子,再来看几个“坏算法”的例子。
1. 训练数据过度拟合
假设你正在国外旅游,被出租车司机狠宰了一刀,你很可能会说,那个国家的所有出租车司机都是强盗。过度概括是我们人类常做的事情,不幸的是,如果我们不小心,机器很可能也会陷入同样的陷阱。在机器学习中,这被称为过度拟合,也就是指模型在训练数据上表现良好,但是泛化时却不尽如人意。
图1-22 显示了一个与训练数据过度拟合的,高阶多项式的生活满意度模型。虽然它在训练数据上的表现比简单的线性模型要好得多,但是你真的敢相信它的预测吗?
▲图1-22 训练数据过度拟合
诸如深度神经网络这类的复杂模型可以检测到数据中的微小模式,如果训练集本身是嘈杂的,或者说数据集太小(会导致采样噪声),那么很可能会导致模型检测噪声里的模式。很显然,这些模式不能泛化至新的实例。
举例来说,假设你给你的生活满意度模型提供了更多其他的属性,包括一些不具信息的属性例如国家的名字。在这种情况下,一个复杂模型可能会检测到这样的事实模式:
训练数据中,名字中带有字母 W 的国家,生活满意度大于 7 ——新西兰(New Zealand 7.3)、挪威(Norway 7.4)、瑞典(Sweden 7.2)和瑞士(Switzerland 7.5)。
当把这个 W 规则泛化到卢旺达(Rwanda)或津巴布韦(Zimbabwe)时,你对结果有多大的自信?显然,训练数据中的这个模式仅仅是偶然产生的,但是模型无法判断这个模式是真实的,还是噪声产生的结果。
当模型相对于训练数据的数量和噪度都过于复杂时,会发生过度拟合。可能的解决方案是:
通过约束模型使其更简单,并降低过度拟合的风险,这个过程称之为正则化。例如,我们前面定义的线性模型有两个参数,θ0和θ1。因此,该算法在拟合训练数据时,调整模型的自由度就等于2:它可以调整线的高度(θ0)和斜率(θ1)。
如果我们强行让θ1 = 0,那么算法的自由度将会降为 1,并且其拟合数据将变得更为艰难——它能做的全部就只是将线上移或下移来尽量接近训练实例,最后极有可能停留在平均值附近。这确实太简单了!
如果我们允许算法修改θ1,但是我们强制它只能是很小的值,那么算法的自由度将位于 1 和 2 之间,这个模型将会比自由度为 2 的模型稍微简单一些,同时又比自由度为 1 的模型略微复杂一些。你需要在完美匹配数据和保持模型简单之间找到合适的平衡点,从而确保模型能够较好地泛化。
图1-23显示了三个模型:蓝色虚线代表一开始的原始模型,也就是缺失部分国家的数据;红色的虚线代表用所有国家数据训练的第二个模型;实线代表的模型与第一个模型使用的训练数据相同,但是应用了正则化的约束。
我们可以看出通过正则化使得模型具有较小的斜率,这虽然让模型与训练数据的匹配度略微降低,但是能够更好地泛化至新的实例。
▲图1-23 通过正则化降低过度拟合的风险
在学习时,应用正则化的程度可以通过一个超参数来控制。超参数是学习算法(不是模型)的参数。因此,它不受算法本身的影响;它必须在训练之前设置好,并且在训练期间保持不变。
如果将正则化超参数设置为非常大的值,会得到一个几乎平坦的模型(斜率接近于零);学习算法虽然肯定不会过度拟合训练数据,但是也更加不可能找到一个好的解决方案。调整超参数是构建机器学习系统非常重要的组成部分。
2. 训练数据拟合不足
你可能已经猜到了,拟合不足和过度拟合正好相反:它的产生通常是因为,对于下层的数据结构来说,你的模型太过简单。
举个例子,用线性模型来描述生活满意度就属于拟合不足;现实情况远比模型复杂得多,所以即便是对于用来训练的示例,该模型产生的预测都一定是不准确的。
解决这个问题的主要方式有:
03 退后一步
现在你已经对机器学习有一些了解。不过讲了这么多概念,你可能有点晕,我们暂且退后一步,纵观一下全局:
还有最后一个要讲的重要主题是:在你训练好了一个模型之后,你不能只是“希望”它可以正确的对新的场景作出泛化。你还需要评估它,必要时还要做出一些调整。
关于作者:奥雷利安·杰龙(Aurélien Géron)是机器学习方面的顾问。他曾是Google软件工程师,在2013年到2016年主导了YouTube视频分类工程。2002年和2012年,他还是Wifirst公司(一家法国的无线ISP)的创始人和首席技术官,2001年是Ployconseil公司(现在管理电动汽车共享服务Autolib)的创始人和首席技术官。
本文摘编自《机器学习实战:基于Scikit-Learn和TensorFlow》,经出版方授权发布。
延伸阅读《机器学习实战》
点击上图了解及购买
转载请联系微信:togo-maruko
推荐语:前谷歌工程师撰写,“美亚”人工智能图书畅销榜首图书。从实践出发,手把手教你从零开始搭建起一个神经网络。