对于数据挖掘或者机器学习建立的模型model来说,该模型在训练集上的表现性能较好,而在测试集上效果很差,也就是说该模型的泛化能力差,我们就称之为过拟合(overfitting)。
2.1 什么是欠拟合(underfitting)?什么是合适拟合?
我们建立的模型实质上就是复杂函数f(x)
x ----输入----> f(x) ----输出----> y_
拟合的函数和训练集误差较大,我们称这种情况为欠拟合;
拟合的函数和训练集误差较小,我们称这种情况为合适拟合;
同理,拟合的函数和训练集完美的匹配(训练集误差非常非常的小),我们称之为过拟合。
欠拟合:
合适拟合:
过拟合:
2.2 如何解决欠拟合?
欠拟合问题,根本原因是特征维度过少,导致拟合的函数无法满足训练集,误差较大。
我们可以通过增加特征维度来解决。
因为我们训练出来的模型一般是用来测试独立的数据集(不在训练集内的),预测未知的结果,过拟合虽然在训练集上效果好,但是在测试集上(实际应用上)效果差,这是我们不想遇到的。同时,在很多问题上,我们无法穷尽所有的状态,不可能将所有情况都包含在训练集上,所以我们要解决过拟合问题。
为什么机器学习中比较常见过拟合问题?
因为机器学习算法是为了满足尽可能复杂的任务,其模型的拟合能力一般远远高于问题的复杂度,也就是说,机器学习算法有拟合出正确规则前提下,进一步拟合噪声的能力。
而传统的函数拟合问题(例如机器人系统辨识),一般是经过经验,物理和数学等推导出一个含参模型,模型的复杂度确定了,只需要调整个别参数就可以,这样的模型没有多余的能力拟合噪声。
(1)训练数据量不足
(2)训练参数的增多
(3)模型学习能力过于强大(由学习算法和数据内涵共同决定)
(4)其他…
(1)数据扩增,这是解决过拟合最有效的方法,但是对于算法工程师来说,目前的数据是固定不变的,不应该从这里下手收集更多数据,而是找其他方法。
为什么说数据扩增越多越好?
因为有这样一个假设,训练的数据和将来测试的数据是独立同分布的(或者近似),因此当前训练的数据越多,模型对未来数据预测越准确。
数据扩增方法:
(2)选择合适的模型,其实过拟合最主要的2个原因是:数据太少+模型太复杂,前面提到数据很难再去收集了,但是我们可以选择合适复杂度的模型来防止过拟合问题。
对于神经网络来说,我们可以从以下几个方面来限制网络的拟合能力,从而防止过拟合:
(3)正则化方法(regularization):
正则化方法是指在进行目标函数或代价函数优化时,在目标函数或代价函数后面加上一个正则项,一般有L1正则与L2正则等。
总结
正则项是为了降低模型的复杂度,从而避免模型区过分拟合训练数据,包括噪声与异常点(outliers)。从另一个角度上来讲,正则化即是假设模型参数服从先验概率,即为模型参数添加先验,只是不同的正则化方式的先验分布是不一样的。这样就规定了参数的分布,使得模型的复杂度降低(试想一下,限定条件多了,是不是模型的复杂度降低了呢),这样模型对于噪声与异常点的抗干扰性的能力增强,从而提高模型的泛化能力。还有个解释便是,从贝叶斯学派来看:加了先验,在数据少的时候,先验知识可以防止过拟合;从频率学派来看:正则项限定了参数的取值,从而提高了模型的稳定性,而稳定性强的模型不会过拟合,即控制模型空间。
另外一个角度,过拟合从直观上理解便是,在对训练数据进行拟合时,需要照顾到每个点,从而使得拟合函数波动性非常大,即方差大。在某些小区间里,函数值的变化性很剧烈,意味着函数在某些小区间里的导数值的绝对值非常大,由于自变量的值在给定的训练数据集中的一定的,因此只有系数足够大,才能保证导数的绝对值足够大。如下图(引用知乎):
另外一个解释,规则化项的引入,在训练(最小化cost)的过程中,当某一维的特征所对应的权重过大时,而此时模型的预测和真实数据之间距离很小,通过规则化项就可以使整体的cost取较大的值,从而,在训练的过程中避免了去选择那些某一维(或几维)特征的权重过大的情况,即过分依赖某一维(或几维)的特征(引用知乎)。
(以上来自 :https://blog.csdn.net/heyongluoyao8/article/details/49429629 )
延伸:L1正则和L2正则的区别?(后面博文讲述)
L0范数?
svm中引进松弛变量?
(3)Dropout
L1、L2正则是通过在代价函数后面加上正则项来防止模型过拟合的。而在神经网络中,有一种方法是通过修改神经网络本身结构来实现的,其名为Dropout。该方法是在对网络进行训练时用一种技巧(trick),对于如下所示的三层人工神经网络:
假设我们要训练上图这个网络,在训练开始时,我们随机地“删除”一些(1/2、1/3等)的隐层单元,视它们为不存在,同时保持输入层与输出层神经元的个数不变,得到如下的网络:
按照BP算法更新上图神经网络中的权值(虚线连接的单元不更新,因为它们被“临时删除”了)。
以上就是一次迭代的过程,在第二次迭代中,也用同样的方法,只不过这次删除的那一些隐层单元,跟上一次删除掉的肯定是不一样的,因为我们每一次迭代都是“随机”地去删掉一些。第三次、第四次……都是这样,直至训练结束。
以上就是Dropout。
它为什么有助于防止过拟合呢?
可以简单地这样解释,运用了dropout的训练过程,相当于训练了很多个只有半数(删除一半,1/2情况)隐层单元的神经网络(后面简称为“半数网络”),每一个这样的半数网络,都可以给出一个分类结果,这些结果有的是正确的,有的是错误的。随着训练的进行,大部分半数网络都可以给出正确的分类结果,那么少数的错误分类结果就不会对最终结果造成大的影响。
注:还有其他的一些方法,例如,贝叶斯方法,我还在学习中,努力吧。
参考和引用:
吴恩达机器学习教学视频,以及一些优质的博文
https://www.jianshu.com/p/090dc626d00f
http://blog.sina.com.cn/s/blog_13eacc8800102yk05.html
https://www.jianshu.com/p/97aafe479fa1
https://blog.csdn.net/heyongluoyao8/article/details/49429629
https://www.jianshu.com/p/0a6ac483b950
https://www.cnblogs.com/anitinaj/p/10025034.html
https://www.zhihu.com/question/59201590/answer/167392763
仅用来个人学习和分享,如若侵权,留言立删。
尊重他人知识产权,不做拿来主义者!
喜欢的可以关注我哦QAQ,
你的关注就是我write博文的动力。