欠拟合、过拟合——解决方法

机器学习—算法及代码 专栏收录该内容
88 篇文章 10 订阅


在机器学习或者深度神经网络中经常会出现:欠拟合和过拟合。这些问题的出现原因以及解决之道如下文。

1 过拟合原因

(1)建模样本抽取错误,包括(但不限于)样本数量太少,抽样方法错误, 抽样时没有足够正确考虑业务场景或业务特点,不能有效足够代表业务逻辑或业务场景。

(2)样本里的噪音数据干扰过大,模型学习了噪音特征,反而忽略了真实的输入输出间的关系。

(3)建模时的“逻辑假设”到了模型应用时已经不能成立了。 任何预测模型都是在假设的基础上才可以搭建和应用的。常用的假设包括:

  • 假设历史数据可以推测未来,
  • 假设业务环节没有发生显著变化,
  • 假设建模数据与后来的应用数据是相似的,等等。
  • 如果上述假设违反了业务场景的话,根据这些假设搭建的模型当然是无法有效应用的。

(4)参数太多、模型复杂度高。

(5)决策树模型。

  • 如果我们对于决策树的生长没有合理的限制和修剪的话, 决策树的自由生长有可能每片叶子里只包含单纯的事件数据(event)或非事件数据(no event), 可以想象,这种决策树当然可以完美匹配(拟合)训练数据, 但是一旦应用到新的业务真实数据时,效果是一塌糊涂。

(6)神经网络模型。

  • 由于对样本数据,可能存在隐单元的表示不唯一,即产生的分类的决策面不唯一,随着学习的进行, BP算法使权值可能收敛过于复杂的决策面,并至极致。
  • 权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征.
2 判断是否过拟合
  • 首先看一下三种误差的计算方法:
    training error (训练误差)
    J t r a i n ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J_{train}(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2 Jtrain(θ)=2m1i=1m(hθ(x(i))y(i))2
    cross validation error (交叉验证误差)
    J c v ( θ ) = 1 2 m c v ∑ i = 1 m c v ( h θ ( x c v ( i ) ) − y c v ( i ) ) 2 J_{cv}(\theta) = \frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}}(h_\theta(x_{cv}^{(i)})-y_{cv}^{(i)})^2 Jcv(θ)=2mcv1i=1mcv(hθ(xcv(i))ycv(i))2
    test error (测试误差)
    J t e s t ( θ ) = 1 2 m t e s t ∑ i = 1 m t e s t ( h θ ( x t e s t ( i ) ) − y t e s t ( i ) ) 2 J_{test}(\theta) = \frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_\theta(x_{test}^{(i)})-y_{test}^{(i)})^2 Jtest(θ)=2mtest1i=1mtest(hθ(xtest(i))ytest(i))2
  • 判断究模型否过拟合方法:
1)学习曲线(learning curves)

学习曲线就是比较 j t r a i n j_{train} jtrain j c v j_{cv} jcv

如下图所示,为一般的学习曲线,蓝线:训练误差 j t r a i n j_{train} jtrain , 粉色的线:验证集上的误差 j c v j_{cv} jcv,横轴表示训练集合的大小。

2)交叉验证(cross-validation)

模型的Error = Bias + Variance
Error反映的是整个模型的准确度
Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度
Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。

这里写图片描述

3 欠拟合–解决方法

首先欠拟合就是模型没有很好地捕捉到数据特征,不能够很好地拟合数据。
这里写图片描述

解决方法:

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

  2. 添加多项式特征,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。

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

4 过拟合–解决方法

通俗一点地来说过拟合就是模型把数据学习的太彻底(强行拟合),以至于把噪声数据的特征也学习到了, 这样不能够很好的分离(识别)测试数据,模型泛化能力太差。例如下面的例子:
这里写图片描述

解决方法:

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

  2. 增大数据的训练量,之前用于训练的数据量太小导致的,训练数据占总数据的比例过小。

  3. 采用正则化方法。正则化方法包括 L0正则、L1正则和L2正则, 而正则一般是在目标函数之后加上对于的范数。但是在机器学习中一般使用L2正则,下面看具体的原因。

    1. L0 范数是指向量中非0的元素的个数。

    2. L1 范数是指向量中各个元素绝对值之和,也叫“稀疏规则算子”(Lasso regularization)。
      两者都可以实现稀疏性,既然L0可以实现稀疏,为什么不用L0,而要用L1呢?个人理解一是因为L0范数很难优化求解(NP难问题), 两者都可以实现稀疏性,既然L0可以实现稀疏,为什么不用L0,而要用L1呢?个人理解一是因为L0范数很难优化求解(NP难问题), 二是L1范数是L0范数的最优凸近似,而且它比L0范数要容易优化求解。

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

5 神经网络过拟合解决方案
  1. 权值衰减.它在每次迭代过程中以某个小因子降低每个权值,这等效于修改E的定义,
    加入一个与网络权值的总量相应的惩罚项,此方法的动机是保持权值较小,避免weight decay, 从而使学习过程向着复杂决策面的反方向偏。

  2. 适当的stopping criterion (如图)
    在二次误差函数的情况下,关于早停止和权值衰减类似结果的原因说明。
    椭圆给出了常数误差函数的轮廓线,Wml表示误差函数的最小值。
    如果权向量的起始点为原点,按照局部负梯度的方向移动,那么它会沿着曲线给出的路径移动。
    通过对训练过程早停止,我们找到了一个权值向量w。
    定性地说,它类似于使用检点的权值衰减正则化项,然后最小化正则化误差函数的方法得到的权值。

  3. 验证数据
    一个最成功的方法是在训练数据外再为算法提供一套验证数据,
    应该使用在验证集合上产生最小误差的迭代次数,不是总能明显地确定验证集合何时达到最小误差.
    (通常30%的训练模式;每个时期检查验证集错误;如果验证错误上升,停止训练)

  4. 交叉验证
    交叉验证方法在可获得额外的数据提供验证集合时工作得很好,但是小训练集合的过度拟合问题更为严重.

  5. 采用dropout方法。这个方法在神经网络里面很常用。
    dropout方法是ImageNet中提出的一种方法,通俗一点讲就是dropout方法在训练的时候让神经元以一定的概率不工作,如下图。
    这里写图片描述

参考资料:
https://blog.csdn.net/willduan1/article/details/53070777
https://blog.csdn.net/tansuo17/article/details/79129504

  • 5
    点赞
  • 0
    评论
  • 36
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值