【机器学习】欠拟合,过拟合的常见处理方法

文章目录

  • 拟合的三种情况
    • 过拟合(over-fitting)
    • 欠拟合(under-fitting)
  • 如何判断过拟合和欠拟合
  • 贝叶斯误差
  • 数据不匹配问题
  • 正则化

拟合的三种情况

【机器学习】欠拟合,过拟合的常见处理方法_第1张图片

过拟合(over-fitting)

  在算法对模型参数的学习过程中,如果模型过于强大,比如说,样本空间分布在一条直线的附近,那么我们的模型最好是一条直线, h θ ( x ) = θ 0 + θ 1 x 1 h_\theta(x)=\theta_0+\theta_1x_1 hθ(x)=θ0+θ1x1。但我们并不知道数据的情况,可能我们的函数是这样的: h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 2 + θ 3 x 3 3 h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2^2+\theta_3x_3^3 hθ(x)=θ0+θ1x1+θ2x22+θ3x33,此时图像不会是一条直线,它会像一条弯曲的曲线,完美地穿过各个数据点。如上图中的第三个图所示。
  在过拟合的情况下,损失函数的值会非常的小。得到的模型无法泛化,对新样本的适应性很差。
  降低过拟合风险的方法

  1. 获取更多的训练数据。更多的样本能够让模型学习到更多有效的特征,减少噪声的影响。如果是图像可以通过平移,旋转,缩放等方式扩充。还可以使用生成式对抗网络来合成新数据。
  2. 降低模型复杂度。如减少网络层数,神经元个数;决策树降低树的深度,进行剪枝等操作。
  3. 加入正则化。给模型参数加上一定的正则约束。
  4. 集成学习方法。把多个模型集成起来,降低单一模型的过拟合风险。

欠拟合(under-fitting)

  欠拟合的情况和过拟合相反,如果样本空间是一条曲线,如果我们的模型最终只能学习出来一条直线,也就是我们的模型没有学习到数据的特点,具有较高的偏差,如上图中的第一个图所示,这种情况下,损失函数的值会比较大。
  降低欠拟合风险的方法

  1. 添加新的特征。当特征不足或现有特征与样本标签的相关性不强时,容易出现过拟合。
  2. 增加模型复杂度。增加模型复杂度可以让模型有更强的拟合能力。
  3. 减小正则化系数。正则化防止过拟合,但是正则过头也可能导致欠拟合。出现欠拟合现象时,需要有针对性地减小正则化系数。

如何判断过拟合和欠拟合

  通过查看训练集误差和验证集误差,我们便可以诊断算法是否具有高方差。也就是说衡量训练集和验证集误差就可以得出不同结论。
  假设训练集误差是 15%,我们把训练集误差写在首行,验证集误差是 16%,假设该案例中人的错误率几乎为 0%,人们浏览这些图片,分辨出是不是猫。算法并没有在训练集中得到很好训练,如果训练数据的拟合度不高,就是数据欠拟合,就可以说这种算法偏差比较高。相反,它对于验证集产生的结果却是合理的,验证集中的错误率只比训练集的多了 1%,所以这种算法偏差高,因为它甚至不能拟合训练集。
  训练集误差是 15%,偏差相当高,但是,验证集的评估结果更糟糕,错误率达到 30%,在这种情况下,一般认为这种算法偏差高,因为它在训练集上结果不理想,而且方差也很高,这是方差偏差都很糟糕的情况。
  训练集误差是 0.5%,验证集误差是 1%,用户看到这样的结果会很开心,分类器只有 1%的错误率,偏差和方差都很低。
通过查看训练集误差,我们可以判断数据拟合情况,至少对于训练数据是这样,可以判断是否有偏差问题,然后查看错误率有多高。
  当完成训练集训练,开始使用验证集验证时,我们可以判断方差是否过高,从训练集到验证集的这个过程中,我们可以判断方差是否过高。以上分析的前提都是假设基本误差很小,训练集和验证集数据来自相同分布,如果没有这些假设作为前提,分析过程更加复杂。

