【机器学习基础】误差分析

前言

误差是用于衡量模型预测与真实结果的度量,其给出了预测输出与样本真实输出之间的差异。因此,误差分析也是机器学习中不可避免的一环。本文将详细讲述误差分析的过程以及模型过拟合、欠拟合等的原理。

文章参考了UCAS张新峰老师的课件,也是我自己的学习笔记

误差分类

按照误差产生的数据样本不同,可以将误差分为:

  • 训练误差:模型在训练集上的误差
  • 泛化误差:模型在新样本上的误差

训练误差很容易进行分析,因为是在有限的训练样本上进行误差分析,只需要确定好误差(损失)函数,就可以计算得到预测输出和真实结果的差距。但泛化误差由于我们无法获得所有的测试样本,只能通过有限的测试集去计算误差,因此泛化误差分析要更为复杂。模型过拟合欠拟合就是泛化误差分析得到的结果。

泛化误差分析

不妨设有训练集 D t r a i n = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } D_{train} = \{\mathbf (x_1,y_1),(\mathbf x_2,y_2),...,(\mathbf x_n,y_n)\} ,且数据 x \mathbf x 与标签 y y 之间存在真实模型关系如下:
y i = f t r a i n ( x i ) = f t r u e ( x i ) + ε i (1) y_i = f_{train}(\mathbf x_i) = f_{true}(\mathbf x_i) + \varepsilon_i \tag{1}
其中 ε i \varepsilon_i 表示噪声(训练模型和真实模型之间存在误差),均值为0,方差为 σ 2 \sigma^2

在训练集上,我们通过定义误差函数来求解优化得到训练模型 f t r a i n ( x ) f_{train}(\mathbf x) ,误差函数如下:
min w t r a i n E r r ( w , D t r a i n ) = 1 n i = 1 n ( f t r a i n ( x i ) y i ) 2 (2) \min_{\mathbf w}trainErr(\mathbf w,D_{train}) = \frac{1}{n}\sum_{i=1}^n(f_{train}(\mathbf x_i)-y_i)^2 \tag{2}
其中 w \mathbf w 代表要优化的参数。


设测试集 D t e s t = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } D_{test} = \{(\mathbf x_{1}^*,y_{1}^*),(\mathbf x_{2}^*,y_{2}^*),...,(\mathbf x_{m}^*,y_{m}^*)\} ,那么有在该测试集上的测试误差如下:
t e s t E r r ( f t r a i n , D t e s t ) = 1 m i = 1 m ( f t r a i n ( x i ) y i ) (3) testErr(f_{train},D_{test}) = \frac{1}{m}\sum_{i=1}^m(f_{train}(\mathbf x_{i}^*)-y_{i}^*)\tag{3}
该误差也是通过训练集得到的训练模型在测试集 D t e s t D_{test} 上的误差。由于 f t r a i n ( x ) f_{train}(\mathbf x) 依赖于训练集 D t r a i n D_{train} ,因此我们通过采用多份相同样本数(n)的训练集,每一份均与测试集做测试误差,最后得到期望泛化误差(相当于多份测试误差求了期望)。

可得到期望误差计算公式如下:

注意,训练集有多份,测试集是一份,如果你对期望这个说法不习惯,就当是求平均QAQ。

E r r ( X ) = E [ f t r a i n y ] 2 = E [ f t r a i n f t r u e ε ] 2 = E [ f t r a i n f t r u e ] 2 } + σ 2 Err(X) =E[f_{train}-y]^2\\ =E[f_{train}-f_{true}-\varepsilon]^2\\ = E[f_{train}-f_{true}]^2 \}+\sigma_2

这一步稍微有点跳跃,我需要解释一下,前一行的平方项将 f t r a i n f t r u e f_{train}-f_{true} 看作一项, ε \varepsilon 单独看作一项,平方拆开会有三项,中间项有一个 E ( ε ) E(\varepsilon) ,而 ε \varepsilon 均值为0(前文提到),方差为 σ 2 \sigma^2 ,因此中间项消去,第三项应该为 E ( ε 2 ) E(\varepsilon^2) ,由于均值为0, E ( ε 2 ) = σ 2 E(\varepsilon^2) = \sigma^2

