过拟合(overfitting)
1、什么是过拟合?
训练模型的时候记住太多training data的细节从而降低了generalization的能力。在训练集上表现很好,在测试集上表现差。
(通俗的例子:准备面试的时候把网上的面试题背的很熟,但真的面试的时候考官换个方式问就不会回答。不能举一反三)
2、出现过拟合的原因?
(1)数据有噪声
假设一个真实的总体数据是一个线性模型(y = kx+b)
而如果训练集数据点如下,包含了少许噪声(红色点):
通过这个训练数据集训练得到的模型可能是这样:
这样的模型在训练集上表现很好,但是在测试集上就会出现很大的误差,因为前面我们提到了,真实的数据模型是一个线性模型。所以,有噪声可能会导致过拟合。
(2)训练集数据太少
当我们训练数据没有噪声,但是数据量很小的情况下也会导致过拟合。假设真实的总体数据样本分布如下:
问题简化就只有几个点,总体分布满足的模型大概是一个二次函数的模型,如果训练集数据量很少,例如:
那么通过这个训练集训练出来的模型能很好拟合成一个线性模型,这就会导致过拟合。
(3)过度训练(训练出的模型太复杂)
就是死板的记住了所有的训练集的特征,有可能包含噪声,过度训练会导致训练出来的模型很复杂,但是实际目标模型复杂度不高,导致了过拟合。
(4)目标函数模型本身太复杂(当数据量较少的情况下)
数据没有噪声,但是数量不够的情况下,如果目标函数是50次,我们用2次和10次的模型去拟合这些数据,会导致过拟合,而且2次的效果会更佳。当目标函数模型很复杂的时候,数据量小的话这些数据就相当于noise。这也是过拟合的一种情况。
(5)数据特征纬度太高(纬度灾难)
喜欢玩游戏的,性别和年龄是合适的特征,如果将姓氏作为特征,放入数据中进行拟合,肯定过拟合了。3、如何防止过拟合?
(1)数据清洗(修改或者删除)
过拟合有可能是数据不纯,有的数据修改标签,或者直接把这个数据删除掉
(2)数据增广
得到更多符合要求的数据,和现有的数据符合独立同分布,或者近似独立同分布
a. 从数据源头采集更多数据
b. 复制原有数据添加噪声
c. 重采样
d. 利用当前数据集,估计数据分布规律,产生新数据
(3)正则化(给损失函数添加一个惩罚项)
可以让权重值 w 变小,因为过拟合的时候,拟合函数的系数会很大
像这样,过拟合的函数曲线在小范围内的变化幅度很大,说明其导数很大,所以其系数很大,而正则化可以约束参数的范数使其不要太大,所以可以在一定程度上减小过拟合。
(4)Dropout(修改神经网络本身)
能减小过拟合原因:
a. 取平均的作用。dropout就相当于训练多个神经网络,结果取平均,能一定程度互相抵消掉一些拟合效果
b. 减少各个神经元之间的复杂共适性。使其不再依赖于固定关系的隐含节点的作用,增强鲁棒性。
(5)Early stop
对模型的训练就是对模型的参数学习更新的过程,在这个学习过程中一般会用到一些迭代方法,如梯度下降法。而提前终止就是一种迭代次数截断的方法防止过拟合。具体做法是,在每个epoch(一个epoch就是所有训练数据的一轮遍历)之后,检测该模型在验证集Validation set上的准确率,如果连续n次正确率都没有提高,就提前终止,这个n是自己设定的训练epoch的次数,“No-improvement-in-n”。
(6)特征降纬
特征选择和特征抽取
(7)BatchNorm
对神经元作归一化
神经网络中分批归一化(BN)处理过拟合原理,是因为同一数据在不同批中被归一化后的值有差别,相当于做了数据增强
4、如何判断是否过拟合?
在训练集上表现很好,在测试集表现很差。可在模型训练阶段采用交叉验证来检测是否发生了过拟合。基本方法是将训练数据分为一个或多个数据集,用一部分数据集训练模型,另一部分验证模型准确度。如果分类结果在训练集合和测试集合上相差很多,那么就是产生了过拟合。