提升方法
8.1提升方法AdaBoost
简单来讲,提升方法在分类问题中,通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,最终提高分类的性能。
8.1.1提升方法的基本思路
首先需要了解两个概念,强学习算法和弱学习算法。
- 强学习算法:存在一个多项式学习算法学习它且正确率高。
- 弱学习算法:存在一个多项式学习算法学习它但是正确率仅比随机猜测略好。
Schapire证明强学习与弱学习是等价的,这样一来,可以通过对较易发现的弱学习算法进行优化提升成为强学习算法,进而提高学习正确率。
优化具体思想:从弱学习算法出发,反复学习,得到一系列弱分类器,然后重新组合这些弱分类器,构成一个强分类器。
Adaboost提升方法:通过提高被前一轮弱分类器错误分类样本的权值,降低正确分类样本的权值,导致错误分类的数据,由于权值增大而受到后一轮弱分类器的更大关注,从而改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据分布调用学习算法学习一系列弱分类器。最后采用加权多数表决,加大分类误差率小的弱分类器的权值,减小误差率大的弱分类器的权值,使得正确率高的弱分类器在表决中的比重更大。
8.1.2AdaBoost算法
假定二分类训练集:
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
(
x
N
,
y
N
)
}
T=\left \{\left ( x_{1}, y_{1}\right ),\left ( x_{2}, y_{2}\right ),...\left ( x_{N}, y_{N}\right )\right \}
T={(x1,y1),(x2,y2),...(xN,yN)}
y的取值为 -1 和 +1 .
算法8.1 AdaBoost
输入:训练数据集,弱学习算法。
输出:最终分类器。
- 初始化训练数据的权值分布(这里假设训练集权值分布均匀)
D 1 = ( ω 11 , . . . , ω 1 i , . . . , ω 1 N ) , ω 1 i = 1 N {D_{1}}= \left ( {\omega_{11},...,\omega_{1i},...,\omega_{1N}}\right ), \omega_{1i}=\frac{1}{N} D1=(ω11,...,ω1i,...,ω1N),ω1i=N1 - 对
m
=
1
,
2
,
.
.
.
,
M
m=1,2,...,M
m=1,2,...,M
(1)使用具有权值分布 D m {D_{m}} Dm的训练数据集学习,得到弱分类器(基本分类器)
G m ( x ) = χ → { − 1 , + 1 } {G_{m}(x)}=\chi\rightarrow\left\{-1,+1\right\} Gm(x)=χ→{−1,+1}
(2) 计算 G m ( x ) {G_{m}(x)} Gm(x)在训练数据集上的分类误差率
e m = ∑ i = 1 N P ( G m ( x i ) ≠ y i ) = ∑ i = 1 ω m i I ( G m ( x i ) ≠ y i ) 且 ∑ i = 1 N w m i = 1 {e_{m}}=\sum_{i=1}^{N}P(G_{m}(x_{i})\neq y_{i})=\sum_{i=1}\omega_{mi}I(G_{m}(x_{i})\neq y_{i}) 且\sum_{i=1}^{N}w_{mi}=1 em=i=1∑NP(Gm(xi)=yi)=i=1∑ωmiI(Gm(xi)=yi)且i=1∑Nwmi=1
(3)计算 G m ( x ) {G_{m}(x)} Gm(x)的系数(由定理8.1得,该系数是通过最小化 Z m Z_{m} Zm即最小化误差上界,对 α m \alpha_{m} αm求梯度得到的) α m = 1 2 ln ( 1 − e m e m ) \alpha_{m}=\frac{1}{2}\ln (\frac{1-e_{m}}{e_{m}}) αm=21ln(em1−em)
(4)更新训练数据的权值分布
D m + 1 = ( ω m + 1 , 1 , . . . , ω m + 1 , i , . . . , ω m + 1 , N ) {D_{m+1}}= \left ( {\omega_{m+1,1},...,\omega_{m+1,i},...,\omega_{m+1,N}}\right ) Dm+1=(ωm+1,1,...,ωm+1,i,...,ωm+1,N)
ω m + 1 , i = w m i Z m exp ( − α m y i G m ( x i ) ) {\omega_{m+1,i}} =\frac{w_{mi}}{Z_{m}}\exp(-\alpha_{m}y_{i}G_{m}(x_{i})) ωm+1,i=Zmwmiexp(−αmyiGm(xi))对上式分类讨论化简后可以得到:
ω 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 \omega_{m+1,i}= \left\{\begin{matrix} \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{matrix}\right. ωm+1,i={Zmwmie−αm,Gm(xi)=yiZmwmieαm,Gm(xi)=yi
其中 Z m = ∑ i = 1 N exp ( − α m y i G m ( x i ) ) {Z_{m}}=\sum_{i=1}^{N}\exp(-\alpha_{m}y_{i}G_{m}(x_{i})) Zm=∑i=1Nexp(−αmyiGm(xi))为规范化因子,使得 D m + 1 {D_{m+1}} Dm+1成为一个概率分布。可以看出,误分类样本的权值得以扩大,而正确分类样本的权值得以缩小。 - 构建基本分类器的线性组合(实现加权表决)
f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^{M}\alpha_{m}G_{m}(x) f(x)=m=1∑MαmGm(x)进而得到最终分类器 G ( x ) = s i g n ( f ( x ) ) G(x)=sign(f(x)) G(x)=sign(f(x)),其中 α m \alpha_{m} αm表示弱分类器的重要性。
8.1.3AdaBoost的例子(代码实现)
这里我直接用代码模拟书中的计算过程:
import numpy as np
from math import log
#初始数据
W_1 = 0.1 * np.ones(10) # 初始权值0.1
x = np.arange(10)
y = np.array([1,1,1,-1,-1,-1,1,1,1,-1])
定义弱分类器
#弱分类器
def G(x,v):
if x < v:
return 1
else:
return -1
该分类器有两种分类方式,x < v 分类结果为 1或 -1,这里我们只考虑 x < v 分类结果为 1,因为另一种情况下的误分类概率为 1 -( x > v 分类结果为1时的误分类概率),即
G
1
(
x
)
=
{
1
x
<
v
−
1
x
>
v
G
2
(
x
)
=
{
−
1
x
<
v
1
x
>
v
G_{1}(x)=\left\{\begin{matrix} 1 \qquad x<v\\ -1 \quad x>v\\ \end{matrix}\right. G_{2}(x)=\left\{\begin{matrix} -1 \qquad x<v\\ 1 \qquad x>v\\ \end{matrix}\right.
G1(x)={1x<v−1x>vG2(x)={−1x<v1x>v假设
G
1
(
x
)
G_{1}(x)
G1(x)分类器的分类误差率为
e
m
{e_{m}}
em,则采用
G
2
(
x
)
G_{2}(x)
G2(x)分类器的分类误差率为
1
−
e
m
1-{e_{m}}
1−em。
计算分类误差
e
m
{e_{m}}
em
def e(W, y, G,v):
e = 0.5 * (abs(y - [G(xi,v) for xi in x]))
e = sum(W * e)
return e
计算 G m ( x ) {G_{m}(x)} Gm(x)的系数 α m \alpha_{m} αm
def alpha(e):
return 1 / 2 * log((1-e)/e)
更新训练数据的权值分布
def w(W_i, alpha_i, G, v, y):
Z_i = np.sum(W_i * np.exp(- alpha_i * y * [G(xi,v) for xi in x]))
return W_i/Z_i * np.exp(- alpha_i * y * [G(xi,v) for xi in x])
主函数
if __name__ == '__main__':
m = 3
for m in range(1,m+1):
min = 10000
index = 0 #表示每次循环得到分类误差率最低的分割点v
_alpha = 0
for v in np.arange(0.5,10.5,1):
e_m = e(W_1,y,G,v)
if min > e_m or min > 1 - e_m:#判断两种分类函数分类误差率的大小取其中小的作为分类器
if min > 1 - e_m:
min = 1 - e_m
else:
min = e_m
index = v
_alpha = alpha(min)
W_1 = w(W_1, _alpha, G, index, y)
print(index)#每次循环的分割点
print(min)#最低分类误差率
print(W_1)#更新后的权值分布
print(_alpha)#G的系数
8.2AdaBoost算法的训练误差分析
定理8.1 AdaBoost训练误差界
1
N
∑
i
=
1
N
I
(
G
(
x
i
)
≠
y
i
)
≤
1
N
∑
i
=
1
N
exp
(
−
y
i
f
(
x
i
)
)
=
∏
i
=
1
N
Z
i
\frac{1}{N}\sum\limits_{i=1}^NI(G(x_i)\ne y_i) \le \frac{1}{N}\sum\limits_{i=1}^N \exp(-y_if(x_i))=\prod\limits_{i=1}^NZ_i
N1i=1∑NI(G(xi)=yi)≤N1i=1∑Nexp(−yif(xi))=i=1∏NZi
证明过程:
(1)
G
(
x
i
)
≠
y
i
时
,
y
i
f
(
x
i
)
<
0
,
所
以
e
−
y
i
f
(
x
i
)
>
=
1
=
I
(
G
(
x
i
)
≠
y
i
)
,
G
(
x
i
)
=
y
i
G(x_{i})\neq y_{i}\text{时},y_{i}f(x_{i})<0,所以e^{-y_{i}f(x_{i})}>=1=I(G(x_{i})\neq y_{i}),G(x_{i})= y_{i}
G(xi)=yi时,yif(xi)<0,所以e−yif(xi)>=1=I(G(xi)=yi),G(xi)=yi时同理可证,直接得出等式的前半部分。
(2)证明后半部分
1
N
∑
i
=
1
N
exp
(
−
y
i
f
(
x
i
)
)
=
1
N
∑
i
=
1
N
exp
(
−
∑
m
=
1
M
a
m
y
i
G
m
(
x
i
)
)
=
∑
i
=
1
N
w
1
i
∏
m
=
1
M
exp
(
−
a
m
y
i
G
m
(
x
i
)
)
,
初
始
化
时
假
设
均
匀
分
布
w
1
i
=
1
N
=
Z
1
∑
i
=
1
N
w
2
i
∏
m
=
2
M
exp
(
−
a
m
y
i
G
m
(
x
i
)
)
=
Z
1
Z
2
∑
i
=
1
N
w
3
i
∏
m
=
3
M
exp
(
−
a
m
y
i
G
m
(
x
i
)
)
.
.
.
.
.
.
=
∏
m
=
1
M
Z
m
\frac{1}{N}\sum\limits_{i=1}^N\exp(-y_if(x_i))=\frac{1}{N}\sum\limits_{i=1}^N\exp (-\sum\limits_{m=1}^Ma_my_iG_m(x_i))\\ =\sum\limits_{i=1}^Nw_{1i}\prod_{m=1}^M \exp(-a_my_iG_m(x_i)),初始化时假设均匀分布w_{1i}=\frac{1}{N}\\ =Z_1\sum\limits_{i=1}^Nw_{2i}\prod_{m=2}^M \exp(-a_my_iG_m(x_i))\\ =Z_1Z_2\sum\limits_{i=1}^Nw_{3i}\prod_{m=3}^M \exp(-a_my_iG_m(x_i))\\ ......\\ =\prod\limits_{m=1}^MZ_m
N1i=1∑Nexp(−yif(xi))=N1i=1∑Nexp(−m=1∑MamyiGm(xi))=i=1∑Nw1im=1∏Mexp(−amyiGm(xi)),初始化时假设均匀分布w1i=N1=Z1i=1∑Nw2im=2∏Mexp(−amyiGm(xi))=Z1Z2i=1∑Nw3im=3∏Mexp(−amyiGm(xi))......=m=1∏MZm
这个定理的意义在于,每一轮选取适当的
G
m
G_m
Gm,使得
Z
m
Z_m
Zm最小,从而使训练误差下降最快。为了降低训练误差上界,应使得
Z
m
Z_m
Zm最小,
Z
m
Z_m
Zm公式中
y
i
y_i
yi与
G
(
x
i
)
G(x_i)
G(xi)为定值。
w
m
w_m
wm是通过上一次训练得到的值,所以
Z
m
Z_m
Zm是关于
α
\alpha
α的函数,通过对
α
\alpha
α求梯度,得
α
m
=
1
2
ln
(
1
−
e
m
e
m
)
\alpha_{m}=\frac{1}{2}\ln (\frac{1-e_{m}}{e_{m}})
αm=21ln(em1−em)
即AdaBoost算法中
G
(
x
)
G(x)
G(x)系数的由来
定理8.2 二分类问题AdaBoost训练误差界
∏
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
)
γ
m
=
1
2
−
e
m
\prod_{m=1}^MZ_m=\prod_{m=1}^M[2\sqrt{e_m(1-e_m)}]\\ =\prod_{m=1}^M\sqrt{(1-4\gamma^2_m)}\\ \le\exp(-2\sum\limits_{m=1}^M \gamma^2_m)\\ \gamma_m=\frac{1}{2}-e_m
m=1∏MZm=m=1∏M[2em(1−em)]=m=1∏M(1−4γm2)≤exp(−2m=1∑Mγm2)γm=21−em
证明过程
Z
m
=
∑
i
=
1
N
w
m
i
exp
(
−
a
m
y
i
G
m
(
x
i
)
)
=
∑
y
i
=
G
m
(
x
i
)
w
m
i
e
−
a
m
+
∑
y
i
≠
G
m
(
x
i
)
w
m
i
e
a
m
=
(
1
−
e
m
)
e
−
a
m
+
e
m
e
a
m
=
(
1
−
e
m
)
e
−
1
2
ln
(
1
−
e
m
e
m
)
+
e
m
e
1
2
ln
(
1
−
e
m
e
m
)
=
2
e
m
(
1
−
e
m
)
=
1
−
4
γ
m
2
Z_m=\sum\limits_{i=1}^Nw_{mi}\exp(-a_my_iG_m(x_i))\\ =\sum\limits_{y_i=G_m(x_i)}w_{mi}e^{-a_m}+\sum\limits_{y_i \ne G_m(x_i)}w_{mi}e^{a_m}\\ =(1-e_m)e^{-a_m}+e_me^{a_m}\\ =(1-e_m)e^{-\frac{1}{2}\ln (\frac{1-e_{m}}{e_{m}})}+e_me^{\frac{1}{2}\ln (\frac{1-e_{m}}{e_{m}})}\\ =2\sqrt{e_m(1-e_m)}\\ =\sqrt{1-4\gamma_m^2}
Zm=i=1∑Nwmiexp(−amyiGm(xi))=yi=Gm(xi)∑wmie−am+yi=Gm(xi)∑wmieam=(1−em)e−am+emeam=(1−em)e−21ln(em1−em)+eme21ln(em1−em)=2em(1−em)=1−4γm2
这里涉及到
e
−
1
2
x
e^{-\frac{1}{2}x}
e−21x和
1
−
x
\sqrt{1-x}
1−x泰勒展开:
e
−
1
2
x
=
1
−
1
2
x
+
1
8
x
2
+
o
(
x
3
)
1
−
x
=
1
−
1
2
x
−
1
8
x
2
+
o
(
x
3
)
e^{-\frac{1}{2}x} = 1-{\frac{1}{2}}x+\frac{1}{8}x^2+o(x^3)\\ \sqrt{1-x}=1-\frac{1}{2}x-\frac{1}{8}x^2+o(x^3)
e−21x=1−21x+81x2+o(x3)1−x=1−21x−81x2+o(x3)
令
x
=
4
γ
m
2
x=4\gamma_m^2
x=4γm2时
e
−
2
γ
m
2
=
1
−
2
γ
m
2
+
2
γ
m
4
1
−
4
γ
m
2
=
1
−
2
γ
m
2
−
2
γ
m
4
e^{-2\gamma_m^2}={1-2\gamma_m^2+2\gamma_m^4}\\ \sqrt{1-4\gamma_m^2}={1-2\gamma_m^2-2\gamma_m^4}
e−2γm2=1−2γm2+2γm41−4γm2=1−2γm2−2γm4
通过泰勒展开可以明显看出大小关系,这里仅展开到第三项,由此可得结论。
∏
m
=
1
M
(
1
−
4
γ
m
2
)
≤
exp
(
−
2
∑
m
=
1
M
γ
m
2
)
\prod_{m=1}^M\sqrt{(1-4\gamma^2_m)} \le\exp(-2\sum\limits_{m=1}^M \gamma^2_m)\\
m=1∏M(1−4γm2)≤exp(−2m=1∑Mγm2)
推论8.1
如果存在
γ
>
0
\gamma>0
γ>0,对于所有
m
m
m有
γ
m
>
=
γ
\gamma_m>=\gamma
γm>=γ,则
1
N
∑
i
=
1
N
I
(
G
(
x
i
)
≠
y
i
)
≤
exp
(
−
2
M
γ
2
)
\frac{1}{N}\sum\limits_{i=1}^NI(G(x_i) \ne y_i)\le \exp(-2M \gamma^2)
N1i=1∑NI(G(xi)=yi)≤exp(−2Mγ2)
这个推论的证明通过定理8.1和8.2的不等式即可轻易推出。
这个推论表明,通过训练误差上界可知,AdaBoost的训练误差是以指数速率下降的。且Adaboost算法不需要事先知道下界
γ
\gamma
γ,具有自适应性,它能自适应弱分类器的训练误差,从而提升准确率。
8.3 AdaBoost算法的解释
8.3.1前向分步算法
因为学习是加法模型,如果能够从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式,则可以简化优化的复杂度。
算法8.2前向分步算法
输入:训练数据集,损失函数
L
L
L,基函数
{
b
(
x
;
γ
)
}
\left \{b(x;\gamma)\right \}
{b(x;γ)}
输出:加法模型
- 初始化 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0;
- 对
m
=
1
,
2
,
.
.
.
,
M
m=1,2,...,M
m=1,2,...,M
(1)极小化损失函数
( β m , γ m ) = arg min β , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) ) (\beta_m,\gamma_m)=\argmin\limits_{\beta,\gamma}\sum\limits_{i=1}^NL(y_i,f_{m-1}(x_i)+\beta b(x_i;\gamma)) (βm,γm)=β,γargmini=1∑NL(yi,fm−1(xi)+βb(xi;γ))
其中 γ \gamma γ为基函数的参数, β \beta β为基函数的系数。
(2)更新函数
f m ( x ) = f m − 1 ( x ) + β m b ( x : γ m ) f_m(x)=f_{m-1}(x)+\beta_mb(x:\gamma_m) fm(x)=fm−1(x)+βmb(x:γm) - 得到加法模型
f ( x ) = f M ( x ) = ∑ m = 1 M β m b ( x : γ m ) f(x)=f_M(x)=\sum\limits_{m=1}^M\beta_mb(x:\gamma_m) f(x)=fM(x)=m=1∑Mβmb(x:γm)
8.3.2前向分步算法与AdaBoost
定理8.3AdaBoost是向前分步加法算法的特例
(1)模型:加法模型
(2)损失函数:指数函数
(3)学习算法:前向分步算法时的二分类学习
证明过程如下:
- 当基函数为基本分类器时,前向加法模型就等价于AdaBoost的最终分类器。
- 假设经过
m
−
1
m-1
m−1轮迭代前向前分步算法已经得到的
f
m
−
1
(
x
)
f_{m-1}(x)
fm−1(x),在第
m
m
m轮迭代得到了
α
m
,
G
m
(
x
)
,
f
m
(
x
)
\alpha_m,G_m(x),f_m(x)
αm,Gm(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)
指数损失函数为:
L ( y , f ( x ) ) = exp [ − y f ( x ) ] L(y,f(x))=\exp[-yf(x)] L(y,f(x))=exp[−yf(x)]
迭代的目的是使向前分步算法得到 α m , G m ( x ) \alpha_m,G_m(x) αm,Gm(x),使得$f_m(x)在训练集上的损失函数最小,若损失函数为指数损失函数:
( α 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))=\argmin\limits_{\alpha,G}\sum\limits_{i=1}^N \exp[-y_i(f_{m-1}(x_i)+\alpha G(x_i)] (αm,Gm(x))=α,Gargmini=1∑Nexp[−yi(fm−1(xi)+αG(xi)]
在该式子中,对于第 m m m次迭代, y i y_i yi与 f m − 1 ( x i ) f_{m-1}(x_i) fm−1(xi)为已知值,不依赖于 α \alpha α和 G G G,所以令 ω m i ^ = exp ( − y i f m − 1 ( x i ) ) \hat{\omega_{mi}}=\exp(-y_if_{m-1}(x_i)) ωmi^=exp(−yifm−1(xi)),该值与最小化无关,化简后上式得:
( α m , G m ( x ) ) = arg min α , G ∑ i = 1 N ω m i ^ exp [ − y i α G ( x i ) ] (\alpha_m,G_m(x))=\argmin\limits_{\alpha,G}\sum\limits_{i=1}^N \hat{\omega_{mi}}\exp[-y_i \alpha G(x_i)] (αm,Gm(x))=α,Gargmini=1∑Nωmi^exp[−yiαG(xi)]
因为 y i G ( x i ) y_iG(x_i) yiG(xi)的值为有限种可能(这里为+1,-1),所以将上式拆分:
( α m , G m ( x ) ) = arg min α , G ∑ y i = G ( x i ) N ω m i ^ exp ( − α ) + ∑ y i ≠ G ( x i ) N ω m i ^ exp ( α ) = arg min α , G ∑ y i = G ( x i ) ω m i ^ exp ( − α ) + ∑ y i ≠ G ( x i ) ω m i ^ exp ( − α ) + ∑ y i ≠ G ( x i ) ω m i ^ [ exp ( α ) − exp ( − α ) ] = arg min α , G exp ( − α ) ∑ i N ω m i ^ + [ exp ( α ) − exp ( − α ) ] ∑ i N ω m i ^ I ( y i ≠ G ( x i ) ) (\alpha_m,G_m(x))=\argmin\limits_{\alpha,G}\sum\limits_{y_i=G(x_i)}^N \hat{\omega_{mi}}\exp(-\alpha)+\sum\limits_{y_i\neq G(x_i)}^N \hat{\omega_{mi}}\exp(\alpha)\\ =\argmin\limits_{\alpha,G}\sum\limits_{y_i=G(x_i)} \hat{\omega_{mi}}\exp(-\alpha)+\sum\limits_{y_i\neq G(x_i)}\hat{\omega_{mi}}\exp(-\alpha)+\sum\limits_{y_i\neq G(x_i)}\hat{\omega_{mi}}[\exp(\alpha)-\exp(-\alpha)]\\ =\argmin\limits_{\alpha,G}\exp(-\alpha)\sum\limits_{i}^N\hat{\omega_{mi}}+[\exp(\alpha)-\exp(-\alpha)]\sum\limits_{i}^N\hat{\omega_{mi}}I(y_i\neq G(x_i)) (αm,Gm(x))=α,Gargminyi=G(xi)∑Nωmi^exp(−α)+yi=G(xi)∑Nωmi^exp(α)=α,Gargminyi=G(xi)∑ωmi^exp(−α)+yi=G(xi)∑ωmi^exp(−α)+yi=G(xi)∑ωmi^[exp(α)−exp(−α)]=α,Gargminexp(−α)i∑Nωmi^+[exp(α)−exp(−α)]i∑Nωmi^I(yi=G(xi))
求解G
上式中,为了使目标损失函数最小,针对 G G G来说,对于任意 α > 0 \alpha>0 α>0含 G G G项的值需最小,即
G m ∗ ( x ) = arg min G ∑ i = 1 N w m i ^ I ( y i ≠ G ( x i ) ) G_m^*(x)=\argmin\limits_G\sum\limits_{i=1}^N\hat{w_{mi}}I(y_i \ne G(x_i)) Gm∗(x)=Gargmini=1∑Nwmi^I(yi=G(xi))因为这里为给定 G ( x ) G(x) G(x)的具体形式,当给形式时,就可以用上式求解其参数。
求解 α \alpha α
把上式 G m ∗ ( x ) G_m^*(x) Gm∗(x)带入拆分后的式子得:
arg min α exp ( − α ) ∑ i N ω m i ^ + [ exp ( α ) − exp ( − α ) ] ∑ i N ω m i ^ I ( y i ≠ G ∗ ( x i ) ) \argmin\limits_{\alpha}\exp(-\alpha)\sum\limits_{i}^N\hat{\omega_{mi}}+[\exp(\alpha)-\exp(-\alpha)]\sum\limits_{i}^N\hat{\omega_{mi}}I(y_i\neq G^*(x_i)) αargminexp(−α)i∑Nωmi^+[exp(α)−exp(−α)]i∑Nωmi^I(yi=G∗(xi))
并对 α \alpha α进行求导后等于0,令 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 ( x i ) ) e_m=\frac{\sum\limits_{i=1}^N\hat{w_{mi}}I(y_i \ne G_m(x_i))}{\sum\limits_{i=1}^N\hat{w_{mi}}}=\sum\limits_{i=1}^N{w_{mi}}I(y_i \ne G(x_i)) em=i=1∑Nwmi^i=1∑Nwmi^I(yi=Gm(xi))=i=1∑NwmiI(yi=G(xi))
即分类误差率, 可以得到
α m ∗ = 1 2 log 1 − e m e m \alpha^*_m=\frac{1}{2}\log \frac{1-e_m}{e_m} αm∗=21logem1−em
这里得到的系数与AdaBoost步骤2.2中一致。 - 进行样本权值更新时,
ω m + 1 , i ^ = exp ( − y i f m ( x i ) ) = exp ( − y i ∑ j = 1 m α j G j ( x i ) ) = ∏ j m exp ( − y i α j G j ( x i ) ) = w m i exp ( − y i α m G m ( x i ) ) \hat{\omega_{m+1,i}}=\exp(-y_if_{m}(x_i))\\ =\exp(-y_i\sum\limits_{j=1}^{m}\alpha_jG_j(x_i))\\ =\prod\limits_j^{m}\exp(-y_i\alpha_jG_j(x_i))\\ ={w_{mi}}\exp(-y_{i}\alpha_{m}G_{m}(x_{i})) ωm+1,i^=exp(−yifm(xi))=exp(−yij=1∑mαjGj(xi))=j∏mexp(−yiαjGj(xi))=wmiexp(−yiαmGm(xi))
与AdaBoost中相比较,缺少了规范化因子 Z m Z_m Zm
ω m + 1 , i = w m i Z m exp ( − α m y i G m ( x i ) ) {\omega_{m+1,i}} =\frac{w_{mi}}{Z_{m}}\exp(-\alpha_{m}y_{i}G_{m}(x_{i})) ωm+1,i=Zmwmiexp(−αmyiGm(xi))
因为 Z m Z_m Zm当m确定时为定值,对于所有样本点都是相同的作用,所以不影响结果。到此证毕。
8.4提升树
8.4.1提升树模型
提升树被认为是统计学习中最有效的方法之一,以分类树和回归树维基本分类器的提升方法,或者说是是以决策树为基函数的提升方法,其模型为
f
M
(
x
)
=
∑
m
=
1
M
T
(
x
;
Θ
m
)
f_M(x)=\sum\limits_{m=1}^MT(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为树的个数。
8.4.2提升树算法
算法8.3回归问题的提升树算法
输入:训练数据集
输出:提升树
- 初始化提升树 f 0 ( x ) = 0. f_0(x)=0. f0(x)=0.
- 对
m
=
1
,
2
,
.
.
.
,
M
.
m=1,2,...,M.
m=1,2,...,M.
(1)计算残差
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,...,N rmi=yi−fm−1(xi), i=1,2,...,N
(2)拟合残差 r m i r_{mi} rmi学习一个回归树,得到 T ( x ; Θ m ) T(x;\Theta_m) T(x;Θm).
Θ ^ m = arg min Θ m ∑ i = 1 N L ( y i , f m − 1 ( x i ) + T ( x ; Θ m ) ) \hat{\Theta}_m=\argmin\limits_{\Theta_m}\sum\limits_{i=1}^N L(y_i,f_{m-1}(x_i)+T(x;\Theta_m)) Θ^m=Θmargmini=1∑NL(yi,fm−1(xi)+T(x;Θm))
若损失函数为平方误差函数,则上式子化简为:
Θ ^ m = arg min Θ m ∑ i = 1 N ( y − f m − 1 ( x ) − T ( x ; Θ m ) ) = arg min Θ m ∑ i = 1 N ( r m i − T ( x ; Θ m ) ) \hat{\Theta}_m=\argmin\limits_{\Theta_m}\sum\limits_{i=1}^N (y-f_{m-1}(x)-T(x;\Theta_m))\\ =\argmin\limits_{\Theta_m}\sum\limits_{i=1}^N( r_{mi}-T(x;\Theta_m)) Θ^m=Θmargmini=1∑N(y−fm−1(x)−T(x;Θm))=Θmargmini=1∑N(rmi−T(x;Θm))
(3)更新 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). - 得到回归问题提升树
f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_M(x)=\sum\limits_{m=1}^MT(x;\Theta_m) fM(x)=m=1∑MT(x;Θm)
例8.2 python模拟计算过程
import numpy as np
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [5.56, 5.70, 5.91, 6.40, 6.80, 7.05, 8.90, 8.70, 9.00, 9.05]
c_1=[] #每次迭代中每个分界点的左值
c_2=[] #每次迭代中每个分界点的右值
_L = [] #每次迭代的损失函数值
new_s=[] #最终的每个分界点
def create(r):
_c1 = 0
_c2 = 0
_s = 0
_m_s = 10000 #辅助用于取最小的m(s)
_y = [0 for i in range(len(x))] #辅助计算残差
for s in np.arange(1.5, 10.5, 1):
c1 = c2 = 0
N1 = N2 = 0
R1 = []
R2 = []
L = 0
for i in range(len(x)):
if x[i] <= s:
R1.append((x[i], r[i]))
c1 = c1 + r[i]
N1 = N1 + 1
else:
R2.append((x[i], r[i]))
c2 = c2 + r[i]
N2 = N2 + 1
c1 = c1 / N1
c2 = c2 / N2
m_s = sum((R1[i][1] - c1) * (R1[i][1] - c1) for i in range(len(R1)))) + sum((R2[i][1] - c2) * (R2[i][1] - c2) for i in range(len(R2))))
if _m_s > m_s:
_m_s = m_s
_c1 = c1
_c2 = c2
_s = s
c_1.append(_c1)
c_2.append(_c2)
new_s.append(_s)
for i in range(len(y)):
if x[i] < _s:
_y[i] = _c1
else:
_y[i] = _c2
r[i] = y[i] - _y[i]
L = L + r[i] * r[i]
_L.append(L)
print(L)
if __name__ == '__main__':
r = y
m = 6
for i in range(1,m+1):
create(r)
print(c_1)
print(c_2)
print(new_s)
print("------")
8.4.3梯度提升
对于一般的损失函数,每一步的优化并不容易,该算法将损失函数的负梯度在当前模型的值回归问题提升树算法中的残差的近似值,拟合回归树
算法8.4 梯度提升算法
输入:训练数据集,损失函数
输出:回归树
- 初始化
f
0
(
x
)
f_0(x)
f0(x):
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)
估计使损失函数极小化的常数值,它是只有一个根节点的树。 - 对
m
=
1
,
2
,
.
.
.
,
M
m=1,2,...,M
m=1,2,...,M
(1)对 i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N,计算损失函数的负梯度在当前模型的值,将它作为残差的估计(当损失函数为平方损失函数,它就是通常所说的残差):
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi}=-[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)} rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
(2)对 r m i r_{mi} rmi拟合一个回归树,得到第 m m m课树的叶节点区域 R m j , j = 1 , 2 , . . . J R_{mj},j=1,2,...J Rmj,j=1,2,...J
(3)对 j = 1 , 2 , . . . J , j=1,2,...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}=\argmin\limits_{c}\sum\limits_{x_j \in R_{mj}}L(y_i,f_{m-1}(x_i)+c) cmj=cargminxj∈Rmj∑L(yi,fm−1(xi)+c)
利用线性搜索估计夜间点区域的值,使损失函数极小化。
(4)更新 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\limits_{j=1}^Jc_{mj}I(x \in R_{mj}) fm(x)=fm−1(x)+j=1∑JcmjI(x∈Rmj) - 得到回归树
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\limits_{m=1}^M\sum\limits_{j=1}^Jc_{mj}I(x \in R_{mj}) f^(x)=fM(x)=m=1∑Mj=1∑JcmjI(x∈Rmj)
习题8.1
解题思路:
- 初始化训练数据的权值分布,这里依旧假设是均匀分布,样本数量是10。
D 1 = ( ω 11 , . . . , . . . , ω 1 , 10 ) = ( 0.1 , . . . . 0 , 1 ) {D_{1}}= \left ( {\omega_{11},...,...,\omega_{1,10}}\right )=(0.1,....0,1) D1=(ω11,...,...,ω1,10)=(0.1,....0,1) - 对
m
=
1
,
2
,
.
.
.
M
m=1,2,...M
m=1,2,...M,当误分类点为0时,结束循环。
(1)使用具有权值分布 D m D_m Dm的训练数据集学习CART树:
- 在CART树中,需要通过计算
G
i
n
i
Gini
Gini系数选取特征值,而AdaBoost算法是需要改变样本的权重来实现弱分类器的迭代。怎样将两个参数结合起来,
G
i
n
i
Gini
Gini系数表示样本集合的不确定性,而
ω
\omega
ω表示了接下来学习中样本的重要性。采用优化后的
G
i
n
i
Gini
Gini系数:(假设A表示身体,值为0,1)
G i n i ( S , A = 1 ) = ∣ S 1 ∣ S G i n i ( S 1 ) ∗ ∑ A i = 1 ω m i + ∣ S 2 ∣ S G i n i ( S 2 ) ∗ ∑ A i = 0 ω m i Gini(S,A=1) =\frac{ \left | S_1 \right |}{S}Gini(S_1)*\sum\limits_{A_i=1}\omega_{mi}\ + \frac{ \left | S_2 \right |}{S}Gini(S_2)*\sum\limits_{A_i=0}\omega_{mi} Gini(S,A=1)=S∣S1∣Gini(S1)∗Ai=1∑ωmi +S∣S2∣Gini(S2)∗Ai=0∑ωmi
这里假设 S 1 S_1 S1为身体为1的样本集, S 2 S_2 S2为身体为0的样本集,S为全部样本。这样计算后将样本的重要性与不确定性相结合,最终结果可以认为训练数据出现的概率(在原基尼系数中增加了该特点:权重大的数据出现的概率大) - 选择基尼系数最小的特征和对应的切分点,进行切分,生成决策树桩,作为弱分类器
G
m
(
x
)
G_{m}(x)
Gm(x)。
(2)计算 G m ( x ) G_{m}(x) Gm(x)在训练集上的分类误差率 e m e_m em.
(3)计算 G m ( x ) G_{m}(x) Gm(x)的系数 α m \alpha_m αm
(4)更新权值分布
- 构建最终分类器:
f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^{M}\alpha_{m}G_{m}(x) f(x)=m=1∑MαmGm(x)
习题8.2
- 支持向量机
- 学习策略:当训练数据近似线性可分时,通过软间隔最大化,学习一个线性分类器。
- 学习算法:SMO序列最小最优化算法
- AdaBoost
- 学习策略:通过极小化加法模型的指数损失,得到一个强分类器。
- 学习算法:前向分步算法。
- 逻辑斯谛回归模型
- 学习策略:在给定的训练数据条件下对模型进行极大似然估计或正则化的极大似然估计。
- 学习算法:改进的迭代尺度算法(IIS),梯度下降法,牛顿法以及拟牛顿法。
参考
[1] 李航《统计学习方法》
[2] 《机器学习实战》
笔者刚刚入门学习机器学习,因为水平有限,李航老师的书对入门不是特别友好,还在生啃阶段,如果有错误还请之处。