机器学习中的集成学习有两个重要的策略,即Bagging与Boosting。
偏差方差
偏差指的是算法的期望预测与真实值之间的偏差程度,反映了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。
当模型越复杂时,拟合能力就越好,模型的偏差就越好。但此时如果换一组数据可能模型的变化就会很大,即模型方差变大,所以复杂的模型容易造成过拟合;当模型简单的时候,即使换一组数据,得出的学习器分类效果与之前分类器的效果也不会很大,即模型方差很小,但由于模型过于简单,导致偏差会很大。
也就是说当我们建立模型时,偏差和方差都需要照顾到,一个也不能漏掉。
E
(
C
)
=
C
E(C)=C
E(C)=C
E
(
C
X
)
=
C
E
(
X
)
E(CX)=CE(X)
E(CX)=CE(X)
E
(
X
+
Y
)
=
E
(
X
)
+
E
(
Y
)
E(X+Y)=E(X)+E(Y)
E(X+Y)=E(X)+E(Y)
D
(
C
)
=
0
D(C)=0
D(C)=0
D
(
C
X
)
=
C
2
D
(
X
)
D(CX)=C^{2}D(X)
D(CX)=C2D(X)
D
(
X
±
Y
)
=
D
(
X
)
+
D
(
Y
)
D(X \pm Y)=D(X)+D(Y)
D(X±Y)=D(X)+D(Y) 当X、Y相互独立。
Bagging
算法构建多个分类器,每个分类器都随机从原样本中做有放回的抽样,利用这些采样后的样本训练该分类器,然后将这些分类器组合起来构成一个更强效果更好的组合分类器,结果一般使用多数投票效果就很好了。其代表算法为随机森林。
对于Bagging算法来说,由于我们并行的训练很多的分类器的目的就是降低这个方差。所以对于每个基分类器的目的就是如何降低这个偏差,所以我们会采用深度很深并且不剪枝的决策树。这也是为什么随机森林的树的深度往往大于GBDT的树的深度的原因。
为什么能降低方差
对每个样本
x
x
x,假设单模型(如决策树)在不同数据集上学习得到的模型对样本
x
x
x的输出服从某种分布
Γ
\Gamma
Γ,
G
1
(
x
)
,
G
2
(
x
)
,
.
.
.
,
G
n
(
x
)
G_{1}(x),G_{2}(x),...,G_{n}(x)
G1(x),G2(x),...,Gn(x)为来自分布
Γ
\Gamma
Γ独立同分布的随机变量,Bagging的集成策略为对弱学习器求平均,即得到模型
F
(
x
)
F(x)
F(x):
F
(
x
)
=
G
1
(
x
)
+
G
2
(
x
)
+
⋯
G
n
(
x
)
n
F(x)=\frac{G_{1}(x)+G_{2}(x)+\cdots G_{n}(x)}{n}
F(x)=nG1(x)+G2(x)+⋯Gn(x)
设随机变量
G
i
G_{i}
Gi的方差为
σ
2
\sigma^{2}
σ2,则
V
a
r
(
F
(
x
)
)
=
V
a
r
(
G
1
(
x
)
+
G
2
(
x
)
+
⋯
G
n
(
x
)
n
)
=
V
a
r
(
G
1
(
x
)
n
+
G
2
(
x
)
n
+
⋯
G
n
(
x
)
n
)
=
V
a
r
(
G
1
(
x
)
n
)
+
V
a
r
(
G
2
(
x
)
n
)
+
⋯
+
V
a
r
(
G
n
(
x
)
n
)
=
σ
2
n
2
∗
n
=
σ
2
n
Var(F(x))= Var(\frac{G_{1}(x)+G_{2}(x)+\cdots G_{n}(x)}{n})=Var(\frac{G_{1}(x)}{n}+\frac{G_{2}(x)}{n}+\cdots \frac{G_{n}(x)}{n})=Var(\frac{G_{1}(x)}{n})+Var(\frac{G_{2}(x)}{n})+\cdots+Var(\frac{G_{n}(x)}{n})=\frac{\sigma^{2} }{n^{2}}*n=\frac{\sigma^{2} }{n}
Var(F(x))=Var(nG1(x)+G2(x)+⋯Gn(x))=Var(nG1(x)+nG2(x)+⋯nGn(x))=Var(nG1(x))+Var(nG2(x))+⋯+Var(nGn(x))=n2σ2∗n=nσ2
可以看到Bagging集成之后方差变小了,也就是说在不同数据集上训练得到的模型对样本的预测值之间的差距变小。
若各子模型完全相同,而不是完全独立,则
V
a
r
(
F
(
x
)
)
=
V
a
r
(
G
1
(
x
)
+
G
2
(
x
)
+
⋯
G
n
(
x
)
n
)
=
V
a
r
(
G
1
(
x
)
n
+
G
2
(
x
)
n
+
⋯
G
n
(
x
)
n
)
=
σ
2
Var(F(x))= Var(\frac{G_{1}(x)+G_{2}(x)+\cdots G_{n}(x)}{n})=Var(\frac{G_{1}(x)}{n}+\frac{G_{2}(x)}{n}+\cdots \frac{G_{n}(x)}{n})=\sigma^{2}
Var(F(x))=Var(nG1(x)+G2(x)+⋯Gn(x))=Var(nG1(x)+nG2(x)+⋯nGn(x))=σ2
此时不会降低variance。bagging方法得到的各子模型是有一定相关性的,属于上面两个极端状况的中间态,因此可以一定程度降低variance。为了进一步降低variance,Random forest通过随机选取变量子集做拟合的方式de-correlated了各子模型(树),使得variance进一步降低。
为什么偏差不变
由于子样本集的相似性以及使用的是同种模型,因此各模型有近似相等的bias和variance(事实上,各模型的分布也近似相同,但不独立)。假设单个模型
G
i
(
x
)
G_{i}(x)
Gi(x)的样本
x
x
x预测值的期望
μ
\mu
μ,即
E
(
G
i
(
x
)
)
=
μ
E(G_i(x))=μ
E(Gi(x))=μ
则
E
(
F
(
x
)
)
=
E
(
G
1
(
x
)
+
G
2
(
x
)
+
⋯
G
n
(
x
)
n
)
=
1
n
E
(
G
1
(
x
)
+
G
2
(
x
)
+
⋯
G
n
(
x
)
)
=
μ
E(F(x))=E(\frac{G_{1}(x)+G_{2}(x)+\cdots G_{n}(x)}{n})=\frac{1}{n}E(G_{1}(x)+G_{2}(x)+\cdots G_{n}(x))=\mu
E(F(x))=E(nG1(x)+G2(x)+⋯Gn(x))=n1E(G1(x)+G2(x)+⋯Gn(x))=μ
单个模型和集成之后的模型关于样本的预测值的期望一样,因此单个模型的偏差决定集成之后的模型的偏差,因此要尽量选择偏差比较小的单模型,通常来说模型越复杂偏差越小,因此尽量选择比较复杂的单模型,如深度很深或者不剪枝的决策树。
Boosting
算法通过迭代构建一系列的分类器,每次分类都将上一次分错的数据权重提高一点再进行下一个分类器分类,这样最终得到的分类器在测试数据与训练数据上都可以得到比较好的成绩。其代表算法为AdaBoost、GBDT、XGBoost。
而对于Boosting来说,每一步我们都会在上一轮的基础上更加的拟合原数据,所以可以保证偏差,所以对于每个基分类器来说,问题就是如何选择方差更小的分类器,即更简单的弱分类器,所以我们选择深度很浅的决策树。
从优化角度来看,是用forward-stagewise这种贪心法去最小化损失函数
L
(
y
,
∑
i
a
i
f
i
(
x
)
)
L(y,\sum_{i}a_{i}f_{i}(x))
L(y,∑iaifi(x))。所谓forward-stagewise,就是在迭代的第n步,求解新的子模型f(x)及步长a(或者叫组合系数),来最小化
L
(
y
,
f
n
−
1
(
x
)
+
a
f
(
x
)
)
L(y,f_{n-1}(x)+af(x))
L(y,fn−1(x)+af(x)),这里
f
n
−
1
(
x
)
f_{n-1}(x)
fn−1(x)是前n-1步得到的子模型的和。因此boosting是在sequential地最小化损失函数,其bias自然逐步下降。但由于是采取这种sequential、adaptive的策略,各子模型之间是强相关的,于是子模型之和并不能显著降低variance。所以说boosting主要还是靠降低bias来提升预测精度。
参考:
https://bbs.pinggu.org/thread-6108796-1-1.html