过拟合
一、什么是过拟合
过拟合的表现:模型训练时候的误差很小,但在测试的时候误差很大。
过拟合本质原因: 模型相对于训练样本数据量过于复杂,模型要学习的特征参数太多,但是样本数据量又不够,无法充分满足模型特征的学习需求,导致很多噪声数据都被学习到,在训练时候误差很小,在预测时误差很大,即泛化能力差。
欠拟合:模型设定的过于简单,参数太少,数据集的好多有用特征没有学到,导致模型太幼稚,训练和预测时损失都很大。
二、过拟合解决方法
(1) 正则化
分析:加入正则项来控制模型复杂度,使模型在数据量容忍的范围内不至于太复杂。
常用方法有L1和L2正则化,详情移步正则化
(2) 扩增数据集
分析:由于训练的数据量太小,导致模型无法充分学习到数据的特征,建议增加数据量,可以采取的方式有:
1)从数据源头采集更多数据
2)复制原有数据并加上随机噪声
3)重采样
4)根据当前数据集估计数据分布参数,使用该分布产生更多数据等
5)如果训练集是图片,还可以通过扭曲、旋转和裁剪的方式增加数据量
(3)交叉验证
数据量小时很适用
(4) 采用dropout方法
分析:这个方法在神经网络里面很常用,通俗一点讲就是dropout方法在训练的时候让神经元以一定的概率不工作。
![](https://img.haomeiwen.com/i6005523/2435b89798b10d2f.png)
(5)Early 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不再提高了。此时便可以停止迭代了(Early Stopping)。这种策略也称为“No-improvement-in-n”,n即Epoch的次数,可以根据实际情况取,如10、20、30等
(6)在训练之前记得 shuffle 一下数据集,一般是每次训练一个 epoch(就是把 training dataset 训练了一遍)后就 shuffle 一次,但是对于较大的数据集可以只 shuffle 一次。