统计学习方法读书笔记第八章:提升方法
统计学习方法读书笔记第八章:提升方法
提升(boosting)方法是一种常用的统计学习方法,应用广泛且有效。在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类性能。
提升方法AdaBoost算法
- 提升方法的基本思路
提升方法基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。
历史上,Kearns和Valiant首先提出了“强可学习”和“弱可学习”的概念。指出:在概率近似正确(probably approximately correct, PAC)学习的框架中,一个概念(一个类),如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么就称这个概念是强可学习的;一个概念,如果存在一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测略好,那么就称这个概念是弱可学习的。非常有趣的是Schapire后来证明强可学习与弱可学习是等价的,也就是说,在PAC学习的框架下,一个概念是强可学习的充分必要条件是这个概念是弱可学习的。
这样一来,问题便成为,在学习中,如果已经发现了“弱学习算法”,那么能否将它提升为“强学习算法”。大家知道,发现若学习算法通常要比发现强学习算法容易得多。那么如何具体实施提升,便成为开发提升方法时所要解决的问题。关于提升方法的研究很多,有很多算法被提出。最具代表性的是AdaBoost算法。
对于分类问题而言,给定一个训练样本集,求比较粗糙的分类规则(弱分类器)要比求精确的分类规则(强分类器)容易得多。提升方法就是从弱学习算法出发,反复学习,得到一系列弱分类器(又称为基本分类器),然后组合这些弱分类器,构成一个强分类器。大多数的提升方法都是改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据分布调用弱学习算法学习一系列弱分类器。
这样,对提升方法来说,有两个问题需要回答:一是在每一轮如何改变训练数据的权值或概率分布;二是如何将弱分类器组合成一个强分类器。关于第一个问题,AdaBoost的做法是,提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。这样一来,那些没有得到正确分类的数据,由于其权值的加大而受到后一轮的弱分类器的更大关注。于是,分类问题被一系列的弱分类器“分而治之”。至于第二个问题,即弱分类器的组合,AdaBoost采取加权多数表决的方法。具体地,加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。
AdaBoost的巧妙之处就在于它将这些想法自然且有效地实现在一种算法里。 - AdaBoost算法
现在叙述AdaBoost算法。假设给定一个二类分类的训练数据集
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\} T={(x1,y1),(x2,y2),⋯,(xN,yN)}
其中,每个样本点由实例与标记组成。实例 x i ∈ X ⊆ R n x_i\in\mathcal{X}\subseteq R^n xi∈X⊆Rn,标记 y i ∈ Y = { − 1 , + 1 } y_i\in\mathcal{Y}=\{-1,+1\} yi∈Y={−1,+1}, X \mathcal{X} X是实例空间, Y \mathcal{Y} Y是标记集合。AdaBoost利用以下算法,从训练数据中学习一系列弱分类器或基本分类器,并将这些弱分类器线性组合成为一个强分类器。
算法1(AdaBoost)
输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\} T={(x1,y1),(x2,y2),⋯,(xN,yN)},其中 x i ∈ X ⊆ R n x_i\in\mathcal{X}\subseteq R^n xi∈X⊆Rn, y i ∈ Y = { − 1 , + 1 } y_i\in\mathcal{Y}=\{-1,+1\} yi∈Y={−1,+1};若学习算法;
输出:最终分类器 G ( x ) G(x) G(x)。
(1) 初始化训练数据的权值分布
D 1 = ( w 11 , ⋯   , w 1 i , ⋯   , w 1 N ) , w 1 i = 1 N , i = 1 , 2 , ⋯   , N D_1=(w_{11},\cdots,w_{1i},\cdots,w_{1N}), w_{1i}=\frac{1}{N}, i=1,2,\cdots,N D1=(w11,⋯,w1i,⋯,w1N),w1i=N1,i=1,2,⋯,N
(2) 对 m = 1 , 2 , ⋯   , M m=1,2,\cdots,M m=1,2,⋯,M
(a) 使用具有权值分布 D m D_m Dm的训练数据集学习,得到基本分类器
G m ( x ) : X → { − 1 , + 1 } G_m(x):\mathcal{X}\rightarrow\{-1,+1\} Gm(x):X→{−1,+1}
(b) 计算 G m ( x ) G_m(x) Gm(x)在训练数据集上的分类误差率
(1) e m = P ( G m ( x i ) ≠ y i ) = ∑ i = 1 N w m i I ( G m ( x i ) ≠ y i ) e_m=P(G_m(x_i)\neq y_i)=\sum_{i=1}^Nw_{mi}I(G_m(x_i)\neq y_i) \tag{1} em=P(Gm(xi)̸=yi)=i=1∑NwmiI(Gm(xi)̸=yi)(1)
© 计算 G m ( x ) G_m(x) Gm(x)的系数
(2) α m = 1 2 log 1 − e m e m \alpha_m=\frac{1}{2}\log\frac{1-e_m}{e_m} \tag{2} αm=21logem1−em(2)
这里的对数是自然对数。
(d) 更新训练数据集的权值分布
(3) D m + 1 = ( w m + 1 , 1 , ⋯   , w m + 1 , i , ⋯   , w m + 1 , N ) D_{m+1}=(w_{m+1,1},\cdots,w_{m+1,i},\cdots,w_{m+1,N}) \tag{3} Dm+1=(wm+1,1,⋯,wm+1,i,⋯,wm+1,N)(3)
(4) w m + 1 , i = w m i Z m exp ( − α m y i G m ( x i ) ) , i = 1 , 2 , ⋯   , N w_{m+1,i}=\frac{w_{mi}}{Z_m}\exp(-\alpha_my_iG_m(x_i)), i=1,2,\cdots,N \tag{4} wm+1,i=Zmwmiexp(−αmyiGm(xi)),i=1,2,⋯,N(4)
这里, Z m Z_m Zm是规范化因子
(5) Z m = ∑ i = 1 N w m i exp ( − α m y i G m ( x i ) ) Z_m=\sum_{i=1}^Nw_{mi}\exp(-\alpha_my_iG_m(x_i)) \tag{5} Zm=i=1∑Nwmiexp(−αmyiGm(xi))(5)
它使 D m + 1 D_{m+1} Dm+1成为一个概率分布。
(3) 构建基本分类器的线性组合
(6) f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^M\alpha_mG_m(x) \tag{6} f(x)=m=1∑MαmGm(x)(6)
得到最终分类器
(7) 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\bigg(\sum_{m=1}^M\alpha_mG_m(x)\bigg) \tag{7} G(x)=sign(f(x))=sign(m=1∑MαmGm(x))(7)
对AdaBoost算法作如下说明:
步骤(1) 假设训练数据集具有均匀的权值分布,即每个训练样本在基本分类器的学习中作用相同,这一假设保证第1步能够在原始数据上学习基本分类器 G 1 ( x ) G_1(x) G1(x)。
步骤(2) AdaBoost反复学习基本分类器,在每一轮 m = 1 , 2 , ⋯   , M m=1,2,\cdots,M m=1,2,⋯,M顺次地执行下列操作:
(a) 使用当前分布 D m D_m Dm加权的训练数据集,学习基本分类器 G m ( x ) G_m(x) Gm(x)。
(b) 计算基本分类器 G m ( x ) G_m(x) Gm(x)在加权训练数据集上的分类误差率:
(8) e m = P ( G m ( x i ) ≠ y i ) = ∑ G m ( x i ) ≠ y i w m i e_m=P(G_m(x_i)\neq y_i)=\sum_{G_m(x_i)\neq y_i}w_{mi} \tag{8} em=P(Gm(xi)̸=yi)=Gm(xi)̸=yi∑wmi(8)
这里, w m i w_{mi} wmi表示第 m m m轮中第 i i i个实例的权值, ∑ i = 1 N w m i = 1 \sum_{i=1}^Nw_{mi}=1 ∑i=1Nwmi=1。这表明, G m ( x ) G_m(x) Gm(x)在加权的训练数据集上的分类误差率是被 G m ( x ) G_m(x) Gm(x)误分类样本的权值之和,由此可以看出数据权值分布 D m D_m Dm与基本分类器 G m ( x ) G_m(x) Gm(x)的分类误差率的关系。
© 计算基本分类器 G m ( x ) G_m(x) Gm(x)的系数 α m \alpha_m αm。 α m \alpha_m αm表示 G m ( x ) G_m(x) Gm(x)在最终分类器中的重要性。由式(2)可知,当 e m ≤ 1 2 e_m\leq \frac{1}{2} em≤21时, α m ≥ 0 \alpha_m\geq 0 αm≥0,并且 α m \alpha_m αm随着 e m e_m em的减小而增大,所以分类误差率越小的基本分类器在最终分类器中的作用越大。
(d) 更新训练数据的权值分布为下一轮作准备。式(4)可以写成:
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}=\left\{\begin{array}{ll} \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)\neq y_i \end{array} \right. wm+1,i={Zmwmie−αm,Zmwmieαm,Gm(xi)=yiGm(xi)̸=yi
由此可知,被基本分类器 G m ( x ) G_m(x) Gm(x)误分类样本的权值得以扩大,而被正确分类样本的权值却得以缩小。两相比较,误分类样本的权值被放大 e 2 α m = e m 1 − e m e^{2\alpha_m}=\frac{e_m}{1-e_m} e2αm=1−emem倍。因此,误分类样本在下一轮学习中起更大的作用。不改变所给的训练数据,而不断改变训练数据权值的分布,使得训练数据在基本分类器的学习中起不同的作用,这时AdaBoost的一个特点。
步骤(3) 线性组合 f ( x ) f(x) f(x)实现 M M M个基本分类器的加权表决。系数 α m \alpha_m αm表示了基本分类器 G m ( x ) G_m(x) Gm(x)的重要性,这里,所有 α m \alpha_m αm之和并不为1。 f ( x ) f(x) f(x)的符号决定实例 x x x的类, f ( x ) f(x) f(x)的绝对值表示分类的确信度。利用基本分类器的线性组合构建最终分类器是AdaBoost的另一特点。
AdaBoost算法的训练误差分析
AdaBoost最基本的性质是它能在学习过程中不断减少训练误差,即在训练数据集上的分类误差率。关于这个问题有下面的定理:
定理1(AdaBoost的训练误差界) AdaBoost算法最终分类器的训练误差界为
(9)
1
N
∑
i
=
1
N
I
(
G
(
x
i
)
≠
y
i
)
≤
1
N
∑
i
exp
(
−
y
i
f
(
x
i
)
)
=
∏
m
Z
m
\frac{1}{N}\sum_{i=1}^NI(G(x_i)\neq y_i)\leq\frac{1}{N}\sum_i\exp(-y_if(x_i))=\prod_mZ_m \tag{9}
N1i=1∑NI(G(xi)̸=yi)≤N1i∑exp(−yif(xi))=m∏Zm(9)
这里,
G
(
x
)
G(x)
G(x),
f
(
x
)
f(x)
f(x)和
Z
m
Z_m
Zm分别由式(7)、式(6)和式(5)给出。
证明 当
G
(
x
i
)
≠
y
i
G(x_i)\neq y_i
G(xi)̸=yi时,
y
i
f
(
x
i
)
<
0
y_if(x_i)<0
yif(xi)<0,因而
exp
(
−
y
i
f
(
x
i
)
)
≥
1
\exp(-y_if(x_i))\geq 1
exp(−yif(xi))≥1。由此直接推到处前半部分。
后半部分的推到要用到
Z
m
Z_m
Zm的定义式(5)及式(4)的变形:
w
m
i
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
=
Z
m
w
m
+
1
,
i
w_{mi}\exp(-\alpha_my_iG_m(x_i))=Z_mw_{m+1,i}
wmiexp(−αmyiGm(xi))=Zmwm+1,i
现推导如下:
1
N
∑
i
exp
(
−
y
i
f
(
x
i
)
)
=
1
N
∑
i
exp
(
−
∑
m
=
1
M
α
m
y
i
G
m
(
x
i
)
)
=
∑
i
w
1
i
∏
m
=
1
M
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
=
Z
1
Z
2
∑
i
w
3
i
∏
m
=
3
M
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
=
⋯
=
Z
1
Z
2
⋯
Z
M
−
1
∑
i
w
M
i
exp
(
−
α
M
y
i
G
M
(
x
i
)
)
=
∏
m
=
1
M
Z
m
\begin{aligned} \frac{1}{N}&\sum_i\exp(-y_if(x_i)) \\ &=\frac{1}{N}\sum_i\exp\bigg(-\sum_{m=1}^M\alpha_my_iG_m(x_i)\bigg) \\ &=\sum_iw_{1i}\prod_{m=1}^M\exp(-\alpha_my_iG_m(x_i)) \\ &=Z_1Z_2\sum_iw_{3i}\prod_{m=3}^M\exp(-\alpha_my_iG_m(x_i)) \\ &=\cdots \\ &=Z_1Z_2\cdots Z_{M-1}\sum_iw_{Mi}\exp(-\alpha_My_iG_M(x_i)) \\ &=\prod_{m=1}^MZ_m \end{aligned}
N1i∑exp(−yif(xi))=N1i∑exp(−m=1∑MαmyiGm(xi))=i∑w1im=1∏Mexp(−αmyiGm(xi))=Z1Z2i∑w3im=3∏Mexp(−αmyiGm(xi))=⋯=Z1Z2⋯ZM−1i∑wMiexp(−αMyiGM(xi))=m=1∏MZm
这一定理说明,可以在每一轮选取适当的
G
m
G_m
Gm使得
Z
m
Z_m
Zm最小,从而使训练误差下降最快。对二分类问题,有如下结果:
定理2(二分类问题AdaBoost的训练误差界)
(10)
∏
m
=
1
M
Z
m
=
∏
m
=
1
M
[
2
(
e
m
(
1
−
e
m
)
)
]
=
∏
m
=
1
M
(
1
−
4
γ
m
2
)
≤
exp
(
−
2
∑
m
=
1
M
γ
m
2
)
\prod_{m=1}^MZ_m=\prod_{m=1}^M[2\sqrt(e_m(1-e_m))]=\prod_{m=1}^M\sqrt{(1-4\gamma_m^2)}\leq\exp\bigg(-2\sum_{m=1}^M\gamma_m^2\bigg) \tag{10}
m=1∏MZm=m=1∏M[2(em(1−em))]=m=1∏M(1−4γm2)≤exp(−2m=1∑Mγm2)(10)
这里,
γ
m
=
1
2
−
e
m
\gamma_m=\frac{1}{2}-e_m
γm=21−em。
证明 由
Z
m
Z_m
Zm的定义式(5)及式(8)得
(11)
Z
m
=
∑
i
=
1
N
w
m
i
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
=
∑
y
i
=
G
m
(
x
i
)
w
m
i
e
−
α
m
+
∑
y
i
≠
G
m
(
x
i
)
w
m
i
e
α
m
=
(
1
−
e
m
)
e
−
α
m
+
e
m
e
α
m
=
2
e
m
(
1
−
e
m
)
=
1
−
4
γ
m
2
\begin{aligned} Z_m&=\sum_{i=1}^Nw_{mi}\exp(-\alpha_my_iG_m(x_i)) \\ &=\sum_{y_i=G_m(x_i)}w_{mi}e^{-\alpha_m}+\sum_{y_i\neq G_m(x_i)}w_{mi}e^{\alpha_m} \\ &=(1-e_m)e^{-\alpha_m}+e_me^{\alpha_m} \\ &=2\sqrt{e_m(1-e_m)}=\sqrt{1-4\gamma_m^2} \tag{11} \end{aligned}
Zm=i=1∑Nwmiexp(−αmyiGm(xi))=yi=Gm(xi)∑wmie−αm+yi̸=Gm(xi)∑wmieαm=(1−em)e−αm+emeαm=2em(1−em)=1−4γm2(11)
至于不等式
∏
m
=
1
M
(
1
−
4
γ
m
2
)
≤
exp
(
−
2
∑
m
=
1
M
γ
m
2
)
\prod_{m=1}^M\sqrt{(1-4\gamma_m^2)}\leq \exp\bigg(-2\sum_{m=1}^M\gamma_m^2\bigg)
m=1∏M(1−4γm2)≤exp(−2m=1∑Mγm2)
则可先由
e
x
e^x
ex和
1
−
x
\sqrt{1-x}
1−x在点
x
=
0
x=0
x=0的泰勒展开式推出不等式
(
1
−
4
γ
m
2
)
≤
exp
(
−
2
γ
m
2
)
\sqrt{(1-4\gamma_m^2)}\leq\exp(-2\gamma_m^2)
(1−4γm2)≤exp(−2γm2),进而得到
推论1 如果存在
γ
>
0
\gamma>0
γ>0,对所有
m
m
m有
γ
m
≥
γ
\gamma_m\geq\gamma
γm≥γ,则
(12)
1
N
∑
i
=
1
N
I
(
G
(
x
i
)
≠
y
i
)
≤
exp
(
−
2
M
γ
2
)
\frac{1}{N}\sum_{i=1}^NI(G(x_i)\neq y_i)\leq\exp(-2M\gamma^2) \tag{12}
N1i=1∑NI(G(xi)̸=yi)≤exp(−2Mγ2)(12)
这表明在此条件下AdaBoost的训练误差是以指数速率下降的。这一性质当然是很有吸引力的。
注意,AdaBoost算法不需要知道下界
γ
\gamma
γ。这正是Freund与Schapire设计AdaBoost时所考虑的。与一些早期的提升方法不同,AdaBoost具有适应性,即它能适应弱分类器各自的训练误差率。这也是它的名称(适应的提升)的由来,Ada是Adaptive的简写。
AdaBoost算法的解释
AdaBoost算法还有另一个解释,即可以认为AdaBoost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分步算法时的二类分类学习方法。
-
前向分步算法
考虑加法模型(additive model)
(13) f ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x)=\sum_{m=1}^M\beta_mb(x;\gamma_m) \tag{13} f(x)=m=1∑Mβmb(x;γm)(13)
其中, b ( x ; γ m ) b(x;\gamma_m) b(x;γm)为基函数, γ m \gamma_m γm为基函数的参数, β m \beta_m βm为基函数的系数。显然,式(6)是一个加法模型。
在给定训练数据及损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x))的条件下,学习加法模型 f ( x ) f(x) f(x)成为经验风险极小化即损失函数极小化问题:
(14) min β m , γ m ∑ i = 1 N L ( y i , ∑ m = 1 M β m b ( x i ; γ m ) ) \min_{\beta_m,\gamma_m}\sum_{i=1}^NL\bigg(y_i,\sum_{m=1}^M\beta_mb(x_i;\gamma_m)\bigg) \tag{14} βm,γmmini=1∑NL(yi,m=1∑Mβmb(xi;γm))(14)
通常这时一个复杂的优化问题。前向分步算法求解这一优化问题的想法是:因为学习的是加法模型,如果能够从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式(14),那么就可以简化优化的复杂度。具体地,每步只需优化如下损失函数:
(15) min β , γ ∑ i = 1 N L ( y i , β b ( x i ; γ ) ) \min_{\beta,\gamma}\sum_{i=1}^NL(y_i,\beta b(x_i;\gamma)) \tag{15} β,γmini=1∑NL(yi,βb(xi;γ))(15)
给定训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } , x i ∈ X ⊆ R n , y i ∈ Y = { − 1 , + 1 } T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\},x_i\in\mathcal{X}\subseteq R^n,y_i\in\mathcal{Y}=\{-1,+1\} T={(x1,y1),(x2,y2),⋯,(xN,yN)},xi∈X⊆Rn,yi∈Y={−1,+1}。损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x))和基函数的集合 b ( x ; γ ) b(x;\gamma) b(x;γ),学习加法模型 f ( x ) f(x) f(x)的前向分步算法如下:
算法2(前向分步算法)
输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\} T={(x1,y1),(x2,y2),⋯,(xN,yN)};损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x));基函数集 { b ( x ; γ ) } \{b(x;\gamma)\} {b(x;γ)};
输出:加法模型 f ( x ) f(x) f(x)。
(1) 初始化 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0
(2) 对 m = 1 , 2 , ⋯   , M m=1,2,\cdots,M m=1,2,⋯,M
(a) 极小化损失函数
(16) ( β m , γ m ) = arg min β , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) ) (\beta_m,\gamma_m)=\arg\min_{\beta,\gamma}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+\beta b(x_i;\gamma)) \tag{16} (βm,γm)=argβ,γmini=1∑NL(yi,fm−1(xi)+βb(xi;γ))(16)
得到参数 β m \beta_m βm, γ m \gamma_m γm
(b) 更新
(17) f m ( x ) = f m − 1 ( x ) + β m b ( x ; γ m ) f_m(x)=f_{m-1}(x)+\beta_mb(x;\gamma_m) \tag{17} fm(x)=fm−1(x)+βmb(x;γm)(17)
(3) 得到加法模型
(18) f ( x ) = f M ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x)=f_M(x)=\sum_{m=1}^M\beta_mb(x;\gamma_m) \tag{18} f(x)=fM(x)=m=1∑Mβmb(x;γm)(18)
这样,前向分步算法将同时求解从 m = 1 m=1 m=1到 M M M所有参数 β m \beta_m βm, γ m \gamma_m γm的优化问题简化为逐次求解各个 β m \beta_m βm, γ m \gamma_m γm的优化问题。 -
前向分步算法与AdaBoost
由前向分步算法可以推导出AdaBoost,用定理叙述这一关系。
定理3 AdaBoost算法是前向分步算法加法算法的特例。这时,模型是由基本分类器组成的加法模型,损失函数是指数函数。
证明 前向分步算法学习的是加法模型,当基函数为基本分类器时,该加法模型等价于AdaBoost的最终分类器
(19) f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^M\alpha_mG_m(x) \tag{19} f(x)=m=1∑MαmGm(x)(19)
由基本分类器 G m ( x ) G_m(x) Gm(x)及其系数 α m \alpha_m αm组成, m = 1 , 2 , ⋯   , M m=1,2,\cdots,M m=1,2,⋯,M。前向分步算法逐一学习基函数,这一过程与AdaBoost算法逐一学习基本分类器的过程一致。下面证明前向分步算法的损失函数是指数损失函数
L ( y , f ( x ) ) = exp [ − y f ( x ) ] L(y,f(x))=\exp[-yf(x)] L(y,f(x))=exp[−yf(x)]
时,其学习的具体操作等价于AdaBoost算法学习的具体操作。
假设经过 m − 1 m-1 m−1轮迭代前向分步算法已经得到 f m − 1 ( x ) f_{m-1}(x) fm−1(x):
f m − 1 ( x ) = f m − 2 ( x ) + α m − 1 G m − 1 ( x ) = α 1 G 1 ( x ) + ⋯ + α m − 1 G m − 1 ( x ) \begin{aligned} f_{m-1}(x)&=f_{m-2}(x)+\alpha_{m-1}G_{m-1}(x) \\ &=\alpha_1G_1(x)+\cdots+\alpha_{m-1}G_{m-1}(x) \end{aligned} fm−1(x)=fm−2(x)+αm−1Gm−1(x)=α1G1(x)+⋯+αm−1Gm−1(x)
在第 m m m轮迭代得到 α m \alpha_m αm, G m ( x ) G_m(x) Gm(x)和 f m ( x ) f_m(x) fm(x)。
f m ( x ) = f m − 1 ( x ) + α m G m ( x ) f_m(x)=f_{m-1}(x)+\alpha_mG_m(x) fm(x)=fm−1(x)+αmGm(x)
目标是使前向分步算法得到的 α m \alpha_m αm和 G m ( x ) G_m(x) Gm(x)使 f ( x ) f(x) f(x)在训练数据集 T T T上的损失最小,即
(20) ( α m , G m ( x ) ) = arg min α , G ∑ i = 1 N exp [ − y i ( f m − 1 ( x i ) + α G ( x i ) ) ] (\alpha_m,G_m(x))=\arg\min_{\alpha,G}\sum_{i=1}^N\exp[-y_i(f_{m-1}(x_i)+\alpha G(x_i))] \tag{20} (αm,Gm(x))=argα,Gmini=1∑Nexp[−yi(fm−1(xi)+αG(xi))](20)
式(20)可以表示为
(21) ( α m , G m ( x ) ) = arg min α , G ∑ i = 1 N w ˉ m i exp [ − y i α G ( x i ) ] (\alpha_m,G_m(x))=\arg\min_{\alpha,G}\sum_{i=1}^N\bar w_{mi}\exp[-y_i\alpha G(x_i)] \tag{21} (αm,Gm(x))=argα,Gmini=1∑Nwˉmiexp[−yiαG(xi)](21)
其中, w ˉ m i = exp [ − y i f m − 1 ( x i ) ] \bar w_{mi}=\exp[-y_if_{m-1}(x_i)] wˉmi=exp[−yifm−1(xi)]。因为 w ˉ m i \bar w_{mi} wˉmi既不依赖 α \alpha α也不依赖于 G G G,所以与最小化无关。但 w ˉ m i \bar w_{mi} wˉmi依赖于 f m − 1 ( x ) f_{m-1}(x) fm−1(x),随着每一轮迭代而发生改变。
现证使式(21)达到最小的 α ∗ \alpha^* α∗和 G m ∗ ( x ) G_m^*(x) Gm∗(x)就是AdaBoost算法所得到的 α m \alpha_m αm和 G m ( x ) G_m(x) Gm(x)。求解式(21)可分两步:
首先,求 G m ∗ ( x ) G_m^*(x) Gm∗(x)。对任意 α > 0 \alpha>0 α>0,使式(21)最小的 G ( x ) G(x) G(x)由下式得到:
G m ∗ ( x ) = arg min G ∑ i = 1 N w ˉ m i I ( y i ≠ G ( x i ) ) G_m^*(x)=\arg\min_G\sum_{i=1}^N\bar w_{mi}I(y_i\neq G(x_i)) Gm∗(x)=argGmini=1∑NwˉmiI(yi̸=G(xi))
其中, w ˉ m i = exp [ − y i f m − 1 ( x i ) ] \bar w_{mi}=\exp[-y_if_{m-1}(x_i)] wˉmi=exp[−yifm−1(xi)]。
此分类器 G m ∗ ( x ) G_m^*(x) Gm∗(x)即为AdaBoost算法的基本分类器 G m ( x ) G_m(x) Gm(x),因为它是使第 m m m轮加权训练数据分类误差率最小的基本分类器。
之后,求 α ∗ \alpha^* α∗。参照式(11),式(21)中
(22) ∑ i = 1 N w ˉ m i exp [ − y i α G ( x i ) ] = ∑ y i = G m ( x i ) w ˉ m i e − α + ∑ y i ≠ G m ( x i ) w ˉ m i e α = ( e α − e − α ) ∑ i = 1 N w ˉ m i I ( y i ≠ G ( x i ) ) + e − α ∑ i = 1 N w ˉ m i \begin{aligned} \sum_{i=1}^N&\bar w_{mi}\exp[-y_i\alpha G(x_i)] \\ &=\sum_{y_i=G_m(x_i)}\bar w_{mi}e^{-\alpha}+\sum_{y_i\neq G_m(x_i)}\bar w_{mi}e^{\alpha} \\ &=(e^{\alpha}-e^{-\alpha})\sum_{i=1}^N\bar w_{mi}I(y_i\neq G(x_i))+e^{-\alpha}\sum_{i=1}^N\bar w_{mi} \tag{22} \end{aligned} i=1∑Nwˉmiexp[−yiαG(xi)]=yi=Gm(xi)∑wˉmie−α+yi̸=Gm(xi)∑wˉmieα=(eα−e−α)i=1∑NwˉmiI(yi̸=G(xi))+e−αi=1∑Nwˉmi(22)
将已求得的 G m ∗ ( x ) G_m^*(x) Gm∗(x)带入式(22),对 α \alpha α求导并使导数为0,即得到使式(21)最小的 α \alpha α。
α m ∗ = 1 2 log 1 − e m e m \alpha_m^*=\frac{1}{2}\log\frac{1-e_m}{e_m} αm∗=21logem1−em
其中, e m e_m em是分类误差率:
e m = ∑ i = 1 N w ˉ m i I ( y i ≠ G m ( x i ) ) ∑ i = 1 N w ˉ m i = ∑ i = 1 N w m i I ( y i ≠ G m ( x i ) ) e_m=\frac{\sum_{i=1}^N\bar w_{mi}I(y_i\neq G_m(x_i))}{\sum_{i=1}^N\bar w_{mi}}=\sum_{i=1}^Nw_{mi}I(y_i\neq G_m(x_i)) em=∑i=1Nwˉmi∑i=1NwˉmiI(yi̸=Gm(xi))=i=1∑NwmiI(yi̸=Gm(xi))
这里的 α m ∗ \alpha_m^* αm∗与AdaBoost算法第2©步的 α m \alpha_m αm完全一致。
最后来看每一轮样本权值的更新。由
f m ( x ) = f m − 1 ( x ) + α m G m ( x ) f_m(x)=f_{m-1}(x)+\alpha_mG_m(x) fm(x)=fm−1(x)+αmGm(x)
以及 w ˉ m i = exp [ − y i f m − 1 ( x i ) ] \bar w_{mi}=\exp[-y_if_{m-1}(x_i)] wˉmi=exp[−yifm−1(xi)],可得
w ˉ m + 1 , i = w ˉ m , i exp [ − y i α m G m ( x ) ] \bar w_{m+1,i}=\bar w_{m,i}\exp[-y_i\alpha_mG_m(x)] wˉm+1,i=wˉm,iexp[−yiαmGm(x)]
这与AdaBoost算法第2(d)步的样本权值的更新,只相差规范化因子,因而等价。
提升树
提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习中性能最好的方法之一。
-
提升树模型
提升方法实际采用加权模型(即基函数的现行组合)与前向分步算法。以决策树为基函数的提升方法称为提升树(boosting tree)。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。基本分类器 x < ν x<\nu x<ν或 x > ν x>\nu x>ν,可以看作是由一个根节点直接链接两个叶节点的简单决策树,即所谓的决策树桩。提升树模型可以表示为决策树的加法模型:
(23) f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_M(x)=\sum_{m=1}^MT(x;\Theta_m) \tag{23} fM(x)=m=1∑MT(x;Θm)(23)
其中, T ( x ; Θ m ) T(x;\Theta_m) T(x;Θm)表示决策树; Θ m \Theta_m Θm为决策树的参数; M M M为树的个数。 -
提升树算法
提升树算法采用前向分步算法。首先确定初始提升树 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0,第 m m m步的模型是
(24) f m ( x ) = f m − 1 ( x ) + T ( x ; Θ m ) f_m(x)=f_{m-1}(x)+T(x;\Theta_m) \tag{24} fm(x)=fm−1(x)+T(x;Θm)(24)
其中, f m − 1 ( x ) f_{m-1}(x) fm−1(x)为当前模型,通过经验风险极小化确定下一棵决策树的参数 Θ m \Theta_m Θm,
(25) Θ ^ m = arg min θ m ∑ i = 1 N L ( y i , f m − 1 ( x i ) + T ( x i ; Θ m ) ) \hat\Theta_m=\arg\min_{\theta_m}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+T(x_i;\Theta_m)) \tag{25} Θ^m=argθmmini=1∑NL(yi,fm−1(xi)+T(xi;Θm))(25)
由于树的线性组合可以很好地拟合训练数据,即使数据中的输入与输出之间的关系很复杂也是如此,所以提升树是一个高功能的学习算法。
下面讨论针对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同。包括用平方误差损失函数的回归问题,用指数损失函数的分类问题,以及用一般损失函数的一般决策问题。
对于二类分类问题,提升树算法只需要将AdaBoost算法1中的基本分类器限制为二分类树即可,可以说这时的提升树算法是AdaBoost算法的特殊情况,这里不再细述。下面叙述回归问题的提升树。
已知一个训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } , x i ∈ X ⊆ R n T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\},x_i\in\mathcal{X}\subseteq R^n T={(x1,y1),(x2,y2),⋯,(xN,yN)},xi∈X⊆Rn, X \mathcal{X} X为输入空间, y i ∈ Y ⊆ R y_i\in\mathcal{Y}\subseteq R yi∈Y⊆R, Y \mathcal{Y} Y为输出空间。如果将输入空间 X \mathcal{X} X划分为 J J J个互不相交的区域 R 1 , R 2 , ⋯   , R J R_1,R_2,\cdots,R_J R1,R2,⋯,RJ,并且在每个区域上确定输出的常量 c j c_j cj,那么树可表示为
(26) T ( x ; Θ ) = ∑ j = 1 J c j I ( x ∈ R j ) T(x;\Theta)=\sum_{j=1}^Jc_jI(x\in R_j) \tag{26} T(x;Θ)=j=1∑JcjI(x∈Rj)(26)
其中,参数 Θ = { ( R 1 , c 1 ) , ( R 2 , c 2 ) , ⋯   , ( R J , c J ) } \Theta=\{(R_1,c_1),(R_2,c_2),\cdots,(R_J,c_J)\} Θ={(R1,c1),(R2,c2),⋯,(RJ,cJ)}表示树的区域划分和各区域上的常数。 J J J是回归树的复杂度即叶节点个数。
回归问题提升树使用以下前向分步算法:
f 0 ( x ) = 0 f m ( x ) = f m − 1 ( x ) + T ( x ; Θ m ) , m = 1 , 2 , ⋯   , M f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) \begin{aligned} &f_0(x)=0 \\ &f_m(x)=f_{m-1}(x)+T(x;\Theta_m), m=1,2,\cdots,M \\ &f_M(x)=\sum_{m=1}^MT(x;\Theta_m) \end{aligned} f0(x)=0fm(x)=fm−1(x)+T(x;Θm),m=1,2,⋯,MfM(x)=m=1∑MT(x;Θm)
在前向分步算法的第 m m m步,给定当前模型 f m − 1 ( x ) f_{m-1}(x) fm−1(x),需求解
Θ ^ m = arg min Θ m ∑ i = 1 N L ( y i , f m − 1 ( x i ) + T ( x i ; Θ m ) ) \hat\Theta_m=\arg\min_{\Theta_m}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+T(x_i;\Theta_m)) Θ^m=argΘmmini=1∑NL(yi,fm−1(xi)+T(xi;Θm))
得到 Θ ^ m \hat\Theta_m Θ^m,即第 m m m棵树的参数。
当采用平方误差损失函数时,
L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L(y,f(x))=(y-f(x))^2 L(y,f(x))=(y−f(x))2
其损失变为
L ( y , f m − 1 ( x ) + T ( x ; Θ m ) ) = [ y − f m − 1 ( x ) − T ( x ; Θ m ) ] 2 = [ r − T ( x ; Θ m ) ] 2 \begin{aligned} L(y,&f_{m-1}(x)+T(x;\Theta_m)) \\ &=[y-f_{m-1}(x)-T(x;\Theta_m)]^2 \\ &=[r-T(x;\Theta_m)]^2 \end{aligned} L(y,fm−1(x)+T(x;Θm))=[y−fm−1(x)−T(x;Θm)]2=[r−T(x;Θm)]2
这里,
(27) r = y − f m − 1 ( x ) r=y-f_{m-1}(x) \tag{27} r=y−fm−1(x)(27)
是当前模型拟合数据的残差。所以,对回归问题的提升树算法来说,只需简单地拟合当前模型的残差。这样,算法是相当简单的。现将回归问题的提升树算法叙述如下。
算法3(回归问题的提升树算法)
输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } , x i ∈ X ⊆ R n , y i ∈ Y ⊆ R T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\},x_i\in\mathcal{X}\subseteq R^n,y_i\in\mathcal{Y}\subseteq R T={(x1,y1),(x2,y2),⋯,(xN,yN)},xi∈X⊆Rn,yi∈Y⊆R;
输出:提升树 f M ( x ) f_M(x) fM(x)。
(1) 初始化 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0
(2) 对 m = 1 , 2 , ⋯   , M m=1,2,\cdots,M m=1,2,⋯,M
(a) 按式(27)计算残差
r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , ⋯   , N r_{mi}=y_i-f_{m-1}(x_i), i=1,2,\cdots,N rmi=yi−fm−1(xi),i=1,2,⋯,N
(b) 拟合残差 r m i r_{mi} rmi学习一个回归树,得到 T ( x ; Θ m ) T(x;\Theta_m) T(x;Θ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)
(3) 得到回归问题提升树
f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_M(x)=\sum_{m=1}^MT(x;\Theta_m) fM(x)=m=1∑MT(x;Θm) -
梯度提升
提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失函数时,每一步优化是很简单的。但对一般损失函数而言,往往每一步优化并不那么容易。针对这一问题,Freidman提出梯度提升算法。这是利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值
− [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) -\bigg[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}\bigg]_{f(x)=f_{m-1}(x)} −[∂f(xi)∂L(y,f(xi))]f(x)=fm−1(x)
作为回归问题提升树算法中的残差的近似值,拟合一个回归树。
算法4(梯度提升算法)
输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } , x i ∈ X ⊆ R n , y i ∈ Y ⊆ R T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\},x_i\in\mathcal{X}\subseteq R^n,y_i\in\mathcal{Y}\subseteq R T={(x1,y1),(x2,y2),⋯,(xN,yN)},xi∈X⊆Rn,yi∈Y⊆R;损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x));
输出:回归树 f ^ ( x ) \hat f(x) f^(x)。
(1) 初始化
f 0 ( x ) = arg min c ∑ i = 1 N L ( y i , c ) f_0(x)=\arg\min_c\sum_{i=1}^NL(y_i,c) f0(x)=argcmini=1∑NL(yi,c)
(2) 对 m = 1 , 2 , ⋯   , M m=1,2,\cdots,M m=1,2,⋯,M
(a) 对 i = 1 , 2 , ⋯   , N i=1,2,\cdots,N i=1,2,⋯,N,计算
r m i = − [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi}=-\bigg[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}\bigg]_{f(x)=f_{m-1}(x)} rmi=−[∂f(xi)∂L(y,f(xi))]f(x)=fm−1(x)
(b) 对 r m i r_{mi} rmi拟合一个回归树,得到第 m m m棵树的叶节点区域 R m j , j = 1 , 2 , ⋯   , J R_{mj},j=1,2,\cdots,J Rmj,j=1,2,⋯,J
© 对 j = 1 , 2 , ⋯   , J j=1,2,\cdots,J j=1,2,⋯,J,计算
c m j = arg min c ∑ x j ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{mj}=\arg\min_c\sum_{x_j\in R_{mj}}L(y_i,f_{m-1}(x_i)+c) cmj=argcminxj∈Rmj∑L(yi,fm−1(xi)+c)
(d) 更新 f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x ∈ R m j ) f_m(x)=f_{m-1}(x)+\sum_{j=1}^Jc_{mj}I(x\in R_{mj}) fm(x)=fm−1(x)+∑j=1JcmjI(x∈Rmj)
(3) 得到回归树
f ^ ( x ) = f M ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x ∈ R m j ) \hat f(x)=f_M(x)=\sum_{m=1}^M\sum_{j=1}^Jc_{mj}I(x\in R_{mj}) f^(x)=fM(x)=m=1∑Mj=1∑JcmjI(x∈Rmj)
算法第1步初始化,估计使损失函数极小化的常数值,它是只有一个根节点的树。第2(a)步计算损失函数的负梯度在当前模型的值,将它作为残差的估计。对于平方损失函数,它就是通常所说的残差;对于一般损失函数,它就是残差的近似值。第2(b)步估计回归树叶结点区域,以拟合残差的近似值。第2©步利用线性搜索估计叶结点区域的值,使损失函数极小化。第2(d)步更新回归树。第3步得到输出的最终模型 f ^ ( x ) \hat f(x) f^(x)。