这里有一个谜题:
下列序列的下一个数值是?
1,3,5,7,?
一个正确的解:217314
是不是感觉不可置信?正常人脑海蹦出来的第一个答案应该是‘9’。但‘217314’的确也是一个正确的答案:
假设函数:
f(x)=181112x4−90555x3+6338852x2−452773x+217331
f
(
x
)
=
18111
2
x
4
−
90555
x
3
+
633885
2
x
2
−
452773
x
+
217331
有:
f(1)=1
f
(
1
)
=
1
f(2)=3
f
(
2
)
=
3
f(3)=5
f
(
3
)
=
5
f(4)=7
f
(
4
)
=
7
f(5)=217314
f
(
5
)
=
217314
当机器学习算法尝试预测的时候,通常都需要把握一个非常微妙的平衡。一方面,我们希望我们的算法模型能够非常匹配训练数据,否则会丢失相关特征和有趣的趋势;但是,另一方面,我们又不想我们的模型过分匹配训练数据,因为这样存在过度解析所有异常值和伪规律的风险。导致模型泛化能力差
福岛
福岛核泄漏事件就是一个过拟合的灾难性例子。当设计核电站的时候,工程师需要确定地震多久发生一次。他们采用了一个著名的定律——古登堡-理查德定律。该定律给出了一种基于每次弱地震发生的频率来预测一次强地震发生的概率的方法。这点非常有用,因为地质学家记录了频繁发生的弱地震,所以工程师就有非常大的数据集来构建模型。也许这个定律最重要的结果是:地震等级和发生概率的对数是线性关系。
核电站的工程师使用了过去400年的地震数据训练了一个回归模型。他们的预测看起来类似如下图:
菱形表示实际数据,细线代表回归结果。显然,这条线非常拟合实际数据。事实上,模型在地震等级7.3地方有了非线性的变化。在这个场景中,尽管工程师知道关系应该是线性的,但他们还是使用了一个更加复杂的模型。
如果使用的是正确的线性模型的话,结果应该如下图所示:
过拟合模型预测9级以上的地震每13000年才会发生一次,而正确的模型预测的结果是每300年才会发生。正因为这样,福岛核电站设计只考虑了抵抗8.6级的地震。结果,2011年爆发了9级地震。。
欠拟合
当开始尝试降低过拟合的时候,我们可能会走入另一个极端,也就是我们的模型忽略了数据集中重要的特征。我们会选择一个不够复杂的模型,比如需要二次模型,而使用的是一个线性模型。
偏差-方差困境
对应过拟合和欠拟合,在机器学习中存在两个非常重要的概念:偏差(对应欠拟合)、方差(对应过拟合)。
所谓偏差-方差困境,就是说没有办法同时降低偏差和方差。你只能在他们之间取得均衡。对应到模型就是,你想降低偏差,所以你会增加模型的复杂度,防止欠拟合;但是你又不能让模型太复杂而导致方差增加,造成过拟合。在模型的复杂度上,需要找到一个平衡点。下面这个图能比较形象的说明这点:
分析训练误差和测试误差
复杂度低会导致训练误差和测试误差都偏高。我们从上图的左边可以获知。这是因为模型本质上缺少足够的复杂度来刻画数据。
另一方面,高复杂度模型会得到低的训练误差,但测试误差会很高。上图的右边就是这样的。这是因为复杂模型可能过分的拟合了训练数据,因此不能很好的泛化到测试数据上。
噪音
给定训练数据,建模的目的就是找到一个完美的函数来拟合它们。假设获取的训练数据没有任何噪声的话,数学定义上应该是类似这样的:
y=f(x)
y
=
f
(
x
)
,其中f(x) 是(训练得到的)理想函数(模型)。y是训练数据(的实际值)
但现实情况是,我们没法获得完全没有噪声的数据,所以,通常在理想函数外,还存在无法避免的随机误差。所以,实际的的数学定义应该是这样的:
y=f(x)+ϵ
y
=
f
(
x
)
+
ϵ
其中ϵ为随机误差。
机器学习算法的目的就是要从这些包含噪声的数据中找到(或者尽可能的接近)这个理想模型。也就是要构建一个
f^(x)
f
^
(
x
)
,作为
f(x)
f
(
x
)
的近似。
偏差-方差分解推导
博主提醒:这部分内容是本博客的精华部分。推导模型误差如何可以分解为偏差,方差以及随机误差的博客很多。但我感觉这篇是讲的最清楚的。
从前面,我们知道:
y=f(x)+ϵ
y
=
f
(
x
)
+
ϵ
。其中, ϵ服从正态分布,期望为0,方差为
σ2
σ
2
。我们的目的是找到
f^(x)
f
^
(
x
)
来近似
f(x)
f
(
x
)
。
现在,我们想要证明用
f^(x)
f
^
(
x
)
来拟合训练数据y的误差可以分解为偏差、方差和随机误差(不可消除),也就是:
(均方误差) (1)
其中,
这是偏差,衡量模型——
f^(x)
f
^
(
x
)
和实际模型
f(x)
f
(
x
)
之间的差距;作为欠拟合的一个指标。
这项是方差。
最后一项
σ2
σ
2
是随机误差(不可避免的误差)。
我们注意到,因为偏差项和方差项都是非负的,所以 σ2 σ 2 就是均方误差的下限,也就是模型的整体误差不能小于 σ2 σ 2
下面开始推导恒等式(1):
E[(y−f^(x))2]
E
[
(
y
−
f
^
(
x
)
)
2
]
=
E[y2−2yf^+f^2]
E
[
y
2
−
2
y
f
^
+
f
^
2
]
(为了简化,
f^(x)
f
^
(
x
)
用
f^
f
^
表示)
=
E[y2]+E[f^2]−E[2yf^]
E
[
y
2
]
+
E
[
f
^
2
]
−
E
[
2
y
f
^
]
对于上式的前面两项,通过方差的定义:
Var[y]=E[y2]−E[y]2
V
a
r
[
y
]
=
E
[
y
2
]
−
E
[
y
]
2
(2)
Var[f^]=E[f^2]−E[f^]2
V
a
r
[
f
^
]
=
E
[
f
^
2
]
−
E
[
f
^
]
2
(3)
由(2),(3)可得到:
E[y2]=Var[y]+E[y]2
E
[
y
2
]
=
V
a
r
[
y
]
+
E
[
y
]
2
(4)
E[f^2]=Var[f^]+E[f^]2
E
[
f
^
2
]
=
V
a
r
[
f
^
]
+
E
[
f
^
]
2
(5)
而第三项,直接利用期望的性质,可得到:
E[2yf^]=2E[y]E[f^]
E
[
2
y
f
^
]
=
2
E
[
y
]
E
[
f
^
]
又因为
y=f+ϵ
y
=
f
+
ϵ
,切ϵ的均值为0,所以:
E[y]=E[f+ϵ]=E[f]=f
E
[
y
]
=
E
[
f
+
ϵ
]
=
E
[
f
]
=
f
(6)
(
E(f)=f
E
(
f
)
=
f
成立的原因是因为f是一个确定的函数。它在任一点的平均值就是该点的函数取值)。因此:
E[2yf^]=2fE[f^]
E
[
2
y
f
^
]
=
2
f
E
[
f
^
]
(7)
将(4),(5),(7)代入等式(1),得到:
E[(y−f^(x))2]=E[y2]+E[f^2]−E[2yf^]
E
[
(
y
−
f
^
(
x
)
)
2
]
=
E
[
y
2
]
+
E
[
f
^
2
]
−
E
[
2
y
f
^
]
=Var[y]+E[y]2+Var[f^]+E[f^]2−2fE[f^]
=
V
a
r
[
y
]
+
E
[
y
]
2
+
V
a
r
[
f
^
]
+
E
[
f
^
]
2
−
2
f
E
[
f
^
]
=Var[y]+Var[f^]+(E[y]2−−2fE[f^]+E[f^]2)
=
V
a
r
[
y
]
+
V
a
r
[
f
^
]
+
(
E
[
y
]
2
−
−
2
f
E
[
f
^
]
+
E
[
f
^
]
2
)
(又因为
E[y]=f
E
[
y
]
=
f
),
=Var[y]+Var[f^]+(f2−−2fE[f^]+E[f^]2)
=
V
a
r
[
y
]
+
V
a
r
[
f
^
]
+
(
f
2
−
−
2
f
E
[
f
^
]
+
E
[
f
^
]
2
)
=Var[y]+Var[f^]+(f−E[f^])2
=
V
a
r
[
y
]
+
V
a
r
[
f
^
]
+
(
f
−
E
[
f
^
]
)
2
再次利用f是完全确定这一点,以及期望的线性性质,我们可以得到:
Bias[f^]=E[f^−f]=E[f^]−E[f]=E[f^]−f
B
i
a
s
[
f
^
]
=
E
[
f
^
−
f
]
=
E
[
f
^
]
−
E
[
f
]
=
E
[
f
^
]
−
f
,
求平方,即:
Bias[f^]2=(E[f^]−f)2
B
i
a
s
[
f
^
]
2
=
(
E
[
f
^
]
−
f
)
2
.
所以,
E[(y−f^(x))2]=Var[y]+Var[f^]+Bias[f^]2
E
[
(
y
−
f
^
(
x
)
)
2
]
=
V
a
r
[
y
]
+
V
a
r
[
f
^
]
+
B
i
a
s
[
f
^
]
2
到此,等式(1)右边的三项,我们已经分解出(偏差和方差)这两项。现在剩下要如何从
Var[y]
V
a
r
[
y
]
中导出
σ2
σ
2
来。
Var[y]=E[(y−E[y])2]
V
a
r
[
y
]
=
E
[
(
y
−
E
[
y
]
)
2
]
=E[(y−f)2]
=
E
[
(
y
−
f
)
2
]
=E[(f+ϵ−f)2]
=
E
[
(
f
+
ϵ
−
f
)
2
]
=E[ϵ2]
=
E
[
ϵ
2
]
=Var[ϵ]+E[ϵ]2
=
V
a
r
[
ϵ
]
+
E
[
ϵ
]
2
=σ2
=
σ
2
(第一行:方差的定义;
第二行:
E[y]=f
E
[
y
]
=
f
第三行:y = f + ϵ
第五行:方差的定义
第六行:
E[ϵ]=0,以及Var[ϵ]=σ2
E
[
ϵ
]
=
0
,
以
及
V
a
r
[
ϵ
]
=
σ
2
至此,我们推导出了(1)式。
解决(偏差-方差)困境
如何发现是否存在过拟合(高方差)或者欠拟合(高偏差):交叉验证
高偏差处理方法:(1) 增加特征;(2)boosting方法;
高方差处理方法:(1)降维;(2)增加更多训练数据;(3)增加正则化;(4)bagging方法
参考: https://ml.berkeley.edu/blog/2017/07/13/tutorial-4/
注:本博客并非完全逐字逐句对原文进行翻译。基本属于一种记笔记式的翻译。不重要的地方几乎都去掉了。重要的地方加入了自己的理解和补充。