欠拟合与过拟合

目录

1 欠拟合

2 过拟合

3 判断欠拟合和过拟合

3.1 学习曲线(learning curves)

3.2 交叉验证(cross-validation)


1 欠拟合

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

解决方法:

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

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

3)减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。

2 过拟合

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

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

解决方法:

1)重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。

2)增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。

3)采用正则化方法。正则化方法包括L0正则、L1正则和L2正则,而正则一般是在目标函数之后加上对于的范数。

正则化方法具体见:https://mp.csdn.net/postedit/84979872https://mp.csdn.net/postedit/88209653

但是在机器学习中一般使用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来跳过一定的神经元。

3 判断欠拟合和过拟合

     首先了解三种误差的计算公式:

  • training error:    
  • cross validation error:     
  • test error:      

3.1 学习曲线(learning curves)

      一般来讲,判断模型是否过拟合可采用学习曲线(learning curve),通过画学习曲线图可以直观的看出 train set 和 test set 的误差随着训练样本数量(number of training samples)的变化。在学习曲线中,如果训练准确度(training accuracy)和测试准确度(或验证准确度 validation accuracy)两条曲线相距较远,则说明模型的方差较大(一般情况下,训练精度都会高于测试精度),模型过拟合。而我们期望的理想状况是,训练集和测试集的两条精度曲线相距较近,并且随着训练样本数量的增加,越来越近,逐渐收敛。

       学习曲线就是通过画出不同训练集大小训练集交叉验证准确率,可以看到模型在新数据上的表现,进而来判断模型是否方差偏高(bias)偏差(variance)过高,以及增大训练集是否可以减小过拟合。

  •  当训练集和测试集的误差收敛但却很高时,为高偏差(bias)。 左上角的偏差很高,训练集和验证集的准确率都很低,很可能是欠拟合。 我们可以增加模型参数,比如,构建更多的特征,减小正则项。 此时通过增加数据量是不起作用的。
  • 当训练集和测试集的误差之间有大的差距时,为高方差(variance)。 当训练集的准确率比其他独立数据集上的测试结果的准确率要高时,一般都是过拟合。 右上角方差很高,训练集和验证集的准确率相差太多,应该是过拟合。 我们可以增大训练集,降低模型复杂度,增大正则项,或者通过特征选择减少特征数。
  • 理想情况是是找到偏差和方差都很小的情况,即收敛且误差较小。

例如下图:在画学习曲线时,横轴为训练样本的数量,纵轴为准确率。

  • 左图为用 naive Bayes 分类器时,效果不太好,分数大约收敛在 0.85,此时增加数据对效果没有帮助。
  • 右图为 SVM(RBF kernel),训练集的准确率很高,验证集的也随着数据量增加而增加,不过因为训练集的还是高于验证集的,有点过拟合,所以还是需要增加数据量,这时增加数据会对效果有帮助。

注:python中实现代码?https://blog.csdn.net/qq_30374549/article/details/80937159

3.2 交叉验证(cross-validation)

bias和variance的概念:https://mp.csdn.net/postedit/79469255

泛化误差(generalization error)可以分解为三个部分: 偏差(bias), 方差(variance)噪声(noise). 。generalization error反映的是整个模型的准确度,Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。

我们可以根据j_cvj_train两个来判断是处于欠拟合还是过拟合

当观察到 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,当前模型更可能存在过拟合


 

https://blog.csdn.net/willduan1/article/details/53070777

https://www.cnblogs.com/solong1989/p/9415606.html

https://blog.csdn.net/aliceyangxi1987/article/details/73598857

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值