机器学习偏差、方差、泛化误差的完整总结

综述

机器学习算法的最终目标是最小化期望损失风险(即机器学习模型在任意未知测试样本上的表现),但由于数据的真实分布我们通常是不知道的,我们可用的信息来自于训练数据,因此,机器学习的学习目标往往会转化为最小化经验风险。优化算法对经验风险最小化问题进行求解,并在算法结束的第 T T T次迭代中输出模型。我们希望所学习到的该模型对未知数据预测的误差尽可能小,这里的误差我们就将其定义为机器学习算法的泛化误差(generalization error): R exp ⁡ ( f ^ ) = E P [ L ( Y , f ^ ( X ) ) ] = ∫ X × Y L ( y , f ^ ( x ) ) P ( x , y ) d x   d y \begin{aligned} R_{\exp }(\hat{f}) &=E_{P}[L(Y, \hat{f}(X))] \\ &=\int_{\mathcal{X} \times \mathcal{Y}} L(y, \hat{f}(x)) P(x, y) \mathrm{d} x \mathrm{~d} y \end{aligned} Rexp(f^)=EP[L(Y,f^(X))]=X×YL(y,f^(x))P(x,y)dx dy

泛化误差反映了学习方法的泛化能力,因为我们学习一个模型通常是为了解决训练数据集这一领域中的一般化问题,因此仅仅将训练数据集的经验风险最小化得到的模型推广应用到更为一般的问题时,并不能保证模型仍然是最优的,甚至模型是否可用都不能保证。所以如果一种方法学习的模型比另一种方法学习的模型具有更小的泛化误差,那么这种方法就更有效。事实上,泛化误差就是学习得到的模型的期望风险。

泛化误差可以分解为偏差(Bias)、方差(Variance)和噪声(Noise)。我们下边将做详细介绍,但在学习偏差、方差之前,我们先来了解两个概念:训练误差与测试误差。

训练误差与测试误差

我们都知道,最好的机器学习模型不仅要对已知数据有很好的预测能力,也要求对新数据,也就是未知数据也要有很好的预测能力。

当选定了损失函数,基于损失函数而计算的模型的训练误差(training error)和测试误差(test error)就成为学习方法评估的标准。

  • 训练误差:是机器学习模型关于训练数据集的平均损失
  • 测试误差:是机器学习模型关于测试数据集的平均损失

假设现在有一个学习到的模型: Y = f ^ ( X ) Y=\hat{f}(X) Y=f^(X),另外假设 N N N是训练数据集的样本规模,那么训练误差为: R e m p ( f ^ ) = 1 N ∑ i = 1 N L ( y i , f ^ ( x i ) ) R_{\mathrm{emp}}(\hat{f})=\frac{ {1}}{N} \sum_{i=1}^{N} L\left(y_{i}, \hat{f}\left(x_{i}\right)\right) Remp(f^)=N1i=1NL(yi,f^(xi))

另外假设 N ′ N^{\prime} N是测试数据集的样本规模,那么测试误差为 e t e s t = 1 N ′ ∑ i = 1 N ′ L ( y i , f ^ ( x i ) ) e_{\mathrm{test}}=\frac{1}{N^{\prime}} \sum_{i=1}^{N^{\prime}} L\left(y_{i}, \hat{f}\left(x_{i}\right)\right) etest=N1i=1NL(yi,f^(xi))

