集成学习(上)Task03:掌握偏差与方差理论
引入偏差和方差理论的背景:我们希望建立的机器学习模型在测试数据上表现优异,而不是训练集。
1 偏差-方差的权衡
1.1 背景
当我们的模型的训练均方误差达到很小时,测试均方误差反而很大【过拟合】。下面用一张图说明问题:
1.2 偏差-方差权衡的理论基础
从上图的测试均方误差曲线可以看到:测试均方误差曲线呈现U型曲线,这表明了在测试误差曲线中有两种力量在互相博弈。
一般而言,增加模型的复杂度,会增加模型的方差,但是会减少模型的偏差,因此我们要找到一个方差–偏差的权衡,使得测试均方误差最。
测试集的均方误差的期望可以写为:
E
[
(
y
0
−
f
(
x
0
)
^
)
2
]
=
Var
(
f
(
x
0
)
^
)
+
[
Bias
(
f
(
x
0
)
^
)
]
2
+
Var
(
ϵ
)
E[(y_0-\hat{f(x_0)})^2] = {\operatorname{Var} (\hat{f(x_0)})} + {[\operatorname{Bias} (\hat{f(x_0)})]^2} + \operatorname{Var} (\epsilon)
E[(y0−f(x0)^)2]=Var(f(x0)^)+[Bias(f(x0)^)]2+Var(ϵ)
- 第一项为【模型的方差】,用不同的数据集去估计 f f f时,估计函数的改变量。一般来说,模型的复杂度越高, f f f的方差就会越大。因此,我们希望得到一个稳定的模型,也就是在不同的样本集估计的模型都不会相差太大,即要求 f f f的方差越小越好。
- 第二项为【模型的偏差】,为了选择一个简单的模型去估计真实函数所带入的误差。它的构成时复杂的。偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。
- 第三项为【不可约误差】,表示建模任务的难度,这个量在我们的任务确定后是无法改变的。
方差度量的是同一个模型在不同数据集上的稳定性,偏差度量的是单个模型的学习能力。 泛化性能是由数据的充分性【方差】、学习算法的能力【偏差】以及学习任务本身的难度【误差】所共同决定的。
给定学习任务,为了取得好的泛化性能,则需使
(1) 偏差较小,即能够充分拟合数据;
(2) 使方差较小,即使得数据扰动产生的影响小。
用一个图说明偏差和方差两者的关系:
1.3 偏差-方差平衡的具体方法
1.3.1 特征提取法
(1)训练误差修正
先构造一个特征较多的模型使其过拟合,此时训练误差很小而测试误差很大,那这时我们加入关于特征个数的惩罚。因此,当我们的训练误差随着特征个数的增加而减少时,惩罚项因为特征数量的增加而增大,抑制了训练误差随着特征个数的增加而无休止地减小。
(2)交叉检验
交叉验证可以对测试误差的直接估计。
常用的是 K K K折交叉验证:
我们把训练样本分成K等分,然后用 K − 1 K-1 K−1个样本集当做训练集,剩下的一份样本集为验证集去估计由 K − 1 K-1 K−1个样本集得到的模型的精度,这个过程重复 K K K次取平均值得到测试误差的一个估计 C V ( K ) = 1 K ∑ i = 1 K M S E i CV_{(K)} = \frac{1}{K}\sum\limits_{i=1}^{K}MSE_i CV(K)=K1i=1∑KMSEi。
5折交叉验证如下图:(蓝色的是训练集,黄色的是验证集)
在测试误差能够被合理的估计出来以后,我们做特征选择的目标就是:从
p
p
p个特征中选择
m
m
m个特征,使得对应的模型的测试误差的估计最小。对应的方法有:
-
最优子集选择:
(i) 记不含任何特征的模型为 M 0 M_0 M0,计算这个 M 0 M_0 M0的测试误差。
(ii) 在 M 0 M_0 M0基础上增加一个变量,计算 p p p个模型的 R S S RSS RSS,选择 R S S RSS RSS最小的模型记作 M 1 M_1 M1,并计算该模型 M 1 M_1 M1的测试误差。
(iii) 再增加变量,计算 p − 1 p-1 p−1个模型的 R S S RSS RSS,并选择RSS最小的模型记作 M 2 M_2 M2,并计算该模型 M 2 M_2 M2的测试误差。
(iv) 重复以上过程直至拟合的模型有 p p p个特征为止,并选择 p + 1 p+1 p+1个模型 { M 0 , M 1 , . . . , M p } \{M_0,M_1,...,M_p \} {M0,M1,...,Mp}中测试误差最小的模型作为最优模型。 -
向前逐步选择:最优子集选择虽然在原理上很直观,但是随着数据特征维度 p p p的增加,子集的数量为 2 p 2^p 2p,计算效率非常低下且需要的计算内存也很高,在大数据的背景下显然不适用。因此,我们需要把最优子集选择的运算效率提高,因此向前逐步选择算法的过程如下:
(i) 记不含任何特征的模型为 M 0 M_0 M0,计算这个 M 0 M_0 M0的测试误差。
(ii) 在 M 0 M_0 M0基础上增加一个变量,计算 p p p个模型的 R S S RSS RSS,选择 R S S RSS RSS最小的模型记作 M 1 M_1 M1,并计算该模型 M 1 M_1 M1的测试误差。
(iii) 在最小的 R S S RSS RSS模型下继续增加一个变量,选择 R S S RSS RSS最小的模型记作 M 2 M_2 M2,并计算该模型 M 2 M_2 M2的测试误差。
(iv) 以此类推,重复以上过程直至拟合的模型有 p p p个特征为止,并选择 p + 1 p+1 p+1个模型 { M 0 , M 1 , . . . , M p } \{M_0,M_1,...,M_p \} {M0,M1,...,Mp}中测试误差最小的模型作为最优模型。
1.3.2 压缩估计法
除了刚刚讨论的直接对特征自身进行选择以外,我们还可以对回归的系数进行约束或者加罚的技巧对 p p p个特征的模型进行拟合,显著降低模型方差,这样也会提高模型的拟合效果。具体来说,就是将回归系数往零的方向压缩。
(1)岭回归(L2
正则化的例子):
在线性回归中,我们的损失函数为
J
(
w
)
=
∑
i
=
1
N
(
y
i
−
w
0
−
∑
j
=
1
p
w
j
x
i
j
)
2
J(w) = \sum\limits_{i=1}^{N}(y_i-w_0-\sum\limits_{j=1}^{p}w_jx_{ij})^2
J(w)=i=1∑N(yi−w0−j=1∑pwjxij)2,我们在线性回归的损失函数的基础上添加对系数的约束或者惩罚,即:
J ( w ) = ∑ i = 1 N ( y i − w 0 − ∑ j = 1 p w j x i j ) 2 + λ ∑ j = 1 p w j 2 , 其 中 , λ ≥ 0 w ^ = ( X T X + λ I ) − 1 X T Y \begin{aligned} J(w) & = \sum\limits_{i=1}^{N}(y_i-w_0-\sum\limits_{j=1}^{p}w_jx_{ij})^2 + \lambda\sum\limits_{j=1}^{p}w_j^2,\;\;其中,\lambda \ge 0\\ \hat{w} & = (X^TX + \lambda I)^{-1}X^TY \end{aligned} J(w)w^=i=1∑N(yi−w0−j=1∑pwjxij)2+λj=1∑pwj2,其中,λ≥0=(XTX+λI)−1XTY
调节参数 λ \lambda λ的大小是影响压缩估计的关键, λ \lambda λ越大,惩罚的力度越大,系数则越趋近于0,因此,选择合适的 λ \lambda λ对模型精度来说十分重要。岭回归通过牺牲线性回归的无偏性降低方差,有可能使得模型整体的测试误差较小,提高模型的泛化能力。
(2)Lasso回归(L1
正则化的例子):
岭回归的一个很显著的特点是:将模型的系数往零的方向压缩,但是岭回归的系数只能无限趋于0但无法等于0,换句话说,就是无法做特征选择。能否使用压缩估计的思想做到像特征最优子集选择那样提取出重要的特征呢?答案是肯定的!我们只需要对岭回归的优化函数做小小的调整就行了,我们使用系数向量的L1
范数替换岭回归中的L2
范数:
J
(
w
)
=
∑
i
=
1
N
(
y
i
−
w
0
−
∑
j
=
1
p
w
j
x
i
j
)
2
+
λ
∑
j
=
1
p
∣
w
j
∣
,
其
中
,
λ
≥
0
J(w) = \sum\limits_{i=1}^{N}(y_i-w_0-\sum\limits_{j=1}^{p}w_jx_{ij})^2 + \lambda\sum\limits_{j=1}^{p}|w_j|,\;\;其中,\lambda \ge 0
J(w)=i=1∑N(yi−w0−j=1∑pwjxij)2+λj=1∑p∣wj∣,其中,λ≥0
1.3.3 降维的方法
到目前为止,我们所讨论的方法对方差的控制有两种方式:一种是使用原始变量的子集,另一种是将变量系数压缩至零。但是这些方法都是基于原始特征 x 1 , . . . , x p x_1,...,x_p x1,...,xp得到的,现在我们探讨一类新的方法:将原始的特征空间投影到一个低维的空间实现变量的数量变少,如:将二维的平面投影至一维空间。
机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x → y f : x \to y f:x→y,其中 x x x是原始数据点的表达,目前最多使用向量表达形式; y y y是数据点映射后的低维向量表达,通常 y y y的维度小于 x x x的维度(当然提高维度也是可以的)。 f f f可能是显式的或隐式的、线性的或非线性的。
之所以使用降维后的数据表示是因为在原始的高维空间中,包含有冗余信息以及噪音信息,在实际应用例如图像识别中造成了误差,降低了准确率;而通过降维,我们希望减少冗余信息所造成的误差,提高识别(或其他应用)的精度。又或者希望通过降维算法来寻找数据内部的本质结构特征。在很多算法中,降维算法成为了数据预处理的一部分,如PCA
。事实上,有一些算法如果没有降维预处理,其实是很难得到很好的效果的。
主成分分析(PCA
)法:
主成分分析的思想:通过最大投影方差将原始空间进行重构,即由特征相关重构为无关,即落在某个方向上的点(投影)的方差最大。在进行下一步推导之前,我们先把样本均值和样本协方差矩阵推广至矩阵形式:
样本均值:
x
ˉ
=
1
N
∑
i
=
1
N
x
i
=
1
N
X
T
1
N
,
其
中
1
N
=
(
1
,
1
,
.
.
.
,
1
)
N
T
\bar{x} = \frac{1}{N}\sum\limits_{i=1}^{N}x_i = \frac{1}{N}X^T1_N,\;\;\;其中1_N = (1,1,...,1)_{N}^T
xˉ=N1i=1∑Nxi=N1XT1N,其中1N=(1,1,...,1)NT
样本协方差矩阵:
S
2
=
1
N
∑
i
=
1
N
(
x
i
−
x
ˉ
)
(
x
i
−
x
ˉ
)
T
=
1
N
X
T
H
X
,
其
中
,
H
=
I
N
−
1
N
1
N
1
N
T
S^2 = \frac{1}{N}\sum\limits_{i=1}^{N}(x_i-\bar{x})(x_i-\bar{x})^T = \frac{1}{N}X^THX,\;\;\;其中,H = I_N - \frac{1}{N}1_N1_N^T
S2=N1i=1∑N(xi−xˉ)(xi−xˉ)T=N1XTHX,其中,H=IN−N11N1NT
最大投影方差的步骤:
(i) 中心化:
x
i
−
x
ˉ
x_i - \bar{x}
xi−xˉ
(ii) 计算每个点
x
1
,
.
.
.
,
x
N
x_1,...,x_N
x1,...,xN至
u
⃗
1
\vec{u}_1
u1方向上的投影:
(
x
i
−
x
ˉ
)
u
⃗
1
,
∣
∣
u
⃗
1
∣
∣
=
1
(x_i-\bar{x})\vec{u}_1,\;\;\;||\vec{u}_1|| = 1
(xi−xˉ)u1,∣∣u1∣∣=1
(iii) 计算投影方差:
J
=
1
N
∑
i
=
1
N
[
(
x
i
−
x
ˉ
)
T
u
⃗
1
]
2
,
∣
∣
u
⃗
1
∣
∣
=
1
J = \frac{1}{N}\sum\limits_{i=1}^{N}[(x_i-\bar{x})^T\vec{u}_1]^2,\;\;\;||\vec{u}_1|| = 1
J=N1i=1∑N[(xi−xˉ)Tu1]2,∣∣u1∣∣=1
(iv) 最大化投影方差求
u
⃗
1
\vec{u}_1
u1:
u
ˉ
1
=
a
r
g
m
a
x
u
1
1
N
∑
i
=
1
N
[
(
x
i
−
x
ˉ
)
T
u
⃗
1
]
2
s
.
t
.
u
⃗
1
T
u
⃗
1
=
1
\bar{u}_1 = argmax_{u_1}\;\;\frac{1}{N}\sum\limits_{i=1}^{N}[(x_i-\bar{x})^T\vec{u}_1]^2 \\ \;\;\;s.t. \vec{u}_1^T\vec{u}_1 = 1
uˉ1=argmaxu1N1i=1∑N[(xi−xˉ)Tu1]2s.t.u1Tu1=1
得到:
J
=
1
N
∑
i
=
1
N
[
(
x
i
−
x
ˉ
)
T
u
⃗
1
]
2
=
1
N
∑
i
=
1
N
[
u
⃗
1
T
(
x
i
−
x
ˉ
)
(
x
i
−
x
ˉ
)
T
u
⃗
1
]
=
u
⃗
1
T
[
1
N
∑
i
=
1
N
(
x
i
−
x
ˉ
)
(
x
i
−
x
ˉ
)
T
]
u
⃗
1
=
u
⃗
1
T
S
2
u
⃗
1
\begin{aligned} J & = \frac{1}{N}\sum\limits_{i=1}^{N}[(x_i-\bar{x})^T\vec{u}_1]^2 \\ & = \frac{1}{N}\sum\limits_{i=1}^{N}[\vec u_1^T(x_i-\bar{x})(x_i-\bar{x})^T\vec u_1] \\ & = \vec u_1^T[\frac{1}{N}\sum\limits_{i=1}^{N}(x_i-\bar{x})(x_i - \bar{x})^T] \vec u_1 \\ & = \vec u_1^TS^2 \vec u_1 \end{aligned}
J=N1i=1∑N[(xi−xˉ)Tu1]2=N1i=1∑N[u1T(xi−xˉ)(xi−xˉ)Tu1]=u1T[N1i=1∑N(xi−xˉ)(xi−xˉ)T]u1=u1TS2u1
即:
u
⃗
1
^
=
a
r
g
m
a
x
u
⃗
1
u
⃗
1
T
S
2
u
⃗
1
,
s
.
t
.
u
⃗
1
T
u
⃗
1
=
1
L
(
u
⃗
1
,
λ
)
=
u
⃗
1
T
S
2
u
⃗
1
+
λ
(
1
−
u
⃗
1
T
u
⃗
1
)
∂
L
∂
u
⃗
1
=
2
S
2
u
⃗
1
−
2
λ
u
⃗
1
=
0
\begin{aligned} \hat{\vec u_1} & = argmax_{\vec u_1} \vec u_1^TS^2 \vec u_1,\;\;\; \\ s.t. \vec u_1^T \vec u_1 & = 1\\ L(\vec u_1,\lambda) & = \vec u_1^TS^2 \vec u_1 + \lambda (1- \vec u_1^T \vec u_1)\\ \frac{\partial L}{\partial \vec u_1} & = 2S^2 \vec u_1-2\lambda \vec u_1 = 0\\ \end{aligned}
u1^s.t.u1Tu1L(u1,λ)∂u1∂L=argmaxu1u1TS2u1,=1=u1TS2u1+λ(1−u1Tu1)=2S2u1−2λu1=0
即:
S
2
u
⃗
1
=
λ
u
⃗
1
S^2\vec u_1 = \lambda \vec u_1
S2u1=λu1
可以看到:
λ
\lambda
λ为
S
2
S^2
S2的特征值,
u
⃗
1
\vec u_1
u1为
S
2
S^2
S2的特征向量。因此我们只需要对中心化后的协方差矩阵进行特征值分解,得到的特征向量即为投影方向。如果需要进行降维,那么只需要取
p
p
p的前
M
M
M个特征向量即可。