前言
前面我们已经通过数学公式验证过,将众多“好而不同”的弱学习器组合起来可以提升模型的准确性。并且根据个体学习器之间是否存在强依赖关系,我们将集成学习分为boosting和bagging两大类(强依赖性体现在弱学习器的抽样方法)。
本篇我们主要讲boosting算法中的代表性提升算法AdaBoost,然后介绍提升方法的实例——提升树(boosting tree)
Adaboost算法原理
步骤一
假设每个训练样本在基本分类器中的作用相同,从而在等权重的原始数据上学习第一个基分类器 G 1 ( x ) G_1(x) G1(x)
步骤二
在第 m m m轮( m = 1 , 2 , 3 , . . . , M m=1,2,3,...,M m=1,2,3,...,M)上顺次执行以下操作:
- 使用当前的权重分布 D m D_m Dm学习基分类器 G m ( x ) G_m(x) Gm(x)
- 计算基分类器
G
m
(
x
)
G_m(x)
Gm(x)在加权训练数据集上的分类误差率:
e m = P ( G m ( x ) ! = y i ) = ∑ i = 1 N w m i I ( G m ( x i ) ! = y i ) e_m = P(G_m(x)!=y_i)=\sum_{i=1}^{N}w_{mi}I(G_m(x_i)!=y_i) em=P(Gm(x)!=yi)=i=1∑NwmiI(Gm(xi)!=yi)
可以看到第二个等号表示分类误差率等于被 G m ( x ) G_m(x) Gm(x)误分类样本的权值之和
- 计算
G
m
(
x
)
G_m(x)
Gm(x)的系数
α
m
\alpha_m
αm
当 e m ≤ 1 2 e_m\leq\frac{1}{2} em≤21时 α m ≥ 0 \alpha_m\geq0 αm≥0,并且 α m \alpha_m αm随着 e m e_m em的减小而增大,这也意味着分类误差率越小的基本分类器在最终分类器中的作用越大 - 更新训练数据的权值分布为下一轮做准备:
w m 1 , i = { w m i Z m e − α m , G m ( x i ) = y i w m i Z m e α m , G m ( x i ) ! = y i w_{m_1,i}= \begin{cases} \frac{w_{mi}}{Z_m}e^{-\alpha_m},G_m(x_i)=y_i \\ \frac{w_{mi}}{Z_m}e^{\alpha_m},G_m(x_i)!=y_i \end{cases} wm1,i={Zmwmie−αm,Gm(xi)=yiZmwmieαm,Gm(xi)!=yi
可以看到误分类样本的权值扩大,而被正确分类样本的权值却得以缩小。因此误分类样本在下一轮学习中会起更大的作用。
不改变所给的训练数据,但是不断改变训练数据权值的分布,使得训练数据在基本分类器的学习中起不同的作用,这就是AdaBoost的一个特点。
步骤三
通过系数 α m \alpha_m αm将多个基分类器组合起来加权表决预测的分类结果。
注意 α m \alpha_m αm之和不为1, f ( x ) f(x) f(x)的符号决定实例 x x x的类, f ( x ) f(x) f(x)的绝对值表示分类的确信度。
AdaBoost算法实现
基本原理依然是从训练数据中学习出一系列的弱分类器,并将弱分类器组合成一个强分类器。
输入:训练集
T
=
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
N
,
y
N
)
T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}
T=(x1,y1),(x2,y2),...,(xN,yN),其中
y
i
y_i
yi取值为
{
−
1
,
+
1
}
\{-1,+1\}
{−1,+1}
输出:最终分类器
G
(
x
)
G(x)
G(x)
1.初始化训练数据的权值分布
D
1
=
(
w
1
1
,
.
.
.
,
w
1
i
,
.
.
.
,
w
1
N
)
,
w
1
i
=
1
N
D_1=(w_11,...,w_1i,...,w_1N),w_{1i}=\frac{1}{N}
D1=(w11,...,w1i,...,w1N),w1i=N1
2.对于
m
=
1
,
2
,
.
.
.
,
M
m=1,2,...,M
m=1,2,...,M
(a)使用具有权值分布的
D
m
D_m
Dm的训练数据学习,得到基分类器
G
m
(
x
)
:
X
→
−
1
,
+
1
G_m(x):X→{-1,+1}
Gm(x):X→−1,+1
(b)计算
G
m
(
x
)
G_m(x)
Gm(x)在训练数据集上的分类误差率
e
m
=
P
(
G
m
(
x
)
!
=
y
i
)
=
∑
i
=
1
N
w
m
i
I
(
G
m
(
x
i
)
!
=
y
i
)
e_m=P(G_m(x)!=y_i)=\sum_{i=1}^{N}w_{mi}I(G_m(x_i)!=y_i)
em=P(Gm(x)!=yi)=i=1∑NwmiI(Gm(xi)!=yi)
©计算
G
m
(
x
)
G_m(x)
Gm(x)的系数
α
m
=
1
2
l
o
g
1
−
e
m
e
m
\alpha_m=\frac{1}{2}log\frac{1-e_m}{e_m}
αm=21logem1−em
(d)更新训练数据集的权值分布
D
m
+
1
=
(
w
m
+
1
,
1
,
.
.
.
,
w
m
+
1
,
i
,
.
.
.
,
w
m
+
1
,
N
)
D_{m+1}=(w_{m+1,1},...,w_{m+1,i},...,w_{m+1,N})
Dm+1=(wm+1,1,...,wm+1,i,...,wm+1,N)
w
m
+
1
,
i
=
w
m
i
Z
m
e
x
p
(
−
α
m
y
i
G
m
(
x
i
)
)
w_{m+1,i}=\frac{w_{mi}}{Z_m}exp(-\alpha_my_iG_m(x_i))
wm+1,i=Zmwmiexp(−αmyiGm(xi))
其中,
Z
m
Z_m
Zm是规范化因子,它使得
D
m
+
1
D_{m+1}
Dm+1成为一个概率分布:
Z
m
=
∑
i
=
1
N
w
m
i
e
x
p
(
−
α
m
y
i
G
m
(
x
i
)
)
Z_m = \sum_{i=1}^{N}w_{mi}exp(-\alpha_my_iG_m(x_i))
Zm=i=1∑Nwmiexp(−αmyiGm(xi))
3.构建基分类器的线性组合:
f
(
x
)
=
∑
m
=
1
N
α
m
G
m
(
x
)
f(x)=\sum_{m=1}^{N}\alpha_mG_m(x)
f(x)=m=1∑NαmGm(x)
最终分类器表示为:
G
(
x
)
=
s
i
g
n
(
f
(
x
)
)
=
s
i
g
n
(
∑
m
=
1
M
α
m
G
m
(
x
)
)
G(x)=sign(f(x))=sign(\sum_{m=1}^{M}\alpha_mG_m(x))
G(x)=sign(f(x))=sign(m=1∑MαmGm(x))
提升树(boosting tree)
提升树模型
提升树指采用加法模型(基函数的线性组合)与前向分布算法,同时以决策树为基函数的提升方法。对于分类问题而言是二叉分类树,但对于回归问题而言是二叉回归树。
提升树模型可以表示为决策树的加法模型:
f
M
(
x
)
=
∑
m
=
1
M
T
(
x
;
Θ
m
)
f_M(x)=\sum_{m=1}^{M}T(x;\Theta_m)
fM(x)=m=1∑MT(x;Θm)
其中,
T
(
x
;
Θ
m
)
T(x;\Theta_m)
T(x;Θm)表示决策树,
Θ
m
\Theta_m
Θm表示决策树的参数,$M$
表示树的棵树。
提升树算法原理
首先确定初始提升树
f
0
(
x
)
=
0
f_0(x)=0
f0(x)=0,然后第
m
m
m步的模型是:
f
m
(
x
)
=
f
m
−
1
(
x
)
+
T
(
x
;
Θ
m
)
f_m(x)=f_{m-1}(x)+T(x;\Theta_m)
fm(x)=fm−1(x)+T(x;Θm)
其中下一棵决策树的参数$\Theta_m$
通过经验风险最小化确定:
Θ
^
m
=
a
r
g
m
i
n
∑
i
=
1
N
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
i
;
Θ
m
)
)
\hat{\Theta}_m=argmin\sum_{i=1}^{N}L(y_i,f_{m-1}(x_i)+T(x_i;\Theta_m))
Θ^m=argmini=1∑NL(yi,fm−1(xi)+T(xi;Θm))
提升树算法类型
当使用的损失函数不同时,便对应着不同类型的提升树算法
1.二分类提升树
直接将AdaBoost算法中的基本分类器限制为二叉树即可
2.回归提升树
树可以表示为:
T
(
x
;
Θ
)
=
∑
j
=
1
J
c
j
I
(
x
∈
R
j
)
T(x;\Theta)=\sum_{j=1}^{J}c_jI(x\in R_j)
T(x;Θ)=j=1∑JcjI(x∈Rj)
其中我们将输入空间划分为
J
J
J个互不相交的区域
R
1
,
R
2
,
.
.
.
R
J
R_1,R_2,...R_J
R1,R2,...RJ,并且在每个区域确定输出的常量
c
j
c_j
cj
回归树算法的具体细节可以看:
Reference
[1] 统计学习方法