然后损失函数采用0-1损失时,测试误差就等于测试数据集上的误差率(error rate): e test  = 1 N ′ ∑ i = 1 N ′ I ( y i ≠ f ^ ( x i ) ) e_{\text {test }}=\frac{1}{N^{\prime}} \sum_{i=1}^{N^{\prime}} I\left(y_{i} \neq \hat{f}\left(x_{i}\right)\right) etest =N1i=1NI(yi=f^(xi)) 这里 I I I是函数: L ( Y , f ( X ) ) = { 1 , Y ≠ f ( X ) 0 , Y = f ( X ) L(Y, f(X))=\left\{\begin{array}{ll}1, & Y \neq f(X) \\ 0, & Y=f(X)\end{array}\right. L(Y,f(X))={ 1,0,Y=f(X)Y=f(X) 即预测值和目标值不相等为1,否则为0。

相应地,测试数据集上的准确率(accuracy)为: r test  = 1 N ′ ∑ i = 1 N ′ I ( y i = f ^ ( x i ) ) r_{\text {test }}=\frac{1}{N^{\prime}} \sum_{i=1}^{N^{\prime}} I\left(y_{i}=\hat{f}\left(x_{i}\right)\right) rtest =N1i=1NI(yi=f^(xi)) 显然有 r test  + e test  = 1 r_{\text {test }}+e_{\text {test }}=1 rtest +etest =1 但是实际应用中,我们往往不对训练误差的大小给与很多关注,因为训练误差的大小仅仅对判定给定的问题是不是容易学习的是有意义的,但本质上不重要。而测试误差反映了学习方法对未知的测试数据集的预测能力,往往是我们比较重视的。对比两种方法,测试误差小的模型往往具有更好的预测能力,是更有效更优的模型。通常的,我们往往将模型对未知数据的预测能力称为泛化能力,泛化能力的评估往往通过泛化误差来衡量,而泛化误差是偏差、方差与噪声之和。

偏差与方差

在有监督学习中,对于任何学习算法而言,他们的泛化误差可分解为三部分:偏差、方差、噪声

偏差、方差与噪声的概念

对测试样本 x x x,令 y D y_{D} yD x x x在数据集中的标记, y y y x x x的真实标记, f ( x ; D ) f(\boldsymbol{x} ; D) f(x;D)为训练集 D D D上学得模型 f f f x x x上的预测输出,这里以回归问题为例,则学习算法的期望预测为 f ˉ ( x ) = E D [ f ( x ; D ) ] \bar{f}(\boldsymbol{x})=\mathbb{E}_{D}[f(\boldsymbol{x} ; D)] fˉ(x)=ED[f(x;D)] 期望输出与真实标记的差别称为偏差(bias),为了方便起见, 我们直接取偏差的平方: bias ⁡ 2 ( x ) = ( f ˉ ( x ) − y ) 2 \operatorname{bias}^{2}(\boldsymbol{x})=(\bar{f}(\boldsymbol{x})-y)^{2} bias2(x)=(fˉ(x)y)2 使用样本数相同的不同训练集产生的方差为 var ⁡ ( x ) = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] \operatorname{var}(\boldsymbol{x})=\mathbb{E}_{D}\left[(f(\boldsymbol{x} ; D)-\bar{f}(\boldsymbol{x}))^{2}\right] var(x)=ED[(f(x;D)fˉ(x))2] 噪声为真实标记与数据集中的实际标记间的偏差 ε 2 = E D [ ( y D − y ) 2 ] \varepsilon^{2}=\mathbb{E}_{D}\left[\left(y_{D}-y\right)^{2}\right] ε2=ED[(yDy)2] 这里假设噪声期望为0,即 E D [ y D − y ] = 0 \mathbb{E}_{D}\left[y_{D}-y\right]=0 ED[yDy]=0。通过简单的多项式展开合并,可对算法的期望泛化误差进行分解: E ( f ; D ) = E D [ ( f ( x ; D ) − y D ) 2 ] = E D [ ( f ( x ; D ) − f ˉ ( x ) + f ˉ ( x ) − y D ) 2 ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + E D [ ( f ˉ ( x ) − y D ) 2 ] + E D [ 2 ( f ( x ; D ) − f ˉ ( x ) ) ( f ˉ ( x ) − y D ) ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + E D [ ( f ˉ ( x ) − y D ) 2 ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + E D [ ( f ˉ ( x ) − y + y − y D ) 2 ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + E D [ ( f ˉ ( x ) − y ) 2 ] + E D [ ( y − y D ) 2 ] + 2 E D [ ( f ˉ ( x ) − y ) ( y − y D ) ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + ( f ˉ ( x ) − y ) 2 + E D [ ( y D − y ) 2 ] \begin{aligned} E(f ; D)=& \mathbb{E}_{D}\left[\left(f(x ; D)-y_{D}\right)^{2}\right] \\=& \mathbb{E}_{D}\left[\left(f(x ; D)-\bar{f}(x)+\bar{f}(x)-y_{D}\right)^{2}\right] \\=& \mathbb{E}_{D}\left[(f(x ; D)-\bar{f}(x))^{2}\right]+\mathbb{E}_{D}\left[\left(\bar{f}(x)-y_{D}\right)^{2}\right] \\ &+\mathbb{E}_{D}\left[2(f(x ; D)-\bar{f}(x))\left(\bar{f}(x)-y_{D}\right)\right] \\=& \mathbb{E}_{D}\left[(f(x ; D)-\bar{f}(x))^{2}\right]+\mathbb{E}_{D}\left[\left(\bar{f}(x)-y_{D}\right)^{2}\right] \\=& \mathbb{E}_{D}\left[(f(x ; D)-\bar{f}(x))^{2}\right]+\mathbb{E}_{D}\left[\left(\bar{f}(x)-y+y-y_{D}\right)^{2}\right] \\=& \mathbb{E}_{D}\left[(f(x ; D)-\bar{f}(x))^{2}\right]+\mathbb{E}_{D}\left[(\bar{f}(x)-y)^{2}\right]+\mathbb{E}_{D}\left[\left(y-y_{D}\right)^{2}\right] \\ &+2 \mathbb{E}_{D}\left[(\bar{f}(x)-y)\left(y-y_{D}\right)\right] \\=& \mathbb{E}_{D}\left[(f(x ; D)-\bar{f}(x))^{2}\right]+(\bar{f}(x)-y)^{2}+\mathbb{E}_{D}\left[\left(y_{D}-y\right)^{2}\right] \end{aligned} E(f;D)=======ED[(f(x;D)yD)2]ED[(f(x;D)fˉ(x)+fˉ(x)yD)2]ED[(f(x;D)fˉ(x))2]+ED[(fˉ(x)yD)2]+ED[2(f(x;D)fˉ(x))(fˉ(x)yD)]ED[(f(x;D)fˉ(x))2]+ED[(fˉ(x)yD)2]ED[(f(x;D)fˉ(x))2]+ED[(fˉ(x)y+yyD)2]ED[(f(x;D)fˉ(x))2]+ED[(fˉ(x)y)2]+ED[(yyD)2]+2ED[(fˉ(x)y)(yyD)]ED[(f(x;D)fˉ(x))2]+(fˉ(x)y)2+ED[(yDy)2] 于是 E ( f ; D ) = bias ⁡ 2 ( x ) + var ⁡ ( x ) + ε 2 E(f ; D)=\operatorname{bias}^{2}(\boldsymbol{x})+\operatorname{var}(\boldsymbol{x})+\varepsilon^{2} E(f;D)=bias2(x)+var(x)+ε2 从该式可以看出,泛化误差可以分解为偏差、方差与噪声之和。偏差、方差与噪声的详细介绍见下述。

偏差
偏差度量了学习算法的期望预测与真实结果的偏离程度,刻画了学习算法本身的拟合能力

  • 高偏差:表明期望输出和真实标记之间误差大,学习算法拟合能力较差
  • 低偏差:表明期望输出和真实标记之间误差小,学习算法拟合能力更强

低偏差机器学习算法举例:决策树,kNN和支持向量机;高偏差机器学习算法举例:线性回归,线性判别分析和逻辑回归

通常来说线性算法容易解释,学习速度更快,但缺点是灵活性较低,无法从数据集中学习足够多的知识,具有较高的偏差.因此针对复杂问题预测性能较低。

方差
方差度量了同样大小的训练集的变动导致的学习性能的变化,即刻画了数据扰动所造成的影响

目标函数是由机器学习算法从训练数据中估算出来的,因此我们应该期望算法具有一定的方差。理想情况下,从一个训练数据集到下一个训练数据集的方差不应太大,这也意味着该算法能学习到输入和输出变量之间的隐藏底层映射。而具有高方差的机器学习算法容易受到训练数据细节的强烈影响。

  • 高方差:表明训练数据集的变化对目标函数的估计值造成较大的变动
  • 低方差:表明训练数据集的变化对目标函数的估计值造成较小的变动

低方差机器学习算法的示例包括:线性回归,线性判别分析和逻辑回归。高方差机器学习算法的示例包括:决策树,kNN和支持向量机

对比低偏差算法与高偏差算法就可以看出来,低偏差的算法往往高方差,高偏差的算法往往低方差。通常,相比线性算法,具有较大灵活性的非线性机器学习算法具有很大的方差。例如,决策树具有很高的方差,所以我们往往需要在使用前对决策树做减枝处理,不做剪枝的话则差异更大。

具体偏差和方差的对比可以参考下图,更有助于理解:
《机器学习偏差、方差、泛化误差的完整总结》
上图中蓝色的点表示预测值,靶心红点表示真实值,蓝点越靠近靶心表明预测值与真实值越接近,偏差越小;蓝色点越分散表明预测值之间差别很大,即方差大,反之蓝色点越集中表明预测值之间差别很小,也就是方差小。应用到该图,对偏差和方差就可以描述为:

  • 偏差(Bias):描述的是根据训练数据集拟合出的模型进行预测输出结果的期望与样本真实结果的差距,简单来讲,就是在样本上拟合的好不好。要想在bias上表现好, 达到low bias,就得复杂化模型,增加模型的参数,但这样容易过拟合,过拟合对应上图是 high variance,可以看出点很分散。 low bias对应就是点都打在靶心附近,形象描述就是瞄的很准,但手不一定稳。
  • 方差(Variance):描述的是在训练数据集上训练出来的模型在测试数据集上的表现,要想在 varlance上表现好,得到low Valence,就要简化模型,减少模型的参数,但这样容易欠拟合,欠拟合对应上图是high bias,点偏离靶心。 low variance对应就是点都打的很集中,但不ー定是靶心附近,形象描述就是手很稳,但是瞄的不准。

噪声
噪声表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。

噪声属于不可约减误差,无论使用哪种算法,都无法减少噪声。是学习算法所无法解决的问题,数据的质量决定了学习的上限。假设在数据已经给定的情况下,此时学习的上限已经确定,而这时我们需要做的就是尽可能的接近这个上限。

导致偏差和方差的原因

偏差的出现通常主要有两点原因:

  • 对学习算法做了错误的假设
  • 模型的复杂度不够

如果真实模型是一个二次线性函数,而我们假设模型为一次函数,就会出现欠拟合现象,导致偏差的增大。由偏差引起的误差通常在训练误差上就能体现,或者说训练误差主要是由偏差造成的。

方差的出现通常原因是由于模型的复杂度过高导致。

如果真实模型是一个二次线性函数,而我们假设模型是一个高次函数,就会出现过拟合线性,导致方差的增大。由方差引起的误差通常体现在测试误差相对训练误差的增量上。

深度学习中的偏差与方差

神经网络的拟合能力非常强,因此它的训练误差通常较小,即偏差较小。但同时过强的拟合能力往往会导致比较大的方差,使模型的测试误差(泛化误差)增大;

因此深度学习的核心工作之一就是研究如何避免过拟合的出现,降低模型的泛化误差,这类方法统称为正则化方法,后文在做介绍。

偏差与方差的权衡

模型的泛化能力是由算法的能力、数据的充分性以及任务本身的难度共同决定的。给定学习任务,为了取得好的泛化能力,则需要使偏差较小,同时又需要使方差较小,这样既能够充分拟合数据,又使得数据扰动产生的影响会比较小。

但一般来说,偏差与方差往往是有冲突的,类似于模型评估中查准率与查全率的冲突,偏差与方差的冲突被称为偏差-方差窘境。即在机器学习中,偏差和方差之间始终存在如下的关系

  • 增加偏差将减小方差
  • 增加方差将减少偏差

给定学习任务,假设我们可以控制学习算法的训练程度。则有:

  • 当训练不足时,模型的拟合能力不够,训练数据的扰动不足以使模型产生显著的变化,此时偏差主导泛化误差
  • 随着训练的加深,模型的拟合能力增强,训练数据发生的扰动越来越多的被模型学习到,此时方差逐渐主导泛化误差
  • 当训练程度充足后,模型的拟合能力已经非常强大,训练数据的轻微扰动都会导致模型产生显著的变化,若模型学习到许多具体的,只针对所使用的训练数据集的信息,而不同的训练数据集之间的某些特征和噪声是不一致的,这就导致了学习到的模型在很多其他的数据集上就无法获得很好的效果,此时将发生过拟合。

《机器学习偏差、方差、泛化误差的完整总结》
简单的总结一下:偏差大,说明模型欠拟合;方差大,说明模型过拟合。而我们要做的就是平衡模型的偏差和方差,在偏差和方差之间寻找一个平衡点,即泛化误差最小的点,达到optimal balance。

偏差与方差问题解决

整体思路:首先我们要明确的一点是:方差和偏差是无法完全避免的,只能尽量减少其影响。

  • 首先,在避免偏差时,需尽量选择正确的模型,假设任务是一个非线性问题,如果我们一直用线性模型去解决,那无论如何,高偏差是无法避免的。
  • 其次,有了正确的模型,我们还要慎重选择数据集的大小,通常情况下,数据集越大越好,但如果数据集足够大到已经对整体所有数据有了足够的代表性后,更多的数据已经不能提升模型了,反而会带来计算量的增加。而训练数据太少往往也是不好的,这会带来过拟合,模型复杂度太高,方差很大,不同数据集训练出来的模型变化非常大。
  • 最后,要选择模型的复杂度,复杂度高的模型通常对训练数据有很好的拟合能力。比如神经网络模型,往往对训练数据有非常好的拟合能力,但同时常常有过拟合情况的出现。

具体解决思路

减小偏差:实际上也可以称为解决欠拟合,通常有以下方法:

  1. 寻找更好的特征 – 具有代表性。
  2. 用更多的特征 – 增大输入向量的维度。(增加模型复杂度)
  3. 更复杂的模型(增加模型复杂度)
  4. 减小正则化系数

减小方差:解决过拟合,通常有以下方法:

  1. 增大数据集合 – 使用更多的数据,数据增强(减小数据扰动所造成的影响)
  2. 减少数据特征 – 减少数据维度,高维空间密度小(减小模型复杂度)
  3. 降低模型复杂程度
  4. 正则化方法,或者增大正则项系数
  5. 交叉验证法

方法还有很多,比如重新清洗数据、减少迭代次数、增大学习率、添加噪声数据等,具体需要根据实际问题,选择合适的一种方法或多种方法

交叉验证

交叉验证,主要目的是针对模型的“泛化误差”进行评估,得到模型的“泛化误差”的近似值。当有多个模型可以选择时,我们通常选择“泛化误差”最小的模型。交叉验证的方法有多种,具体可看博主本人另一篇文章:几种交叉验证法

这里主要介绍“K折交叉验证”,再次介绍一下:

  1. 将含有N个样本的数据集(其实是训练集)分成K份,则每份含有N/K个样本,选择其中1份作为测试集,另外K-1份作为训练集。这样的话,测试集就有K种情况。
  2. 在每种情况中,用训练集训练模型,用测试集测试模型,计算模型的测试误差。
  3. 将K种情况下得到的每个模型的测试误差取均值,得到模型最终的测试误差作为泛化误差。

注意:训练集中样本数量要足够多,通常情况下要求要大于总样本数的50%。另外训练集和测试集必须从完整的数据集中均匀取样。均匀取样的目的是希望减少训练集、测试集与原数据集之间的偏差。当样本数量足够多时,通过随机取样,便可以实现均匀取样的效果。

博主本人之前也写过一篇这部分内容的文章,有兴趣的可以结合本博文一起看看:算法中的泛化误差、偏差、方差、噪声的理解

参考:
1、《机器学习》-周志华
2、《统计学习方法》
3、https://www.cnblogs.com/laozhanghahaha/p/12354339.html
4、https://www.zhihu.com/question/27068705
5、https://www.jianshu.com/p/b812e61ddbb9
6、https://www.jianshu.com/p/eb69684f7cf4

    原文作者:data大柳
    原文地址: https://blog.csdn.net/yawei_liu1688/article/details/113783803
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