前言
误差是用于衡量模型预测与真实结果的度量,其给出了预测输出与样本真实输出之间的差异。因此,误差分析也是机器学习中不可避免的一环。本文将详细讲述误差分析的过程以及模型过拟合、欠拟合等的原理。
文章参考了UCAS张新峰老师的课件,也是我自己的学习笔记
误差分类
按照误差产生的数据样本不同,可以将误差分为:
- 训练误差:模型在训练集上的误差
- 泛化误差:模型在新样本上的误差
训练误差很容易进行分析,因为是在有限的训练样本上进行误差分析,只需要确定好误差(损失)函数,就可以计算得到预测输出和真实结果的差距。但泛化误差由于我们无法获得所有的测试样本,只能通过有限的测试集去计算误差,因此泛化误差分析要更为复杂。模型过拟合与欠拟合就是泛化误差分析得到的结果。
泛化误差分析
不妨设有训练集
Dtrain={(x1,y1),(x2,y2),...,(xn,yn)},且数据
x与标签
y之间存在真实模型关系如下:
yi=ftrain(xi)=ftrue(xi)+εi(1)
其中
εi表示噪声(训练模型和真实模型之间存在误差),均值为0,方差为
σ2。
在训练集上,我们通过定义误差函数来求解优化得到训练模型
ftrain(x),误差函数如下:
wmintrainErr(w,Dtrain)=n1i=1∑n(ftrain(xi)−yi)2(2)
其中
w代表要优化的参数。
设测试集
Dtest={(x1∗,y1∗),(x2∗,y2∗),...,(xm∗,ym∗)},那么有在该测试集上的测试误差如下:
testErr(ftrain,Dtest)=m1i=1∑m(ftrain(xi∗)−yi∗)(3)
该误差也是通过训练集得到的训练模型在测试集
Dtest上的误差。由于
ftrain(x)依赖于训练集
Dtrain,因此我们通过采用多份相同样本数(n)的训练集,每一份均与测试集做测试误差,最后得到期望泛化误差(相当于多份测试误差求了期望)。
可得到期望误差计算公式如下:
注意,训练集有多份,测试集是一份,如果你对期望这个说法不习惯,就当是求平均QAQ。
Err(X)=E[ftrain−y]2=E[ftrain−ftrue−ε]2=E[ftrain−ftrue]2}+σ2
这一步稍微有点跳跃,我需要解释一下,前一行的平方项将
ftrain−ftrue看作一项,
ε单独看作一项,平方拆开会有三项,中间项有一个
E(ε),而
ε均值为0(前文提到),方差为
σ2,因此中间项消去,第三项应该为
E(ε2),由于均值为0,
E(ε2)=σ2
接下来我们继续展开:
Err(X)=E[ftrain−ftrue]2}+σ2=E[ftrain−E(ftrain)+E(ftrain)−ftrue]2,这里−1,+1操作是为了后面化简=E[(ftrain−E(ftrain))2]+E[(E(ftrain)−ftrue)2]+σ2,E(ftrain−E(ftrain))=E(ftrain)−E(ftrain)=0,所以中间项消去
注意到
E[(ftrain−E(ftrain))2]=σ2(X),即输入X的方差variance
,
E[(E(ftrain)−ftrue)2]则是训练模型输出期望和真实数据的差距,专有名词叫偏差bias
,所以最终期望泛化误差可以表示为
Err(X)=bias2(X)+σ2(X)+σε2
仅从公式推导,可能难以直观理解,下图展示期望泛化误差表达:
图片来源老师课件
由此我们可以看出:
- 偏差:直接关系到预测输出与真实输出的差距,偏差越大,说明训练的模型越不准确,表达了模型本身的拟合能力
- 方差:影响了模型在不同数据集上训练得到的模型与真实输出之间的误差,换句话说即模型的适应性,在这个数据上模型效果很好,但是在另一个数据集上却很差
我们真正需要训练的模型需要达到偏差小
,方差小
的结果。
解释到这里,基本上已经了解了影响泛化误差的因素,通过分析这些影响因素来达到减小泛化误差的效果。具体的实施就体现在处理过拟合
和欠拟合
的模型上。
过拟合
什么是数据过拟合?简单来说就是模型在训练上太拟合了,导致在真实数据样本上反而准确率不高。体现在泛化误差上,就是低偏差而高方差,所以在神经网络中常常会有一些激活部分神经元,跳过一些神经元的操作,就是为了防止过拟合。下图是过拟合的例子:
过拟合的处理办法
解决过拟合的方法主要有以下几种
- 增加训练样本数量
过拟合的一种可能是学习的样本数太少,并不难代表大多数广泛的样本
- 减少特征维数
当特征维数过高时,就使得拟合过于贴近,甚至于每个点都要拟合到
- 加入正则化项,使模型更平滑
关于正则化为什么能防止过拟合,可以参考这篇文章
欠拟合
欠拟合是模型尚未学习到数据的一般规律,拟合程度过低,例如非线性的数据用线性模型难以拟合。下图是欠拟合的例子:
欠拟合的处理办法
通常来说欠拟合就是模型没能学号数据规律,通常有以下几种办法:
- 寻找更好的特征,提升对数据的刻画能力
没能学到数据规律,可能是因为学了一些没用的特征,例如区分男人和女人,选用了起床时间,是否爱熬夜等无关特征
- 添加更多的特征
与上面的类似,就是将一些能够区分不同样本的特征添加到模型当中学习
- 换用更复杂的模型
线性模型没办法处理非线性的数据样本,无论怎么拟合都没用
总结
本文主要重点放在了期望泛化误差分析的推导上,公式的中间过程我都做了详细的解释,这对于理解泛化误差的产生其实是颇有用处的,后续有新的感悟和误差分析方面的内容,我会再更新到本文中。
其实最好的学习效果是模拟一组数据,进行训练学习,找出过拟合和欠拟合的情况,并用解决方法进行处理,这个留到后面做project的时候再一起弄吧 = =。好吧,我就是想偷懒