机器学习中防止过拟合的处理方法
防止过拟合的处理方法
过拟合
  我们都知道,在进行数据挖掘或者机器学习模型建立的时候,因为在统计学习中,假设数据满足独立同分布(i.i.d,independently and identically distributed),即当前已产生的数据可以对未来的数据进行推测与模拟,因此都是使用历史数据建立模型,即使用已经产生的数据去训练,然后使用该模型去拟合未来的数据。但是一般独立同分布的假设往往不成立,即数据的分布可能会发生变化(distribution drift),并且可能当前的数据量过少,不足以对整个数据集进行分布估计,因此往往需要防止模型过拟合,提高模型泛化能力。而为了达到该目的的最常见方法便是:正则化,即在对模型的目标函数(objective function)或代价函数(cost function)加上正则项。
  在对模型进行训练时,有可能遇到训练数据不够,即训练数据无法对整个数据的分布进行估计的时候,或者在对模型进行过度训练(overtraining)时,常常会导致模型的过拟合(overfitting)。如下图所示:
  通过上图可以看出,随着模型训练的进行,模型的复杂度会增加,此时模型在训练数据
集上的训练误差会逐渐减小,但是在模型的复杂度达到一定程度时,模型在验证集上的误差反而随着模型的复杂度增加而增大。此时便发生了过拟合,即模型的复杂度升高,但是该模型在除训练集之外的数据集上却不work。
  为了防止过拟合,我们需要用到一些方法,如:early stopping、数据集扩增(Data augmentation)、正则化(Regularization)、Dropout等。
Early stopping
  对模型进行训练的过程即是对模型的参数进行学习更新的过程,这个参数学习的过程往往会用到一些
迭代方法,如梯度下降(Gradient descent)学习算法。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……
数据集扩增
  在数据挖掘领域流行着这样的一句话,“有时候往往拥有更多的数据胜过一个好的模型”。因为我们在使用训练数据训练模型,通过这个模型对将来的数据进行拟合,而在这之间又一个假设便是,训练数据与将来的数据是独立同分布的。即使用当前的训练数据来对将来的数据进行估计与模拟,而更多的数据往
往估计与模拟地更准确。因此,更多的数据有时候更优秀。但是往往条件有限,如人力物力财力的不足,而不能收集到更多的数据,如在进行分类的任务中,需要对数据进行打标,并且很多情况下都是人工得进行打标,因此一旦需要打标的数据量过多,就会导致效率低下以及可能出错的情况。所以,往往在这时候,需要采取一些计算的方式与策略在已有的数据集上进行手脚,以得到更多的数据。
  通俗得讲,数据机扩增即需要得到更多的符合要求的数据,即和已有的数据是独立同分布的,或者近似独立同分布的。一般有以下方法:
∙从数据源头采集更多数据
∙复制原有数据并加上随机噪声
∙重采样
∙根据当前数据集估计数据分布参数,使用该分布产生更多数据等
正则化方法
  正则化方法是指在进行目标函数或代价函数优化时,在目标函数或代价函数后面加上一个正则项,一般有L1正则与L2正则等。
L1正则
  L1正则是基于L1范数,即在目标函数后面加上参数的L1范数和项,即参数绝对值和与参数的积项,即:
C=C0+λn∑w|w|
其中C0代表原始的代价函数,n是样本的个数,λ就是正则项系数,权衡正则项
与C0项的比重。后面那一项即为L1正则项。
  在计算梯度时,w的梯度变为:
∂C∂w=∂C0∂w+λnsgn(w)
其中,sgn是符号函数,那么便使用下式对参数进行更新:
w:=w+α∂C0∂w+βλnsgn(w)
对于有些模型,如线性回归中(L1正则线性回归即为Lasso回归),常数项b的
更新方程不包括正则项,即:
b:=b+α∂C0∂b
其中,梯度下降算法中,α<0,β<0,而在梯度上升算法中则相反。
  从上式可以看出,当w为正时,更新后w会变小;当w为负时,更新后w 会变大;因此L1正则项是为了使得那些原先处于零(即|w|≈0)附近的参数w
往零移动,使得部分参数为零,从而降低模型的复杂度(模型的复杂度由参数决定),从而防止过拟合,提高模型的泛化能力。
  其中,L1正则中有个问题,便是L1范数在0处不可导,即|w|在0处不可导,
因此在w为0时,使用原来的未经正则化的更新方程来对w进行更新,即令sgn(0)=0,这样即:
sgn(w)|w>0=1,sgn(w)|w<0=−1,sgn(w)|w=0=0
L2正则
  L2正则是基于L2范数,即在目标函数后面加上参数的L2范数和项,即参数的平方和与参数的积项,即:
C=C0+λ2n∑w w2
其中C0代表原始的代价函数,n是样本的个数,与L1正则化项前面的参数不同的是,L2项的参数乘了12,是为了便于计算以及公式的美感性,因为平方项求导有个2,λ就是正则项系数,权衡正则项与C0项的比重。后面那一项即为L2正则项。
  L2正则化中则使用下式对模型参数进行更新:
w:=w+α∂C0∂w+βλnw
正则化是解决过拟合问题吗对于有些模型,如线性回归中(L2正则线性回归即为Ridge回归,岭回归),常数
项b的更新方程不包括正则项,即:
b:=b+α∂C0∂b
其中,梯度下降算法中,α<0,β<0,而在梯度上升算法中则相反。
  从上式可以看出,L2正则项起到使得参数w变小加剧的效果,但是为什么可以防止过拟合呢?一个通俗的理解便是:更小的参数值w意味着模型的复杂度更

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。