转载自:https://zhuanlan.zhihu.com/p/83061032
1、什么是过拟合?
一句话总结:
过拟合:模型在训练集上表现很好,但是在测试集上表现很差,泛化性能差。
2、产生过拟合的原因:
产生过拟合的主要原因可以有以下3点:
1)训练数据不足,有限的训练数据。包括(但不限于)样本数量太少、数据维度太高、抽样方法错误,抽样时没有足够正确考虑业务场景或业务特点等等导致抽出的样本数据不能有效足够代表业务逻辑或业务场景;
2)数据有噪声。样本里的噪音数据干扰过大,大到模型过分记住了噪音特征,反而忽略了真实的输入输出间的关系;
3)参数太多、模型太过复杂。例如:对于决策树模型,如果我们对于决策树的生长没有合理的限制和修剪的话,决策树的自由生长有可能每片叶子里只包含单纯的事件数据(event)或非事件数据(no event),这种决策树当然可以完美匹配(拟合)训练数据,但是一旦应用到新的业务真实数据时,效果是一塌糊涂。
3、为什么要解决过拟合?
因为我们拟合的模型一般是用来预测未知数据(不在训练数据集内),过拟合虽然在训练集上效果很好,但是在实际使用时(测试集)效果很差,同时,在很多问题上,我们无法穷尽所有状态,不可能将所有情况都包含在训练集上。所有必须解决过拟合问题。
4、解决过拟合的方法:
(1)数据层面:
获取更多的数据:从数据源头获取;根据当前数据集估计数据分布参数,使用分布产生;数据增强,通过一定规则获取数据,例如图像平移,翻转,缩放,切割等
考虑数据降维,例如PCA,SVD等,选取重要特征,
重新清洗数据,增大数据的训练集。
(2)模型层面:
降低模型复杂度:过拟合的主要原因为,数据太少+模型太复杂。对于神经网络来讲,可以减少网络层数及神经元个数;在决策树模型中通过剪枝、限制树的深度、限制叶子节点最大个数。
训练时间的把控(Early stopping):提前停止就是在验证误差开始上升之前,就把网络的训练停止了,具体做法是每次在给定的迭代次数K内,把出现比之前验证误差更小的参数(模型)记录下来。如果从上次记录最小值开始,迭代了K次仍然没有发现新的更小的验证误差,那就认为已经过拟合,把当前验证误差最小的模型当做最优模型。
Dropout(随机失活):这是一个很高效的方法,在训练时,每次随机(如50%)忽略隐层的某些节点,这样,我们相当于随机从2^H个模型中采样选择模型,类似于bagging,此外,不同模型之间权值共享,相当于一种权值正则方法,实际效果比L2更好。
正则化约束,即正则化(regularization),L1或L2。给模型的参数加上一定的正则约束,限制权值。
增加噪声:噪声随着网络传播,按照权值的平方放大,并传播到输出层,对误差cost产生影响。在输入中加高斯噪声,会达到与L2类似的效果;也可在权值和网络响应上加噪声。
利用集成模型,结合多种模型:训练多个模型,以每个模型的平均输出作为结果。如Bagging随机森林,训练一堆互不关联的决策树。Boosting如GBDT,XGBoost。