欠拟合、过拟合及其解决方法

在咱们机器学习或者训练深度神经网络的时候常常会出现欠拟合和过拟合这两个问题,可是,一开始咱们的模型每每是欠拟合的,也正是由于如此才有了优化的空间,咱们须要不断的调整算法来使得模型的表达能拿更强。可是优化到了必定程度就须要解决过拟合的问题了,这个问题也在学术界讨论的比较多。(以前搜了不少有的博客,讲的都不太全,所以我从新整理总结了一遍,同时加入了本身的理解,方便本身和后来人查阅)html


首先就是咱们在进行模型训练的时候会出现模型不可以很好地拟合数据的状况,这个时候就须要咱们来判断究竟如今的模型是欠拟合仍是过拟合,那么怎么来判断这二者的状况呢?有两种方法:git

首先看一下三种偏差的计算方法:github

  • training error
  • cross validation error
  • test error

1)学习曲线(learning curves)算法

学习曲线就是比较 j_train 和 j_cv。以下图所示,为通常的学习曲线,蓝色的线表示训练集上的偏差 j_train, 粉色的线表示验证集上的偏差 j_cv,横轴表示训练集合的大小。网络


刚开始处于 “A” 点,表示当训练数据很小时,很容易时训练集上的偏差很是小,此时处于过拟合状态。随着训练数据的增长,训练数据上的偏差 J_train 愈来愈大,而验证集上的偏差 J_cv 愈来愈小,J_train 和 J_cv 愈来愈接近但始终保持 J_cv > J_train.
app


2)交叉验证(cross-validation)机器学习

这里首先解释一下bias和variance的概念。模型的Error = Bias + Variance,Error反映的是整个模型的准确度,Bias反映的是模型在样本上的输出与真实值之间的偏差,即模型自己的精准度,Variance反映的是模型每一次输出结果与模型输出指望之间的偏差,即模型的稳定性。函数

咱们能够根据j_cv 与 j_train两个来判断是处于欠拟合仍是过拟合。post


当观察到 J_cv 很大时,可能处在途中蓝色圆圈中的两个位置,虽然观察到的现象很类似(J_cv都很大),但这两个位置的状态是很是不一样的,处理方法也彻底不一样。
学习

  • 当cross validation error (Jcv) 跟training error(Jtrain)差很少,且Jtrain较大时,即图中标出的bias,此时 high bias low variance,当前模型更可能存在欠拟合。
  • 当Jcv >> Jtrain且Jtrain较小时,即图中标出的variance时,此时 low bias high variance,当前模型更可能存在过拟合。


1. 欠拟合

首先欠拟合就是模型没有很好地捕捉到数据特征,不可以很好地拟合数据,例以下面的例子:


左图表示size与prize关系的数据,中间的图就是出现欠拟合的模型,不可以很好地拟合数据,若是在中间的图的模型后面再加一个二次项,就能够很好地拟合图中的数据了,如右面的图所示。


解决方法:

1)添加其余特征项,有时候咱们模型出现欠拟合的时候是由于特征项不够致使的,能够添加其余特征项来很好地解决。例如,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段,不管在什么场景,均可以照葫芦画瓢,总会获得意想不到的效果。除上面的特征以外,“上下文特征”、“平台特征”等等,均可以做为特征添加的首选项。

2)添加多项式特征,这个在机器学习算法里面用的很广泛,例如将线性模型经过添加二次项或者三次项使模型泛化能力更强。例如上面的图片的例子。

3)减小正则化参数,正则化的目的是用来防止过拟合的,可是如今模型出现了欠拟合,则须要减小正则化参数。


2. 过拟合

通俗一点地来讲过拟合就是模型把数据学习的太完全,以致于把噪声数据的特征也学习到了,这样就会致使在后期测试的时候不可以很好地识别数据,即不能正确的分类,模型泛化能力太差。例以下面的例子。


上面左图表示size和prize的关系,咱们学习到的模型曲线如右图所示,虽然在训练的时候模型能够很好地匹配数据,可是很显然过分扭曲了曲线,不是真实的size与prize曲线。


解决方法:

1)从新清洗数据,致使过拟合的一个缘由也有多是数据不纯致使的,若是出现了过拟合就须要咱们从新清洗数据。

2)增大数据的训练量,还有一个缘由就是咱们用于训练的数据量过小致使的,训练数据占总数据的比例太小。

3)采用正则化方法。正则化方法包括L0正则、L1正则和L2正则,而正则通常是在目标函数以后加上对于的范数。可是在机器学习中通常使用L2正则,下面看具体的缘由。

L0范数是指向量中非0的元素的个数。L1范数是指向量中各个元素绝对值之和,也叫“稀疏规则算子”(Lasso regularization)。二者均可以实现稀疏性,既然L0能够实现稀疏,为何不用L0,而要用L1呢?我的理解一是由于L0范数很难优化求解(NP难问题),二是L1范数是L0范数的最优凸近似,并且它比L0范数要容易优化求解。因此你们才把目光和万千宠爱转于L1范数。

L2范数是指向量各元素的平方和而后求平方根。可使得W的每一个元素都很小,都接近于0,但与L1范数不一样,它不会让它等于0,而是接近于0。L2正则项起到使得参数w变小加重的效果,可是为何能够防止过拟合呢?一个通俗的理解即是:更小的参数值w意味着模型的复杂度更低,对训练数据的拟合刚恰好(奥卡姆剃刀),不会过度拟合训练数据,从而使得不会过拟合,以提升模型的泛化能力。还有就是看到有人说L2范数有助于处理 condition number很差的状况下矩阵求逆很困难的问题(具体这儿我也不是太理解)。

4)采用dropout方法。这个方法在神经网络里面很经常使用。dropout方法是ImageNet中提出的一种方法,通俗一点讲就是dropout方法在训练的时候让神经元以必定的几率不工做。具体看下图:


如上图所示,左边a图是没用用dropout方法的标准神经网络,右边b图是在训练过程当中使用了dropout方法的神经网络,即在训练时候以必定的几率p来跳过必定的神经元。


以上就是关于过拟合、欠拟合的解释以及判断和其对应的解决方法。


------EOF------


参考文献:

http://www.veryread.net/n-101-133184.html

http://blog.csdn.net/zouxy09/article/details/24971995

http://blog.csdn.net/wtq1993/article/details/51746847

http://blog.csdn.net/heyongluoyao8/article/details/49429629

http://blog.csdn.net/linkin1005/article/details/42869331

http://ljwsummer.github.io/posts/advice-for-applying-machine-learning.html


转自:http://blog.csdn.net/willduan1/article/details/53070777

相关文章
相关标签/搜索