教你简单解决过拟合问题(附公式)
作者:Ahmed Gad
翻译:韩海畴
校对:丁楠雅
本文约2000字,建议阅读5分钟。
本文带大家认识了什么是过拟合,并且示范了用正则化的方法来避免过拟合的问题。
多项式回归&过拟合
你可能训练过这样的机器学习模型,它在训练样本上表现得无可挑剔,却在新样本预测上一塌糊涂。你可曾想过为什么会发生这种问题吗?本文解释了作为其中原因之一的过拟合,并用简单步骤示范了基于回归的正则化方法来避免过拟合问题。
机器学习就是用数据和算法训练一个模型来对从未见过的数据(测试数据)进行准确预测。举个例子,为了得到一个分类器,专家需要搜集机器学习算法所需的训练数据。专家负责找到最佳的、能够将不同类别的事物区分开来的特征。这些特征将被用于训练机器学习算法。比方说我们准备用下面的训练数据创建一个识别图片里是否有猫的机器学习模型。
我们首先要回答的问题是:“最佳特征是什么?”,这是机器学习中的关键问题,选择的特征越正确,模型将来给出的预测就会越准确,反之亦然。让我们试着观察上述图形并找出猫的若干代表性特征,比如两个黑色瞳孔和两只对角线方向的耳朵。假设我们设法从上面的训练图像提取了这些特征并创建了一个机器学习模型。这个模型得到了存在于大部分猫身上的特征,所以能够处理各种各样关于猫的图像。我们可以在新的数据上对这个模型进行测试。假设模型对测试数据的分类准确性是x%。
人们希望提高分类的准确性时,第一个想到的办法是使用比原来更多的特征。因为有区分度的特征越多,模型准确率就越高。通过再次检查训练数据我们能发现更多的特征,比如图像的整体颜色,训练数据中的所有猫都是白色的、眼睛虹膜是黄色的。特征向量会有如下所示的四个特征,这些特征将被用来再次训练机器学习模型。
特征 | 黑色瞳孔 | 对角线耳朵 | 白色毛色 | 黄色虹膜 |
把模型训练好后接着测试它。加入新的特征向量后,预期的分类准确性测试结果比x%变小了。为什么会这样?因为训练数据中的部分特征并不是在所有猫的图片中都存在。测试数据里有黑猫和黄猫,训练数据中只有白猫。有的猫也没有黄色的虹膜。
这种选用特征在训练样本中表现出色但在测试样本中表现糟糕的情况被称为过拟合。模型所使用的一些特征只在训练数据中出现,但在测试数据中并不存在。
上文用一个复杂的案例通俗地解释了过拟合的概念。但为了详细说明,使用简单的例子会更好。因此下文的讨论将以回归为例。
通过一个回归案例理解正则化
假如我们想创建一个契合下图所示数据的回归模型。我们可以用多项式回归。
我们可以从一次线性模型开始,这是最简单的模型。
其中
和
是模型参数,x是唯一使用的特征,该模型的图像如下:
基于下面给出的损失函数,我们可以看到该模型和数据拟合得不是很好。
其中
是样本
的模型输出值,
是该样本的期望输出值。
上面的模型太过简单,有许多预测数值都不准确。因此,我们应该找一个更复杂的、能和数据有较好拟合的模型。为此,我们可以将方程的次方从一次提升到二次。如下:
当把特征
提升至二次方
后,我们创建了一个新的特征。同时,我们不仅捕捉到了数据中的线性部分,也捕捉到了部分非线性的数据。新的模型图如下所示:
从上图可看出二项式对数据的拟合度好于一项式。但是二次方程在某些数据样本上仍拟合得不太好。于是我们创建了一个更复杂的三次多项式模型,如下:
模型图会变成这样:
可以看出新的模型在加上新的特征后捕捉到了更多的三次方数据,对数据的拟合度更好。为了进一步提升拟合度,我们将方程提升到四次方,如下:
模型图变成这样:
看起来多项式方程的方次越高模型的拟合度越好。但是有些重要的问题需要回答。如果通过增加特征数量来增加多项式的次方数就能得到更好的结果,为什么不用一个非常高次方的方案,比如100次方?解决一个问题所用的方程最佳次方数应该是多少?
模型载荷/复杂度
有一个术语叫“载荷”或“复杂度”。模型的载荷/复杂度指的是模型可处理的变量数量。载荷越大,则模型能处理的变量数越多。第一个模型的载荷就比第四个模型的载荷要小。在我们的案例中,载荷是随多项式次方数的增加而增加的。
毫无疑问,多项式方程的次方数越大,对数据的拟合度就越好。但需要记住增加多项式的次方也会增加模型的复杂性。如果模型的载荷过高可能会导致过拟合。这种情况下,模型会变得非常复杂,与训练数据拟合得很好,但是在新的数据上表现很差。而机器学习的目标不仅仅是创建一个在训练数据上表现强劲的模型,还期望模型在新的数据样本上同样出色。
四次方模型是非常复杂的。的确,它与旧有的数据契合度很好,但在未见过的数据上就未必了。在这个情况下,该方程中新选用的特征抓取了过量的细节。因新的特征将模型变得过于复杂,我们需要将其剔除。
在这个例子中,我们已经知道哪个特征需要被剔除。于是,我们可以将模型恢复到原有的三次模型()。但在实际工作中,我们不知道具体该剔除哪个特征。同时,假如新的特征不是特别糟糕,我们只想削弱它而非完全剔除它。我们该怎么做呢?
回顾损失函数,它唯一的目标就是将预测错误值最小化/削弱。我们可以设置一个将
的影响最小化的新目标。损失函数经调整以削弱
后会变成下面这样:
我们现在的目标是将损失函数最小化。我们现在只对将其中的项“”最小化感兴趣。显而易见,为了将最小化,我们应该将最小化,因为这是我们唯一能改变的自由参数。如果这个特征非常糟糕,我们可以将参数设为零从而完全将其剔除,如下:
通过将其剔除,我们回到了原来的三次多项式方程
。
在已有数据上的表现不如
,但总的来说,它在新数据上的表现会比
好。
但如果
是一个比较好的特征,我们只是想减弱它的影响而非完全剔除它,我们可以将它的值设得接近0(比如0.1),如下。通过这样,我们限制了
的效用。因此,新模型不会像原先那样复杂。
回头看
,看起来它比
要简单,它在已有的和未见过的数据样本中都有良好表现。所以,我们应剔除在
中使的新特征
或在它表现尚可的情况下减弱其影响。我们可以通过调整损失函数来实现这点。
正则化
请注意,我们因为有数据图像而确实知道是最契合数据的模型。这是一个我们能手动解决的简单问题。但是随着样本数量和数据的增加,以及我们手头没有数据图像一类的信息时,我们就无法轻易得出相关结论。必须有一个东西自动告诉我们哪个次方的模型最契合数据并告诉我们应对未知数据时应该削弱哪一个特征。
正则化会帮助我们选择适合数据的模型复杂度。这在自动削弱那些把模型复杂度搞得过高的特征方面很有用。当选用的特征不算太差、多少能帮助我们改善预测结果以至于我们只是想削弱特征而非移除特征时,正则化是非常有用的。正则化会削弱所有选用的特征而非某个选定的子集。我们之前的例子只是削弱了
、
这两个特征。但这种情况在运用正则化时不会发生。
通过运用正则化方法,一个新的项被加入了损失函数以削弱特征,从而使损失函数变成下面这样:
也可以在将Λ移出后把式子写成这样。
新加入的项
用于削弱特征以控制模型的复杂度。我们在加入正则化的项之前的目标是尽可能减小预测误差。现在我们的目标是尽可能减小误差的同时避免模型变得过于复杂、避免过拟合。
正则化参数lambda (λ)控制如何削弱特征。这是一个没有固定值的超参数。它的值基于手头的任务而变化,当它的值上升时,特征会被削弱得很厉害,其结果是让模型变得更简单。反之,特征被削弱得不那么厉害,模型复杂度上升。(λ)为零则意味着特征没有削弱。
当(λ)为零时,
的数值如下面的方程一样没有被削弱。这是因为把(λ)的值设为0意味着去除正则化项并对误差放任不管。于是,我们的目标将变成仅把误差最小化到接近0。当最小化误差成为目标时,模型可能会过拟合。
但是当削弱参数 λ的值非常大时(比方说一个亿),对参数
的削弱将是巨大的,为了将损失控制在其最小值,会造成参数
为0的结果。模型会有一个如下所示被削弱的
。
请注意,正则化的项数
是从1而非0开始。实际上,我们只用正则化值来削弱特征(
)。因为
不是一个相关特征,我们没有理由去削弱它。在这种情况下,模型将会是如下图的
。
作者简介:Ahmed Gad于2015年7月获埃及Menoufia大学计算机与信息学院学士学位及优秀学生荣誉称号。他作为学院中的第一名在2015年被推荐到埃及的一所学院任助教并在2016年在学院中兼任研究员工作。他目前的研究方向包括深度学习、机器学习、人工智能、数字信号处理和计算机视觉。
译者简介
韩海畴,中国人民大学2014届市场营销系本科毕业生,目前在海南工作。对大数据在市场营销及金融方面的运用感兴趣。希望能在数据派THU这个平台上与志同道合的朋友们一起学习和交流。