过拟合与欠拟合及方差偏差

在模型的评估与调整的过程中,经常会遇到过拟合与欠拟合的情况,如何有效的识别过拟合和欠拟合现象,并了解其中原因,有效的对模型进行调整。

什么是过拟合和欠拟合?

知乎上看到一个机灵的回答,"你太天真了":underfitting ";你想太多了":overfitting,人的学习和机器学习是如此相似。过拟合就是模型对训练数据拟合呈现过当的情况,反映到评估指标上,就是训练集上表现好,但在测试集和新数据上表现差,总结来说就是模型泛化能力差,欠拟合是指模型在训练和预测时表现都不好,过拟合与欠拟合也可以用 Bias 与 Variance 的角度来解释,欠拟合会导致高 Bias ,过拟合会导致高 Variance,所以模型需要在 Bias 与 Variance 之间做出一个权衡。下图表示了模型过拟合和欠拟合情况。

过拟合和欠拟合
什么是方差和偏差
方差和偏差

如上图所示,我们理想的模型应该是低方差,低偏差的,但实际上方差和偏差是两个矛盾体,不可兼得,如下图所示,模型复杂度和方差偏差联系。


模型复杂度和方差偏差联系
  • 方差 Variance

高方差:描述就是模型针对不同样本预测的结果会产生剧烈变化,用打靶的例子来描述,这个人手不稳,经常抖动,导致弹着点分布比较散。

  • 偏差 Bias

高偏差:描述就是模型预测时预测的结果期望和真实结果相差比较大,用打靶的例子来说,这个人眼睛不太好,每次都瞄不太准,导致弹着点偏离靶心。

过拟合和欠拟合原因是啥?
  • 训练数据一般都是现实练数据的子集。并且样本中存在噪声数据,由于采样错误,导致样本的数据不能正确的反应现实场景和业务。
  • 模型太复杂,过度的学习到了样本里的噪声数据,并不能很好表达真实输入输出之间的关系。
怎么判断模型过拟合欠拟合?
  • 过拟合:如果模型在训练集上效果很好,但是在测试集和新数据上效果很差就是过拟合。
  • 欠拟合:如果在训练集和测试集新数据上效果都不好,就是欠拟合。
怎么减少模型过拟合?
(1)减少欠拟合方法:

1、增加新特征,可以考虑加入进特征组合、高次特征,来增大假设空间;
2、尝试非线性模型,比如核SVM 、决策树、DNN等模型;
3、如果有正则项可以较小正则项参数 \lambda;
4、Boosting ,Boosting 往往会有较小的 Bias,比如 Gradient Boosting 等.

(2)解决过拟合的方法:

1、交叉检验,通过交叉检验得到较优的模型参数;
2、特征选择,减少特征数或使用较少的特征组合,对于按区间离散化的特征,增大划分的区间;
3、正则化,常用的有 L1、L2 正则。而且 L1正则还可以自动进行特征选择;
4、如果有正则项则可以考虑增大正则项参数 lambda;
5、增加训练数据可以有限的避免过拟合;
6、Bagging ,将多个弱学习器Bagging 一下效果会好很多,比如随机森林等.
7、降低模型复杂度:在数据较少时,降低模型复杂度是比较有效的方法,适当的降低模型复杂度可以降低模型对噪声的拟合度。神经网络中可以减少网络层数,减少神经元个数,dropout;决策树可以控制树的深度,剪枝等。

(3)DNN中常见的方法:

1、早停策略。本质上是交叉验证策略,选择合适的训练次数,避免训练的网络过度拟合训练数据。
2、集成学习策略。而DNN可以用Bagging的思路来正则化。首先我们要对原始的m个训练样本进行有放回随机采样,构建N组m个样本的数据集,然后分别用这N组数据集去训练我们的DNN。即采用我们的前向传播算法和反向传播算法得到N个DNN模型的W,b参数组合,最后对N个DNN模型的输出用加权平均法或者投票法决定最终输出。不过用集成学习Bagging的方法有一个问题,就是我们的DNN模型本来就比较复杂,参数很多。现在又变成了N个DNN模型,这样参数又增加了N倍,从而导致训练这样的网络要花更加多的时间和空间。因此一般N的个数不能太多,比如5-10个就可以了。
3、DropOut策略。所谓的Dropout指的是在用前向传播算法和反向传播算法训练DNN模型时,一批数据迭代时,随机的从全连接DNN网络中去掉一部分隐藏层的神经元。 在对训练集中的一批数据进行训练时,我们随机去掉一部分隐藏层的神经元,并用去掉隐藏层的神经元的网络来拟合我们的一批训练数据。使用基于dropout的正则化比基于bagging的正则化简单,这显而易见,当然天下没有免费的午餐,由于dropout会将原始数据分批迭代,因此原始数据集最好较大,否则模型可能会欠拟合。

为什么能降低过拟合?
  • (1) Bagging:

Bagging对样本重采样,对每一重采样得到的子样本集训练一个模型,最后取平均。由于子样本集的相似性以及使用的是同种模型,因此各模型有近似相等的bias和variance(事实上,各模型的分布也近似相同,但不独立)。

  • (2)Regularization:

常用的有L1,L2正则化,正则化就是在目标函数里面添加参数惩罚项,用来控制模型的复杂度,正则化项可以降低模型的权重值,L1会产生稀疏解,L2会产生缩放效应整体压缩权重值,从而控制模型复杂度,根据奥卡姆剃刀原理,拟合效果差不多情况下,模型复杂度越低越好。

  • (3)Dropout:


    dropout图

dropout在训练时会随机隐藏一些神经元,导致训练过程中不会每次都更新(预测时不会发生dropout),最终的结果是每个神经元的权重w都不会更新的太大,起到了类似L2正则化的作用来降低过拟合风险。

  • (4)Ealy Stopping

Early stopping便是一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。
Early stopping方法的具体做法是,在每一个Epoch结束时(一个Epoch集为对所有的训练数据的一轮遍历)计算validation data的accuracy,当accuracy不再提高时,就停止训练。这种做法很符合直观感受,因为accurary都不再提高了,在继续训练也是无益的,只会提高训练的时间。那么该做法的一个重点便是怎样才认为validation accurary不再提高了呢?并不是说validation accuracy一降下来便认为不再提高了,因为可能经过这个Epoch后,accuracy降低了,但是随后的Epoch又让accuracy又上去了,所以不能根据一两次的连续降低就判断不再提高。一般的做法是,在训练的过程中,记录到目前为止最好的validation accuracy,当连续10次Epoch(或者更多次)没达到最佳accuracy时,则可以认为accuracy不再提高了。

本文是作为个人学习总结,参考了很多大神的博客及文章资料,非喜勿喷,如有错误,恳请指正。

参考文章:

知乎--机器学习中用来防止过拟合的方法有哪些?
知乎--机器学习防止欠拟合、过拟合方法
用简单易懂的语言描述「过拟合 overfitting」

推荐阅读更多精彩内容