集成学习——Bagging
一、引言
在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型。但是,实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好)。集成学习就是组合多个弱监督模型以期得到一个更好更全面的强监督模型,它是基于这样一种思想:将多个监督模型的判断进行适当的结合,要比其中任何一个单独的监督模型要好,因为即便某一个弱监督模型得到了错误的判断,其他的弱监督模型也有可能将错误纠正回来。
根据弱学习器的生成方式,目前的集成学习方法大致可分为两大类:
- 序列化方法:各个弱学习器之间存在强依赖关系、必须串行化生成,以Boosting为代表;
- 并行化方法:各个弱学习器之间不存在强依赖关系、可同时生成,以Bagging为代表;
本文主要介绍Bagging方法,下图是Bagging方法的示意图。
二、Bagging
Bagging是由Bootstrap AGGregatING缩写而来,是并行化集成学习方法的著名代表。从它的名字可以看出,它是基于自助采样法(Bootstrap Sampling):给定包含 m m m个样本的训练集,我们先随机抽取一个样本放入新的训练集中,再把该样本重新放回训练集中,如此重复 m m m次,就能得到一个包含 m m m个样本的新的训练集。
在这新的训练集中,原始训练集中的样本可能出现多次,也可能从未出现。因为是有放回的随机抽样,一个样本被抽到的概率始终是
1
m
\frac{1}{m}
m1,所以一个样本从未被抽到的概率是
lim
m
→
∞
(
1
−
1
m
)
m
=
1
e
≈
0.368
\lim_{m \to \infty}(1 - \frac{1}{m})^m = \frac{1}{e} \approx 0.368
m→∞lim(1−m1)m=e1≈0.368
由上式可知,原始训练集中约有63.2%的样本出现在新训练集中。
Bagging方法通过Bootstrap Sampling从原始训练集中采样出
M
M
M个新的训练集,然后基于每个训练集训练出一个基学习器,再将这些基学习器进行结合。在最终预测时,Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法。下图是Bagging算法的示意图:
自助采样法会有一个好处,即每个学习器只使用了原始训练集中63.2%的样本,剩下的36.8%的样本可以用作验证集对泛化性能进行包外估计(out-of-bag estimate),令
D
t
D_t
Dt表示训练
h
t
h_t
ht实际使用的训练集,
H
o
o
b
(
x
)
H^{oob}(\mathbf{x})
Hoob(x)表示对样本
x
\mathbf{x}
x的包外预测:
H
o
o
b
(
x
)
=
arg
max
∑
t
=
1
T
I
(
h
t
(
x
)
=
y
)
I
(
x
∉
D
t
)
H^{oob}(\mathbf{x}) = \arg \max \sum_{t=1}^T I(h_t(\mathbf{x}) = y)I(\mathbf{x} \notin D_t)
Hoob(x)=argmaxt=1∑TI(ht(x)=y)I(x∈/Dt)
则Bagging泛化误差的包外估计为:
ϵ
o
o
b
=
1
∣
D
∣
∑
i
=
1
m
I
(
H
o
o
b
(
x
i
)
≠
y
i
)
\epsilon^{oob} = \frac{1}{|D|} \sum_{i=1}^m I(H^{oob}(\mathbf{x}_i) \neq y_i)
ϵoob=∣D∣1i=1∑mI(Hoob(xi)=yi)
包外样本还有其它用途,比如:
- 当基学习器是决策树时,可以使用包外样本来辅助剪枝,或用于估计决策树中各节点的后验概率以辅助对零训练样本结点的处理;
- 当基学习器时神经网络时,可以使用包外样本来辅助早期停止以减小过拟合风险;
Bagging方法主要关注降低方差,具体推导如下:
V
a
r
(
H
)
=
V
a
r
(
∑
i
=
1
T
α
i
h
i
)
=
∑
i
=
1
T
V
a
r
(
α
i
h
i
)
+
2
∑
i
=
1
T
∑
j
≠
i
T
C
o
v
(
α
i
h
i
,
α
j
h
j
)
=
∑
i
=
1
T
α
i
2
V
a
r
(
h
i
)
+
2
∑
i
=
1
T
∑
j
≠
i
T
α
i
α
j
C
o
v
(
h
i
,
h
j
)
\begin{aligned} Var(H) &= Var(\sum_{i=1}^T \alpha_ih_i) \\ &= \sum_{i=1}^T Var(\alpha_ih_i) + 2 \sum_{i=1}^T \sum_{j \neq i}^TCov(\alpha_ih_i, \alpha_jh_j) \\ &= \sum_{i=1}^T \alpha_i^2Var(h_i) + 2 \sum_{i=1}^T \sum_{j \neq i}^T\alpha_i\alpha_jCov(h_i, h_j) \end{aligned}
Var(H)=Var(i=1∑Tαihi)=i=1∑TVar(αihi)+2i=1∑Tj=i∑TCov(αihi,αjhj)=i=1∑Tαi2Var(hi)+2i=1∑Tj=i∑TαiαjCov(hi,hj)
因为Bagging使用的是简单投票法(或是简单平均法),所以所有的
α
i
=
1
/
T
\alpha_i = 1/T
αi=1/T都相等。令
V
a
r
(
h
i
)
=
σ
2
Var(h_i) = \sigma^2
Var(hi)=σ2,
C
o
v
(
h
i
,
h
j
)
=
ρ
V
a
r
(
h
i
)
V
a
r
(
h
j
)
Cov(h_i,h_j) = \rho\sqrt{Var(h_i)}\sqrt{Var(h_j)}
Cov(hi,hj)=ρVar(hi)Var(hj)(
ρ
\rho
ρ为相关系数),则有:
V
a
r
(
H
)
=
T
∗
σ
2
∗
α
i
2
+
2
∗
T
(
T
−
1
)
2
∗
α
2
∗
ρ
∗
σ
2
=
σ
2
∗
ρ
+
σ
2
∗
(
1
−
ρ
)
T
\begin{aligned} Var(H) &= T*\sigma^2*\alpha_i^2+2*\frac{T(T-1)}{2}*\alpha^2*\rho*\sigma^2 \\ &= \sigma^2*\rho+ \frac{\sigma^2*(1-\rho)}{T} \end{aligned}
Var(H)=T∗σ2∗αi2+2∗2T(T−1)∗α2∗ρ∗σ2=σ2∗ρ+Tσ2∗(1−ρ)
根据上式我们可以看到,整体模型的方差小于等于基模型的方差(当相关性 ρ \rho ρ为 1 1 1时取等号),随着基模型数的增多,整体模型的方差减少,从而防止过拟合的能力增强,模型的准确度得到提高。在极端情况下,当 T T T个基模型完全独立时,整体模型的方差为 σ 2 / T \sigma^2/T σ2/T,也就是说方差减小到了原来的 1 / T 1/T 1/T。因此,Bagging能够提高弱模型性能的原因是降低了方差。
另一方面,因为整体模型的期望为:
E
(
H
)
=
E
(
∑
i
=
1
T
α
i
h
i
)
=
α
∑
i
=
1
T
E
(
h
i
)
=
1
T
∗
T
∗
E
(
h
)
=
E
(
h
)
\begin{aligned} E(H) &= E(\sum_{i=1}^T \alpha_ih_i) \\ &= \alpha\sum_{i=1}^T E(h_i) \\ &= \frac{1}{T}*T*E(h) = E(h) \end{aligned}
E(H)=E(i=1∑Tαihi)=αi=1∑TE(hi)=T1∗T∗E(h)=E(h)
即它的期望近似于基模型的期望,这也就意味着最终模型的偏差和基模型的偏差近似,换句话说,Bagging的过程中没有显著降低偏差。
三、随机森林
随机森林(Random Forest,RF)是Bagging的进化版,换句话说,它的思想仍然是bagging,但是进行了独有的改进:第一,RF使用了CART决策树作为弱学习器;第二,在使用决策树的基础上,RF对决策树的建立做了改进。对于传统的决策树,在选择划分特征时,会在当前结点的所有的 n n n个特征中选择一个最优的特征,来作为决策树的左右子树的划分属性,但是RF通过随机选择当前结点的一部分特征,这个数字小于 n n n,设为 k k k,然后在这些随机选择的 k k k个特征中,选择一个最优的特征来做决策树的左右子树划分。这里的参数 k k k控制了随机性的引入程度:若 k = n k=n k=n,则退化为传统的决策树;若 k = 1 k=1 k=1,则每次随机选择一个特征用于划分。一般情况下,推荐 k = log 2 n k = \log_2 n k=log2n。
下面是RF算法的具体流程:
- 对于
t
=
1
,
2...
,
T
t=1,2...,T
t=1,2...,T:
a. 对训练集进行第 t t t次随机采样,共采集 m m m次,得到包含 m m m个样本的新训练集 D t D_t Dt;
b. 用训练集 D t D_t Dt,训练一个CART决策树,在训练的过程中,对每个节点的切分规则是先从所有特征中随机的选择 k k k个特征,然后在从这 k k k个特征中选择最优的切分点在做左右子树的划分。 - 如果是分类问题,则 T T T个弱学习器投出最多票数的类别或者类别之一为最终类别;如果是回归问题, T T T个弱学习器得到的回归结果进行算术平均得到的值为最终的模型输出。
在RF算法中,可以利用包外样本计算特征的重要程度。对于一棵树,要知道某个特征在这个树中是否起到了作用,可以随机改变这个特征的值,使得“这棵树中有没有这个特征都无所谓”,之后比较改变前后的包外误差率,误差率的差距作为该特征在该树中的重要程度,如下式:
M
D
A
(
A
i
)
=
ϵ
t
′
o
o
b
−
ϵ
t
o
o
b
MDA(A_i) = \epsilon^{oob}_{t'} - \epsilon^{oob}_{t}
MDA(Ai)=ϵt′oob−ϵtoob
其中, ϵ t ′ o o b \epsilon^{oob}_{t'} ϵt′oob表示第 t t t棵树中 A i A_{i} Ai属性值改变之后的包外估计, ϵ t o o b \epsilon^{oob}_{t} ϵtoob表示第 t t t棵树中使用正常 A i A_{i} Ai值的包外估计。
在一棵树中对于
n
n
n个特征都计算一次,就可以得到
n
n
n个特征在该树中的重要程度。在RF中,可以计算出所有树中的特征在各自树中的重要程度。然而,这只能代表这些特征在树中的重要程度不能代表特征在整个森林中的重要程度。对于这个问题,因为每个特征可能在多棵树中出现,可以取这个特征值在多棵树中的重要程度的均值作为该特征在森林中的重要程度,如下式:
M
D
A
(
A
i
)
=
1
T
′
∑
t
T
′
(
ϵ
t
′
o
o
b
−
ϵ
t
o
o
b
)
MDA(A_i) = \frac{1}{T'} \sum_{t}^{T'}(\epsilon^{oob}_{t'} - \epsilon^{oob}_{t})
MDA(Ai)=T′1t∑T′(ϵt′oob−ϵtoob)
其中, T ′ T' T′表示特征 A i A_{i} Ai在森林中出现的次数。
参考
- 机器学习(西瓜书)
- Bagging与随机森林算法原理小结