龙空技术网

大数据机器学习算法之过拟合和欠拟合

我的沈阳 227

前言:

而今看官们对“拟合算法程序”都比较重视,看官们都需要学习一些“拟合算法程序”的相关知识。那么小编也在网摘上搜集了一些关于“拟合算法程序””的相关内容,希望大家能喜欢,同学们快快来学习一下吧!

本篇我们讨论一下机器学习算法中的过拟合和欠拟合的问题,那问题来了,什么是过拟合和欠拟合。

如上图所示,通过利用算法训练出的模型,有时候会学习样本数据的特质,如学习树叶的边缘必须有锯齿,这种情况就是学习了样本特有的属性,对模型未来应用到真实的判定系统时带来误差,这种情况就是过拟合。

欠拟合与这种情况正好想法,由于算法模型只学习了样本的一部分特点,如上图中的认为绿色就是树叶,导致在真实模型应用中产生很多错误的预测,这种情况就是欠拟合。

因此无论是过拟合还是欠拟合都不是我们希望看到的,所以今天我们聊一聊如何避免欠拟合和过拟合的发生。过拟合和欠拟合都会带来比较差的模型表现效果,但是目前大部分机器学习算法在实际应用时更多的是出现过拟合的问题。我们首先谈谈如何避免过拟合。

过拟合问题

1.数据检测:首先我们应该重新梳理一下收集的数据,是否样本数量过少,样本信息是否不够全面,某一类特质的样本数量过多,如在训练样本中带锯齿的叶子占了绝大部分,那么学习的算法就容易带来过拟合的问题。

2.增加数据集:机器学习中一直有一句话“有时候拥有更多的数据胜过一个好的模型”。在增加数据的方法上有一些方法,例如在数据上增加一些随机噪声,从源头上采集更过数据,重采样等多种方式。

3.正则化方法:这是从技术成面上来通过控制训练模型的复杂度来保证模型不易过拟合(一般情况下,越复杂的模型越容易产生过拟合的问题)。

L1正则是基于L1范数,即在目标函数后面加上参数的L1范数和项,即参数绝对值和与参数的积项,即:

其中C0代表原始的代价函数,n是样本的个数,λ就是正则项系数,权衡正则项与C0项的比重。后面那一项即为L1正则项。

在计算梯度时,w的梯度变为:

其中,sgn是符号函数,那么便使用下式对参数进行更新:

对于有些模型,如线性回归中(L1正则线性回归即为Lasso回归),常数项b的更新方程不包括正则项。从上式可以看出,当w为正时,更新后w会变小;当w为负时,更新后w会变大;因此L1正则项是为了使得那些原先处于零(即|w|≈0)附近的参数w往零移动,使得部分参数为零,从而降低模型的复杂度(模型的复杂度由参数决定),从而防止过拟合,提高模型的泛化能力。

聊完L1代价函数,我们再来看看L2代价函数,L2正则化就是在代价函数后面加入一个二次代价函数。其公式如下:

C0代表原始的代价函数,后面那一项就是L2正则化项,它是这样来的:所有参数w的平方的和,除以训练集的样本大小n。λ就是正则项系数,权衡正则项与C0项的比重。另外还有一个系数1/2,1/2经常会看到,主要是为了后面求导的结果方便,后面那一项求导会产生一个2,与1/2相乘刚好凑整。利用梯度下降法对其求导后可以得到:

可以看出对于b没有引入正则化因子,但对于w,则带入了正则化因子,通过如下公式更新参数:

通过公式可以看出(由于η、λ、n都是正的),所以导致在修正w参数之前w已经完成衰减,基于此,这也就是导致权重衰减的主要原因。由于梯度信息可正可负,实际上权重也是可以变大变小与正常参数调整的方向是一致的。

我们虽然解释了L2正则化可以让w变得偏小,徘徊在0值附近,当时为什么会防止过拟合呢。知乎上有人给的解释是如下:

过拟合的时候,拟合函数的系数往往非常大,为什么?如下图所示,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。

而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。

4.Dropout

L1、L2正则化是通过对损失函数的修正来实现的,而Dropout则是通过修改网络的结构,就是训练模型的数据流的方式来调整过拟合。

举例如上图所示的网络,正常情况下,数据流需要流转到所有的网络节点(主要指隐藏单元)。

Dropout就是在每次训练网络开始时,随机地“删除”一半的(一定比例)隐层单元,得到如下的网络:

保持输入输出层不变,按照反向传播算法更新模型的权值(当然删除的隐藏单元不更新,因为它们被“临时删除”了)。

以上就是一次迭代的过程,在第二次迭代中,也用同样的方法,只不过这次删除的那一半隐层单元,跟上一次删除掉的肯定是不一样的,因为我们每一次迭代都是“随机”地去删掉一半。第三次、第四次……都是这样,直至训练结束。

以上就是Dropout,它为什么有助于防止过拟合呢?可以简单地这样解释,运用了dropout的训练过程,相当于训练了很多个只有半数隐层单元的神经网络(后面简称为“半数网络”),每一个这样的半数网络,都可以给出一个分类结果,这些结果有的是正确的,有的是错误的。随着训练的进行,大部分半数网络都可以给出正确的分类结果,那么少数的错误分类结果就不会对最终结果造成大的影响。

欠拟合问题

以上都是描述如何避免过拟合的方法,在实际的模型训练中有时候还会出现欠拟合的情况。对于欠拟合的情况,也有一些方法可以用来规避。下面详细聊一聊。

1.减少正则化:参看上面正则化部分的介绍,正则化可以避免过拟合的发生,因此在出现过拟合的情况时,可以通过减少正则化的损失函数来防止过拟合的发生。

2.添加数据量和特征维度:由于模型可用于学习的数据规模可能不足够大,导致模型训练的不够充分,模型复杂度不够。还有如果统计的数据信息中,各个维度数量收集的不够或者维度信息中大部分不具有区分样本的特质。面对这种问题主要方法是收集更多的特质维度,或者增加采样信息等方式来扩充数据。

3.增加算法模型的复杂度:例如很多训练样本不是线性可分的,如果单用线性方法来拟合可能无法达到一个理想的拟合方法,这时候引入非线性方法,如核函数等方法或者更复杂的深度学习等方法来增加模型的复杂度。

本文详细梳理了一下过拟合和欠拟合的概念,以及分别针对过拟合和欠拟合有什么好的方式可以规避这些问题。详细通过本篇的内容大家会对这类问题的主流处理方法有一个全面的了解。

标签: #拟合算法程序