什么是过拟合:
所谓过拟合,指的是模型在训练数据集上效果很好,但是在交叉验证数据集上,或者在测试集上效果一般。
也就是说模型对未知样本的预测表现一般,也就是泛化能力差。
如何衡量在训练数据集上效果好?在机器学习中,是有衡量方法的,比如roc曲线。
例子1:
如下图所示:
图一是欠拟合,模型不能很好地拟合数据;
图二是最佳的拟合情况;
图三就是过拟合,对每一个特征进行了过度的学习,采用了很复杂的模型,最后导致曲线波动很大。
例子2:
就譬如下方的图像中,左边黑色直线在一定程度拟合数据排列,而蓝紫色的曲线就是照顾到每一个样本点,曲线弯弯折折,属于过拟合;
右边黑色的曲线就能把红蓝两种数据点进行很好的分类,过拟合的绿色虽然在此数据上能完美分开两类数据点,可是对于一个新的数据集,其适应能力远不如黑色的曲线。
过拟合产生的原因
<1>训练数据集不够,不能代表整个数据的分布情况,及不能穷尽所有的数据情况。
所以当出现新的数据(未知数据)的数据,效果不好。
<2>在一定训练数据的基础上,对模型进行过度训练(overtraining)时,常常会导致模型的过拟合(overfitting).
如何防止过拟合?
一般以下几种方法:
early stopping
数据集扩增(Data augmentation)
正则化(Regularization)
Dropout等。
有一个概念需要先说明,在机器学习算法中,我们常常将原始数据集分为三部分:
training data # 训练数据集
validation data # 验证数据集
testing data # 测试数据集
这个validation data是什么?
它其实就是用来避免过拟合的,在训练过程中,我们通常用它来确定一些超参数:
<1>比如根据validation data上的accuracy来确定early stopping的epoch大小;
<2>根据validation data确定learning rate(学习率)等
那为啥不直接在testing data上做这些呢?因为如果在testing data做这些,那么随着训练的进行,我们的网络实际上就是在一点一点地overfitting我们的testing data,导致最后得到的testing accuracy没有任何参考意义。
1/Early stopping:
人为设置一定的迭代次数,防止训练过度,导致过拟合。
即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。
对模型进行训练的过程就是对模型的参数不断进行学习更新的过程,
这个过程往往会用到一些迭代方法,如梯度下降学习算法。
这样可以有效阻止过拟合的发生,因为过拟合本质上就是对自身特点过度地学习。
如下图所示,在对模型训练的时候,模型在训练集上的训练误差(training error)随着时间会一直减少,
然而模型在验证数据集(validation data)上的误差会减少到一定程度后逐步上升,形成一个非对称的U型曲线。
对模型进行训练的过程即是对模型的参数进行更新的过程,参数更新会用到一些优化算法,为了能够得到最低测试误差时的参数,Early Stopping的做法就是运行优化方法直到若干次在验证数据集上的验证误差没有提升时候停止。虽然这样我们不一定能够在u型的最低的地方停止,但是我们对"若干次"进行不断的修改,达到相对更好的结果。
一般做法是,在训练的过程中,记录到目前为止最好的验证数据集的正确率(validation accuracy),当连续10次Epoch(下降),validation accurac验证数据集没有达到最佳Accuracy(准确率),则认为accuracy(准确率)不再有所提升,此时就可以停止迭代了。
2/数据集扩增
在数据挖掘领域流行着这样的一句话,“有时候往往拥有更多的数据胜过一个好的模型”。 但是往往条件有限,如人力物力财力的不足,而不能收集到更多的数据。
如在进行分类的任务中,需要对数据进行打标签,并且很多情况下都是人工得进行打标,
因此一旦需要打标签的数据量过多,就会导致效率低下以及可能出错的情况。
所以,需要采取一些计算的方式与策略在已有的数据集上动手脚,以得到更多的数据。
数据集扩增即需要得到更多的符合要求的数据,必须是和已有数据是独立同分布的,或者近似独立同分布的。
一般有以下方法:
<1>从数据源头采集更多数据(有条件的情况下可以这样做)
<2>复制原有数据并加上随机噪声
<3>重采样
<4>根据当前数据集估计数据分布参数,使用该分布产生更多数据
3/正则化(regularization)
xxx
4/dropout
在神经网络中,Dropout方法通过修改隐藏层神经元的个数来防止网络的过拟合,也就是通过修改深度网络本身。
对于神经网络,在训练过程中按照给定的概率随机删除一些隐藏层的神经元,同时保证输入层和输出层的神经元不变。便能得到左边的神经网络,从而简化复杂的网络。
在每一批次数据被训练时,Dropout按照给定的概率P随机剔除一些神经元,只有没有被剔除也就是被保留下来的神经元的参数被更新。
每一批次数据,由于随机性剔除神经元,使得网络具有一定的稀疏性,从而能减轻了不同特征之间的协同效应。
而且由于每次被剔除的神经元不同,所以整个网络神经元的参数也只是部分被更新,消除减弱了神经元间的联合适应性,增强了神经网络的泛化能力和鲁棒性。
Dropout只在训练时使用,作为一个超参数,在测试集时,并不能使用。