摘要
历史上,Kerans和Vialiant首先提出了“强可学习”和“弱可学习”的概念。指出:在概率近似正确(PAC)学习的框架内,一个类,如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么就称这个概念是强可学习的;一个概念,如果存在一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测略好,那么就称这个概念是弱可学习的。
有没有一种方法可以把弱学习算法提升为强学习算法呢,AdaBoost就是这样的一个算法。
Adaboost算法介绍与证明,带你入门数据科学
什么是adaBoost
AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由Yoav Freund和Robert Schapire在1995年提出。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。
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 , y i ∈ Y = { − 1 , 1 } x_i \in X \subseteq R^n,y_i\in Y=\{-1,1\} xi∈X⊆Rn,yi∈Y={−1,1},迭代次数即弱分类器个数为 M M M。
- 初始化训练样本的权重分布为: D 1 = ( w 11 , w 12 , ⋯ , w 1 N ) , w 1 i = 1 N , i = 1 , 2 , ⋯ , N D_1=(w_{11},w_{12},\cdots,w_{1N}),w_{1i}=\frac{1}{N},i=1,2,\cdots,N D1=(w11,w12,⋯,w1N),w1i=N1,i=1,2,⋯,N其中 D 1 D_1 D1代表第一个弱分类器,里面的权重都是样本对于第一个弱分类器的权重。
- 对于
m
=
1
,
2
,
⋯
,
M
m=1,2,\cdots,M
m=1,2,⋯,M。
M
M
M代表一共有多少个弱分类器。
(a)使用具有权重分布 D m D_m Dm(这个权重在上一次训练完一个设置好了)的训练数据集进行学习,得到弱分类器 G m ( x ) G_m(x) Gm(x)
(b)计算 G m ( x ) G_m(x) Gm(x)在训练数据集上的分类误差率: e m = ∑ i = 1 N w m i I ( G m ( x i ) ≠ y i ) e_m=\sum_{i=1}^Nw_{mi}I(G_m(x_i)\ne y_i) em=i=1∑NwmiI(Gm(xi)=yi)其中 I I I代表的是指示函数(indicator function)。它的含义是:当输入为True的时候,输出为1,输入为False的时候,输出为0。
(c)计算 G m ( x ) G_m(x) Gm(x)在强分类器中所占的比重: α m = 1 2 l n 1 − e m e m \alpha_m=\frac{1}{2}ln\frac{1-e_m}{e_m} αm=21lnem1−em对其求导我们可以得到 a m ′ = − 1 2 1 ( 1 − e m ) e m a_m'=-\frac{1}{2}\frac{1}{(1-e_m)e_m} am′=−21(1−em)em1。所以我们知道这个函数在(0,1)单调递减,所以误差越小分类器所占的比重越大。
(d)更新训练数据集的权重分布(这里, z m z_m zm是归一化因子,为了使样本的概率分布和为1): w ( m + 1 ) i = w m i z m e x p ( − α y i G m ( x i ) ) , i = 1 , 2 , ⋯ , N z m = ∑ i = 1 N w m i e x p ( − α y i G m ( x i ) ) w_{(m+1)i}=\frac{w_{mi}}{z_m}exp(-\alpha y_i G_m(x_i)),i=1,2,\cdots,N\\ z_m=\sum_{i=1}^Nw_{mi}exp(-\alpha y_i G_m(x_i)) w(m+1)i=zmwmiexp(−αyiGm(xi)),i=1,2,⋯,Nzm=i=1∑Nwmiexp(−αyiGm(xi))其中,当分类正确的时候,预测与实际同号, y i G m ( x i ) > 0 y_iG_m(x_i)>0 yiGm(xi)>0,错误的时候预测与实际异号 y i G m ( x i ) < 0 y_iG_m(x_i)<0 yiGm(xi)<0,而且越接近真实值,这个数就越大,这样就达到了给错误的数据更大的权重的效果。 - 得到最终的分类器为: F ( x ) = s i g n ( ∑ m = 1 M α m G m ( x ) ) F(x)=sign(\sum_{m=1}^M\alpha_mG_m(x)) F(x)=sign(m=1∑MαmGm(x))其中 α m \alpha_m αm代表对于分类器的权重。
前置知识
前向分布算法
考虑加法模型
f
(
x
)
=
∑
m
=
1
M
β
m
b
(
x
;
γ
m
)
f(x)=\sum_{m=1}^M \beta_m b(x;\gamma_m)
f(x)=m=1∑Mβmb(x;γm)其中,
b
(
x
;
γ
m
)
b(x;\gamma_m)
b(x;γm)为基函数,
γ
m
\gamma_m
γm为基函数的参数,
β
m
\beta_m
βm为基函数的系数。显然,这是一个加法模型。
在给定训练数据及损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x))的条件下,学习加法模型
f
(
x
)
f(x)
f(x)成为经验风险极小化即损失函数极小化问题:
m
i
n
∑
i
=
1
N
L
(
y
i
,
∑
m
=
1
M
β
m
b
(
x
i
;
γ
m
)
)
min\sum_{i=1}^NL\left(y_i,\sum_{m=1}^M\beta_m b(x_i;\gamma_m)\right)
mini=1∑NL(yi,m=1∑Mβmb(xi;γm))这通常是一个复杂的优化问题。前向分布算法求解这一优化问题的想法是:因为学习得是加法模型,如果能够从前向后,每一步只学习一个基函数及其系数。逐步逼近优化目标函数式,那么就可以简化优化的复杂度。具体地,只需要每步优化如下损失函数:
(
β
m
,
γ
m
)
=
a
r
g
m
i
n
∑
i
=
1
N
L
(
y
i
,
β
b
(
x
i
;
γ
)
)
(\beta_m,\gamma_m)=argmin \sum_{i=1}^NL(y_i,\beta b(x_i;\gamma))
(βm,γm)=argmini=1∑NL(yi,βb(xi;γ))这样,前向分布算法将同时求解从
m
=
1
m=1
m=1到
M
M
M所有参数
β
m
,
γ
m
\beta_m,\gamma_m
βm,γm的优化问题简化为逐次求解各个
β
m
,
γ
m
\beta_m,\gamma_m
βm,γm的优化问题。
算法证明
我们下面要证明AdaBoost算法是前向分布加法算法的特例。我先提出两个问题。
- 为什么求L的时候基函数前面要有 β \beta β?AdaBoost用的可不只是最后一项啊?
- 说他是前向分布加法模型,但是前向分布加法模型似乎没有改变数据的权重?
定理:AdaBoost算法是前向分布加法算法的特例。这时,模型是由基本分类器组成的加法模型,损失函数是指数函数。
证明:
假设经过
m
−
1
m-1
m−1轮迭代,得到弱分类器
f
m
−
1
(
x
)
f_{m-1}(x)
fm−1(x),根据前向分布,有:
f
m
(
x
)
=
f
m
−
1
(
x
)
+
α
m
G
m
(
x
)
f_m(x)=f_{m-1}(x)+\alpha_m G_m(x)
fm(x)=fm−1(x)+αmGm(x)其中
G
m
(
x
)
G_m(x)
Gm(x)是第
m
m
m轮训练出来的弱分类器。
对
L
o
s
s
Loss
Loss函数进行处理和化简:
损失函数是指数损失,则有:
L
o
s
s
=
∑
i
=
1
N
e
x
p
(
−
y
i
f
m
(
x
i
)
)
=
∑
i
=
1
N
e
x
p
(
−
y
i
(
f
m
−
1
(
x
i
)
+
α
m
G
m
(
x
i
)
)
)
Loss=\sum_{i=1}^Nexp(-y_if_m(x_i))=\sum_{i=1}^Nexp(-y_i(f_{m-1}(x_i)+\alpha_mG_m(x_i)))
Loss=i=1∑Nexp(−yifm(xi))=i=1∑Nexp(−yi(fm−1(xi)+αmGm(xi)))因为
f
m
−
1
(
x
)
f_{m-1}(x)
fm−1(x)是已知的,所以将其移到前面作为常数项:
L
o
s
s
=
∑
i
=
1
H
w
m
1
~
e
x
p
(
−
y
i
α
m
G
m
(
x
i
)
)
Loss=\sum_{i=1}^H\widetilde{w_{m1}}exp(-y_i\alpha_mG_m(x_i))
Loss=i=1∑Hwm1
exp(−yiαmGm(xi))其中:
w
m
i
~
=
e
x
p
(
−
y
i
(
F
m
−
1
(
x
)
)
)
\widetilde{w_{mi}}=exp(-y_i(F_{m-1}(x)))
wmi
=exp(−yi(Fm−1(x)))是每轮迭代的样本权重。
继续化简
L
o
s
s
Loss
Loss:
L
o
s
s
=
∑
i
=
1
H
w
m
1
~
e
x
p
(
−
y
i
α
m
G
m
(
x
i
)
)
=
∑
y
i
=
G
m
(
x
i
)
w
m
i
~
e
x
p
(
−
α
m
)
+
∑
y
i
≠
G
m
(
x
i
)
w
m
i
~
e
x
p
(
α
m
)
=
∑
i
=
1
N
w
m
i
~
(
∑
y
i
=
G
m
(
x
i
)
w
m
i
~
∑
i
=
1
N
w
m
i
~
e
x
p
(
−
α
m
)
+
∑
y
i
≠
G
m
(
x
i
)
w
m
i
~
∑
i
=
1
N
w
m
i
~
e
x
p
(
α
m
)
)
\begin{aligned}Loss&=\sum_{i=1}^H\widetilde{w_{m1}}exp(-y_i\alpha_mG_m(x_i))\\&=\sum_{y_i=G_m(x_i)}\widetilde{w_{mi}}exp(-\alpha_m)+\sum_{y_i\ne G_m(x_i)}\widetilde{w_{mi}}exp(\alpha_m)\\&=\sum_{i=1}^N\widetilde{w_{mi}}\left(\frac{\sum_{y_i=G_m(x_i)}\widetilde{w_{mi}}}{\sum_{i=1}^N\widetilde{w_{mi}}}exp(-\alpha_m)+\frac{\sum_{y_i\ne G_m(x_i)}\widetilde{w_{mi}}}{\sum_{i=1}^N\widetilde{w_{mi}}}exp(\alpha_m)\right)\end{aligned}
Loss=i=1∑Hwm1
exp(−yiαmGm(xi))=yi=Gm(xi)∑wmi
exp(−αm)+yi=Gm(xi)∑wmi
exp(αm)=i=1∑Nwmi
(∑i=1Nwmi
∑yi=Gm(xi)wmi
exp(−αm)+∑i=1Nwmi
∑yi=Gm(xi)wmi
exp(αm))因为我们要使得损失函数最小,所以我们的目标是找到
(
α
m
∗
,
G
m
∗
)
=
a
r
g
m
i
n
L
o
s
s
(\alpha_m^*,G_m^*)=argmin\ Loss
(αm∗,Gm∗)=argmin Loss。其中
α
m
∗
\alpha_m^*
αm∗是这个分类器的权重,
G
m
∗
G_m^*
Gm∗代表这个分类器。
我们先计算
α
m
∗
\alpha_m^*
αm∗:
我们观察上面的式子,设我们预测的错误率为
e
m
e_m
em,则上述式子可以表示为以下形式
L
o
s
s
=
∑
i
=
1
N
w
m
i
(
(
1
−
e
m
)
e
x
p
(
−
α
m
)
+
e
m
e
x
p
(
α
m
)
)
Loss=\sum_{i=1}^Nw_{mi}((1-e_m)exp(-\alpha_m)+e_mexp(\alpha_m))
Loss=i=1∑Nwmi((1−em)exp(−αm)+emexp(αm))对
α
m
\alpha_m
αm求偏导,得到:
L
o
s
s
′
=
w
m
i
(
−
(
1
−
e
m
)
e
x
p
(
−
α
m
)
+
e
m
e
x
p
(
α
m
)
)
Loss'=w_{mi}(-(1-e_m)exp(-\alpha_m)+e_mexp(\alpha_m))
Loss′=wmi(−(1−em)exp(−αm)+emexp(αm))令其等于
0
0
0得到:
α
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我们发现这个权重和AdaBoost算法的权重一样。
**下面我们计算
G
m
(
x
i
)
G_m(x_i)
Gm(xi):**我们观察可以发现
G
m
∗
G_m^*
Gm∗的计算与
α
m
∗
\alpha_m^*
αm∗无关,加权后的正确率越高,损失值就越小,我们不难得出以下式子:
G
m
∗
=
a
r
g
m
i
n
∑
i
=
1
N
w
m
i
~
I
(
y
i
≠
G
(
x
i
)
)
G_m^*=argmin\sum_{i=1}^N\widetilde{w_{mi}}I(y_i\ne G(x_i))
Gm∗=argmini=1∑Nwmi
I(yi=G(xi))这个计算的过程也是和AdaBoost是一样的。
最后来看样本权重的更新:
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
~
=
e
x
p
(
−
y
i
f
m
−
1
(
x
i
)
)
\widetilde{w_{mi}}=exp(-y_if_{m-1}(x_i))
wmi
=exp(−yifm−1(xi)),可得
w
(
m
+
1
)
i
~
=
w
m
i
~
e
x
p
(
−
y
i
α
m
G
m
(
x
)
)
\widetilde{w_{(m+1)i}}=\widetilde{w_{mi}}exp(-y_i\alpha_mG_m(x))
w(m+1)i
=wmi
exp(−yiαmGm(x))这个更新和AdaBoost算法的样本权重更新只相差归一化因子,所以也是等价的。
通过上述方法我们证明了AdaBoost算法是前向分布加法算法的特例。这时,模型是由基本分类器组成的加法模型,损失函数是指数函数。
前面提出的问题解答:
4.
β
\beta
β对应于基函数的权重。是为了最小化损失函数而计算出来的,也就是上面的
α
\alpha
α。
5. 其实样本权重的更新是在损失函数计算的时候进行的。前面的弱分类器的输出值在损失函数中取了指数后,变成了样本权重项。
6. 还是不太明白的话再看一遍证明吧