贝叶斯误差

  贝叶斯误差,也称为贝叶斯错误率,一般认为是理论上可能达到的最优错误率,就是说没有任何办法设计出一个到的函数,让它能够超过一定的准确度,这个理论上限称为贝叶斯错误率
  人类水平错误率一般比贝叶斯错误率高一点,即人类水平和理论上限不会相差太远。比如说,人类在猫分类上只有1%的错误率,那么贝叶斯错误率就是0.X%或者更低。所以事实上,你的算法在训练集上的表现和人类水平的表现有很大差距的话,说明你的算法对训练集的拟合并不好。比如说,如果学习算法达到 8%的训练错误率和 10%的测试错误率,说明算法对训练集的拟合并不好,我们需要做的就是减少偏差。
  但如果人类水平错误率是7.5%,而我们仍旧得到了8%的训练错误率和 10%的测试错误率。这时,训练错误率能够让我们改善的空间已经很小了,或者说很难。而方差则还有更多改进的余地,所以我们应该使用一些减少方差的方法,比如正则化,或者收集更多的数据。
  通常我们将贝叶斯错误率和训练错误率之间的差值称为可避免偏差。如果我们想提升机器学习系统的性能,我们应该知道可避免偏差有多大。然后看看你的c测试错误率和训练错误率之间的距离,就知道你的方差问题有多大。换句话说,你应该做多少努力让你的算法表现能够从训练集推广到测试集。
  假如我们的模型超过了人类水平,那么取得进一步的成果,我们需要付出的努力也是难以估计的。

数据不匹配问题

  当我们的训练集和测试集不是来自同一分布时,训练集训练出来的模型在测试集上面的表现往往会很差。比如,我们训练集包含了20W张高清猫图,而测试集里面却是1W张手机拍照上传的模糊猫图,很明显这两个集合不是来自同一个分布,这样得到的模型自然无法很好地泛化到测试集上。
  我们应该从训练集里多划分一个测试集:训练-测试集,看看分类器在训练集、训练-测试集以及测试集上的误差。
  比如说训练误差是 1%,我们说训练-测试集上的误差是 9%,然后测试集误差是 10%,因此可以得到结论,当你从训练数据变到训练-测试集数据时,错误率真的上升了很多。
  假设训练误差为 1%,训练-开发误差为 1.5%,但当你开始处理测试集时,错误率上升到 10%。现在你的方差问题就很小了,因为当你从见过的训练数据转到训练-测试集数据,错误率只上升了一点点。但当你转到测试集时,错误率就大大上升了,所以这是数据不匹配的问题。
  如果训练误差是 10%,训练-开发误差是 11%,开发误差为 12%,而人类水平对贝叶斯错误率的估计大概是 0%,如果你得到了这种等级的表现,那就真的存在偏差问题了。存在可避免偏差问题,因为算法做的比人类水平差很多,所以这里的偏差真的很高。
  如果你的训练集错误率是 10%,你的训练-开发错误率是 11%,开发错误率是 20%,那么这其实有两个问题。第一,可避免偏差相当高,因为你在训练集都没有做得很好,而人类能做到接近 0%错误率,但你的算法在训练集上错误率为10%。这里方差似乎很小,但数据不匹配问题很大。
  处理数据不匹配问题,可以使用迁移学习的方式进行学习,也可以使用人工合成数据的方式,比如说,给训练集的高清图片添加噪声。

正则化

  对于欠拟合,往往是模型特征过多导致的,可以使用降低特征数量的方式来解决,比如,手动去除特征中不必要的参数,或者使用一定的模型选择算法来自动选择特征。
  还有一种方法是正则化。通过给模型添加正则项的方式,对参数进行惩罚,降低特征对最终的决策边界的影响。
  比如,我们在线性回归的损失函数 J ( θ ) = 1 2 m [ ∑ i = 1 m ( h θ ( x ( i ) − y ( i ) ) + λ ∑ j = 1 m θ j 2 ) ] J(\theta)=\frac{1}{2m}[\sum_{i=1}^m(h_\theta(x^{(i)}-y^{(i)})+\lambda\sum_{j=1}^m\theta_j^2)] J(θ)=2m1[i=1m(hθ(x(i)y(i))+λj=1mθj2)]中加入 λ ∑ j = 1 m θ j 2 \lambda\sum_{j=1}^m\theta_j^2 λj=1mθj2。其中 λ \lambda λ被称为正则化参数。对于 λ \lambda λ的选取,不应过大也不应过小,对于过大的 λ \lambda λ,对参数的惩罚过大,相当于参数对整体式子不会产生影响,导致欠拟合的发生。对于过小的 λ \lambda λ,对参数的惩罚较小,无法改善整体的情况,仍旧会导致过拟合。我们应该选取合适的 λ \lambda λ,这样在每次最小化的过程中, θ \theta θ的值会变得更小,因此特征对整体的影响也变小,对于图形的拟合也会变得比较平滑。
带有正则的梯度下降的更新公式如下:
θ j : = θ j − α [ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) + λ m θ j ] \theta_j:=\theta_j-\alpha[\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}+\frac{\lambda}{m}\theta_j] θj:=θjα[m1i=1m(hθ(x(i))y(i))xj(i)+mλθj]
进一步化简为如下形式:
θ j : = θ j ( 1 − α λ m ) − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j:=\theta_j(1-\alpha\frac{\lambda}{m})-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)} θj:=θj(1αmλ)αm1i=1m(hθ(x(i))y(i))xj(i)

你可能感兴趣的:(机器学习之旅)