接下来我们继续展开:
E r r ( X ) = E [ f t r a i n f t r u e ] 2 } + σ 2 = E [ f t r a i n E ( f t r a i n ) + E ( f t r a i n ) f t r u e ] 2 , 1 , + 1 = E [ ( f t r a i n E ( f t r a i n ) ) 2 ] + E [ ( E ( f t r a i n ) f t r u e ) 2 ] + σ 2 , E ( f t r a i n E ( f t r a i n ) ) = E ( f t r a i n ) E ( f t r a i n ) = 0 Err(X) = E[f_{train}-f_{true}]^2 \}+\sigma_2\\ = E[f_{train}-E(f_{train}) + E(f_{train})-f_{true}]^2, 这里-1,+1操作是为了后面化简\\ = E[(f_{train}-E(f_{train}))^2] + E[(E(f_{train})-f_{true})^2] + \sigma^2,\\E(f_{train}-E(f_{train})) = E(f_{train})-E(f_{train}) = 0,所以中间项消去

注意到 E [ ( f t r a i n E ( f t r a i n ) ) 2 ] = σ 2 ( X ) E[(f_{train}-E(f_{train}))^2] = \sigma^2(X) ,即输入X的方差variance E [ ( E ( f t r a i n ) f t r u e ) 2 ] E[(E(f_{train})-f_{true})^2] 则是训练模型输出期望和真实数据的差距,专有名词叫偏差bias ,所以最终期望泛化误差可以表示为

E r r ( X ) = b i a s 2 ( X ) + σ 2 ( X ) + σ ε 2 Err(X) = bias^2(X)+\sigma^2(X) + \sigma^2_{\varepsilon}

仅从公式推导,可能难以直观理解,下图展示期望泛化误差表达:

在这里插入图片描述

图片来源老师课件

由此我们可以看出:

  • 偏差:直接关系到预测输出与真实输出的差距,偏差越大,说明训练的模型越不准确,表达了模型本身的拟合能力
  • 方差:影响了模型在不同数据集上训练得到的模型与真实输出之间的误差,换句话说即模型的适应性,在这个数据上模型效果很好,但是在另一个数据集上却很差

我们真正需要训练的模型需要达到偏差小,方差小的结果。

解释到这里,基本上已经了解了影响泛化误差的因素,通过分析这些影响因素来达到减小泛化误差的效果。具体的实施就体现在处理过拟合欠拟合的模型上。

过拟合

什么是数据过拟合?简单来说就是模型在训练上太拟合了,导致在真实数据样本上反而准确率不高。体现在泛化误差上,就是低偏差而高方差,所以在神经网络中常常会有一些激活部分神经元,跳过一些神经元的操作,就是为了防止过拟合。下图是过拟合的例子:
在这里插入图片描述

过拟合的处理办法

解决过拟合的方法主要有以下几种

  1. 增加训练样本数量

    过拟合的一种可能是学习的样本数太少,并不难代表大多数广泛的样本

  2. 减少特征维数

    当特征维数过高时,就使得拟合过于贴近,甚至于每个点都要拟合到

  3. 加入正则化项,使模型更平滑

    关于正则化为什么能防止过拟合,可以参考这篇文章

欠拟合

欠拟合是模型尚未学习到数据的一般规律,拟合程度过低,例如非线性的数据用线性模型难以拟合。下图是欠拟合的例子:
在这里插入图片描述

欠拟合的处理办法

通常来说欠拟合就是模型没能学号数据规律,通常有以下几种办法:

  1. 寻找更好的特征,提升对数据的刻画能力

    没能学到数据规律,可能是因为学了一些没用的特征,例如区分男人和女人,选用了起床时间,是否爱熬夜等无关特征

  2. 添加更多的特征

    与上面的类似,就是将一些能够区分不同样本的特征添加到模型当中学习

  3. 换用更复杂的模型

    线性模型没办法处理非线性的数据样本,无论怎么拟合都没用

总结

本文主要重点放在了期望泛化误差分析的推导上,公式的中间过程我都做了详细的解释,这对于理解泛化误差的产生其实是颇有用处的,后续有新的感悟和误差分析方面的内容,我会再更新到本文中。

其实最好的学习效果是模拟一组数据,进行训练学习,找出过拟合和欠拟合的情况,并用解决方法进行处理,这个留到后面做project的时候再一起弄吧 = =。好吧,我就是想偷懒
在这里插入图片描述

发布了47 篇原创文章 · 获赞 100 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/GentleCP/article/details/104951049