回顾boosting算法的基本原理
从图中可以看出,Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。
不过有几个具体的问题Boosting算法没有详细说明。
1)如何计算学习误差率e?
2) 如何得到弱学习器权重系数α?
3)如何更新样本权重D?
4) 使用何种结合策略?
只要是boosting大家族的算法,都要解决这4个问题。那么Adaboost是怎么解决的呢?
Adaboost算法的基本思路
我们这里讲解Adaboost是如何解决上一节这4个问题的。
假设我们的训练集样本是
T
=
{
(
x
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
(
x
m
,
y
m
)
}
T=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\}
T={(x,y1),(x2,y2),...(xm,ym)}
训练集的在第k个弱学习器的输出权重为
D
(
k
)
=
(
w
k
1
,
w
k
2
,
.
.
.
w
k
m
)
;
w
1
i
=
1
m
;
i
=
1
,
2...
m
D(k) = (w_{k1}, w_{k2}, ...w_{km}) ;\;\; w_{1i}=\frac{1}{m};\;\; i =1,2...m
D(k)=(wk1,wk2,...wkm);w1i=m1;i=1,2...m
分类问题的误差率很好理解和计算。由于多元分类是二元分类的推广,这里假设我们是二元分类问题,输出为{-1,1},则第k个弱分类器
G
k
(
x
)
G_k(x)
Gk(x)在训练集上的加权误差率(问题1误差率e) 为
e
k
=
P
(
G
k
(
x
i
)
≠
y
i
)
=
∑
i
=
1
m
w
k
i
I
(
G
k
(
x
i
)
≠
y
i
)
e_k = P(G_k(x_i) \neq y_i) = \sum\limits_{i=1}^{m}w_{ki}I(G_k(x_i) \neq y_i)
ek=P(Gk(xi)=yi)=i=1∑mwkiI(Gk(xi)=yi)
接着我们看弱学习器权重系数,对于二元分类问题,第k个弱分类器
G
k
(
x
)
G_k(x)
Gk(x)的权重系数(问题2权重系数a)为
α
k
=
1
2
l
o
g
1
−
e
k
e
k
\alpha_k = \frac{1}{2}log\frac{1-e_k}{e_k}
αk=21logek1−ek
为什么这样计算弱学习器权重系数?从上式可以看出,如果分类误差率
e
k
e_k
ek越大,则对应的弱分类器权重系数
α
k
\alpha_k
αk越小。也就是说,误差率小的弱分类器权重系数越大。具体为什么采用这个权重系数公式,我们在讲Adaboost的损失函数优化时再讲。
假设第k个弱分类器的样本集权重系数为
D
(
k
)
=
(
w
k
1
,
w
k
2
,
.
.
.
w
k
m
)
D(k) = (w_{k1}, w_{k2}, ...w_{km})
D(k)=(wk1,wk2,...wkm),则对应的第k+1个弱分类器的样本集权重(问题3样本权重D)系数为
w
k
+
1
,
i
=
w
k
i
Z
K
e
x
p
(
−
α
k
y
i
G
k
(
x
i
)
)
w_{k+1,i} = \frac{w_{ki}}{Z_K}exp(-\alpha_ky_iG_k(x_i))
wk+1,i=ZKwkiexp(−αkyiGk(xi))
这里
Z
k
Z_k
Zk是规范化因子
Z
k
=
∑
i
=
1
m
w
k
i
e
x
p
(
−
α
k
y
i
G
k
(
x
i
)
)
Z_k = \sum\limits_{i=1}^{m}w_{ki}exp(-\alpha_ky_iG_k(x_i))
Zk=i=1∑mwkiexp(−αkyiGk(xi))
从
w
k
+
1
,
i
w_{k+1,i}
wk+1,i计算公式可以看出,如果第i个样本分类错误,则
y
i
G
k
(
x
i
)
<
0
y_iG_k(x_i) < 0
yiGk(xi)<0,导致样本的权重在第k+1个弱分类器中增大,如果分类正确,则权重在第k+1个弱分类器中减少.具体为什么采用样本权重更新公式,我们在讲Adaboost的损失函数优化时再讲。
最后一个问题是集合策略。Adaboost分类采用的是加权表决法,最终的强分类器为
f
(
x
)
=
s
i
g
n
(
∑
k
=
1
K
α
k
G
k
(
x
)
)
f(x) = sign(\sum\limits_{k=1}^{K}\alpha_kG_k(x))
f(x)=sign(k=1∑KαkGk(x))
AdaBoost分类问题的损失函数优化(推导过程)
刚才上一节我们讲到了分类Adaboost的弱学习器权重系数公式和样本权重更新公式。但是没有解释选择这个公式的原因,让人觉得是魔法公式一样。其实它可以从Adaboost的损失函数推导出来。
从另一个角度讲, Adaboost是模型为加法模型,学习算法为前向分步学习算法,损失函数为指数函数的分类问题。
模型为加法模型好理解,我们的最终的强分类器是若干个弱分类器加权平均而得到的。
前向分步学习算法也好理解,我们的算法是通过一轮轮的弱学习器学习,利用前一个强学习器的结果和当前弱学习器来更新当前的强学习器的模型。也就是说,第k-1轮的强学习器为
f
k
−
1
(
x
)
=
∑
i
=
1
k
−
1
α
i
G
i
(
x
)
f_{k-1}(x) = \sum\limits_{i=1}^{k-1}\alpha_iG_{i}(x)
fk−1(x)=i=1∑k−1αiGi(x)
而第k轮的强学习器为
f
k
(
x
)
=
∑
i
=
1
k
α
i
G
i
(
x
)
f_{k}(x) = \sum\limits_{i=1}^{k}\alpha_iG_{i}(x)
fk(x)=i=1∑kαiGi(x)
上两式一比较可以得到
f
k
(
x
)
=
f
k
−
1
(
x
)
+
α
k
G
k
(
x
)
f_{k}(x) = f_{k-1}(x) + \alpha_kG_k(x)
fk(x)=fk−1(x)+αkGk(x)
可见强学习器的确是通过前向分步学习算法一步步而得到的。
Adaboost损失函数为指数函数,即定义损失函数为
a
r
g
m
i
n
⏟
α
,
G
∑
i
=
1
m
e
x
p
(
−
y
i
f
k
(
x
)
)
\underbrace{arg\;min\;}_{\alpha, G}\sum\limits_{i=1}^{m}exp(-y_if_{k}(x))
α,G
argmini=1∑mexp(−yifk(x))
利用前向分步学习算法的关系可以得到损失函数为
(
α
k
,
G
k
(
x
)
)
=
a
r
g
m
i
n
⏟
α
,
G
∑
i
=
1
m
e
x
p
[
(
−
y
i
)
(
f
k
−
1
(
x
)
+
α
G
(
x
)
)
]
(\alpha_k, G_k(x)) = \underbrace{arg\;min\;}_{\alpha, G}\sum\limits_{i=1}^{m}exp[(-y_i)(f_{k-1}(x) + \alpha G(x))]
(αk,Gk(x))=α,G
argmini=1∑mexp[(−yi)(fk−1(x)+αG(x))]
令
w
k
i
′
=
e
x
p
(
−
y
i
f
k
−
1
(
x
)
)
w_{ki}^{'} = exp(-y_if_{k-1}(x))
wki′=exp(−yifk−1(x)), 它的值不依赖于
α
,
G
\alpha, G
α,G,因此与最小化无关,仅仅依赖于
f
k
−
1
(
x
)
f_{k-1}(x)
fk−1(x),随着每一轮迭代而改变。
将这个式子带入损失函数,损失函数转化为
(
α
k
,
G
k
(
x
)
)
=
a
r
g
m
i
n
⏟
α
,
G
∑
i
=
1
m
w
k
i
′
e
x
p
[
−
y
i
α
G
(
x
)
]
(\alpha_k, G_k(x)) = \underbrace{arg\;min\;}_{\alpha, G}\sum\limits_{i=1}^{m}w_{ki}^{'}exp[-y_i\alpha G(x)]
(αk,Gk(x))=α,G
argmini=1∑mwki′exp[−yiαG(x)]
首先,我们求
G
k
(
x
)
G_k(x)
Gk(x),(极小化指数损失函数等价于最小化分类误差)可以得到
G
k
(
x
)
=
a
r
g
m
i
n
⏟
G
∑
i
=
1
m
w
k
i
′
I
(
y
i
≠
G
(
x
i
)
)
G_k(x) = \underbrace{arg\;min\;}_{G}\sum\limits_{i=1}^{m}w_{ki}^{'}I(y_i \neq G(x_i))
Gk(x)=G
argmini=1∑mwki′I(yi=G(xi))
将
G
k
(
x
)
G_k(x)
Gk(x)带入损失函数
∑
i
=
1
m
w
k
i
′
e
x
p
(
−
y
i
α
G
(
x
i
)
)
=
∑
y
i
=
G
k
(
x
i
)
w
k
i
′
e
−
α
+
∑
y
i
≠
G
k
(
x
i
)
w
k
i
′
e
α
=
(
e
α
−
e
−
α
)
∑
i
=
1
m
w
k
i
′
I
(
y
i
≠
G
k
(
x
i
)
)
+
e
−
α
∑
i
=
1
m
w
k
i
′
\sum\limits_{i=1}^mw_{ki}^{'}exp(-y_i\alpha G(x_i)) = \sum\limits_{y_i =G_k(x_i)}w_{ki}^{'}e^{-\alpha} + \sum\limits_{y_i \ne G_k(x_i)}w_{ki}^{'}e^{\alpha} \\ = (e^{\alpha} - e^{-\alpha})\sum\limits_{i=1}^mw_{ki}^{'}I(y_i \ne G_k(x_i)) + e^{-\alpha}\sum\limits_{i=1}^mw_{ki}^{'}
i=1∑mwki′exp(−yiαG(xi))=yi=Gk(xi)∑wki′e−α+yi=Gk(xi)∑wki′eα=(eα−e−α)i=1∑mwki′I(yi=Gk(xi))+e−αi=1∑mwki′
从1式到2式仅仅是把1式右边的第一部分看做总的减去
y
i
≠
G
k
(
x
i
)
y_i \ne G_k(x_i)
yi=Gk(xi)的部分。
现在我们对
α
\alpha
α求导并令其导数为0,得到:
(
e
α
+
e
−
α
)
∑
i
=
1
m
w
k
i
′
I
(
y
i
≠
G
k
(
x
i
)
)
−
e
−
α
∑
i
=
1
m
w
k
i
′
=
0
(e^{\alpha} + e^{-\alpha})\sum\limits_{i=1}^mw_{ki}^{'}I(y_i \ne G_k(x_i)) - e^{-\alpha}\sum\limits_{i=1}^mw_{ki}^{'} = 0
(eα+e−α)i=1∑mwki′I(yi=Gk(xi))−e−αi=1∑mwki′=0
注意到:
e
k
=
∑
i
=
1
m
w
k
i
’
I
(
y
i
≠
G
(
x
i
)
)
∑
i
=
1
m
w
k
i
’
=
∑
i
=
1
m
w
k
i
I
(
G
k
(
x
i
)
≠
y
i
)
e_k = \frac{\sum\limits_{i=1}^{m}w_{ki}^{’}I(y_i \neq G(x_i))}{\sum\limits_{i=1}^{m}w_{ki}^{’}} \\ =\sum\limits_{i=1}^{m}w_{ki}I(G_k(x_i) \neq y_i)
ek=i=1∑mwki’i=1∑mwki’I(yi=G(xi))=i=1∑mwkiI(Gk(xi)=yi)
所以公式变为
(
e
α
+
e
−
α
)
e
k
−
e
−
α
=
0
(e^{\alpha} + e^{-\alpha})e_k -e^{-\alpha}=0
(eα+e−α)ek−e−α=0
e
k
=
e
−
α
(
e
α
+
e
−
α
)
e_k=\frac{e^{-\alpha}}{(e^{\alpha} + e^{-\alpha})}
ek=(eα+e−α)e−α
1
−
e
k
e
k
=
e
2
α
\frac{1-e_k}{e_k}=e^{2\alpha}
ek1−ek=e2α
最终
α
k
=
1
2
l
o
g
1
−
e
k
e
k
\alpha_k = \frac{1}{2}log\frac{1-e_k}{e_k}
αk=21logek1−ek
其中,
e
k
e_k
ek即为我们前面的分类误差率。
e
k
=
∑
i
=
1
m
w
k
i
′
I
(
y
i
≠
G
(
x
i
)
)
∑
i
=
1
m
w
k
i
′
=
∑
i
=
1
m
w
k
i
I
(
y
i
≠
G
(
x
i
)
)
e_k = \frac{\sum\limits_{i=1}^{m}w_{ki}^{'}I(y_i \neq G(x_i))}{\sum\limits_{i=1}^{m}w_{ki}^{'}} = \sum\limits_{i=1}^{m}w_{ki}I(y_i \neq G(x_i))
ek=i=1∑mwki′i=1∑mwki′I(yi=G(xi))=i=1∑mwkiI(yi=G(xi))
即
w
k
i
w_{ki}
wki仅仅是比
w
k
i
’
w_{ki}^{’}
wki’多了一个规范化因子的分母
Z
K
Z_K
ZK而已。也就是说,
w
k
i
w_{ki}
wki是
w
k
i
’
w_{ki}^{’}
wki’规范化后的表达式,即可以得到:
w
k
i
=
w
k
i
’
∑
i
=
1
m
w
k
i
’
w_{ki} = \frac{w_{ki}^{’}}{\sum\limits_{i=1}^mw_{ki}^{’}}
wki=i=1∑mwki’wki’
最后看样本权重的更新。利用
f
k
(
x
)
=
f
k
−
1
(
x
)
+
α
k
G
k
(
x
)
;
f_{k}(x) = f_{k-1}(x) + \alpha_kG_k(x);
fk(x)=fk−1(x)+αkGk(x);和
w
k
i
′
=
e
x
p
(
−
y
i
f
k
−
1
(
x
)
)
w_{ki}^{'} = exp(-y_if_{k-1}(x))
wki′=exp(−yifk−1(x)),即可得:
w
k
+
1
,
i
′
=
w
k
i
′
e
x
p
[
−
y
i
α
k
G
k
(
x
)
]
w_{k+1,i}^{'} = w_{ki}^{'}exp[-y_i\alpha_kG_k(x)]
wk+1,i′=wki′exp[−yiαkGk(x)]
AdaBoost二元分类问题算法流程
这里我们对AdaBoost二元分类问题算法流程做一个总结。
输入为样本集
T
=
{
(
x
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
(
x
m
,
y
m
)
}
T=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\}
T={(x,y1),(x2,y2),...(xm,ym)},输出为{-1, +1},弱分类器算法, 弱分类器迭代次数K。
输出为最终的强分类器
f
(
x
)
f(x)
f(x)
- 初始化样本集权重为 D ( 1 ) = ( w 11 , w 12 , . . . w 1 m ) ; w 1 i = 1 m ; i = 1 , 2... m D(1) = (w_{11}, w_{12}, ...w_{1m}) ;\;\; w_{1i}=\frac{1}{m};\;\; i =1,2...m D(1)=(w11,w12,...w1m);w1i=m1;i=1,2...m
- 对于k=1,2,…K:
a) 使用具有权重 D k D_k Dk的样本集来训练数据,得到弱分类器 G k ( x ) G_k(x) Gk(x)
b) 计算 G k ( x ) G_k(x) Gk(x)的分类误差率 e k = P ( G k ( x i ) ≠ y i ) = ∑ i = 1 m w k i I ( G k ( x i ) ≠ y i ) e_k = P(G_k(x_i) \neq y_i) = \sum\limits_{i=1}^{m}w_{ki}I(G_k(x_i) \neq y_i) ek=P(Gk(xi)=yi)=i=1∑mwkiI(Gk(xi)=yi)
c) 计算弱分类器的系数 α k = 1 2 l o g 1 − e k e k \alpha_k = \frac{1}{2}log\frac{1-e_k}{e_k} αk=21logek1−ek
d) 更新样本集的权重分布 w k + 1 , i = w k i Z K e x p ( − α k y i G k ( x i ) ) i = 1 , 2 , . . . m w_{k+1,i} = \frac{w_{ki}}{Z_K}exp(-\alpha_ky_iG_k(x_i)) \;\; i =1,2,...m wk+1,i=ZKwkiexp(−αkyiGk(xi))i=1,2,...m
这里 Z k Z_k Zk是规范化因子 Z k = ∑ i = 1 m w k i e x p ( − α k y i G k ( x i ) ) Z_k = \sum\limits_{i=1}^{m}w_{ki}exp(-\alpha_ky_iG_k(x_i)) Zk=i=1∑mwkiexp(−αkyiGk(xi)) - 构建最终分类器为:
f
(
x
)
=
s
i
g
n
(
∑
k
=
1
K
α
k
G
k
(
x
)
)
f(x) = sign(\sum\limits_{k=1}^{K}\alpha_kG_k(x))
f(x)=sign(k=1∑KαkGk(x))
对于Adaboost多元分类算法,其实原理和二元分类类似,最主要区别在弱分类器的系数上。比如Adaboost SAMME算法,它的弱分类器的系数 α k = 1 2 l o g 1 − e k e k + l o g ( R − 1 ) \alpha_k = \frac{1}{2}log\frac{1-e_k}{e_k} + log(R-1) αk=21logek1−ek+log(R−1)
其中R为类别数。从上式可以看出,如果是二元分类,R=2,则上式和我们的二元分类算法中的弱分类器的系数一致。
Adaboost小结
到这里Adaboost就写完了,前面有一个没有提到,就是弱学习器的类型。理论上任何学习器都可以用于Adaboost.但一般来说,使用最广泛的Adaboost弱学习器是决策树和神经网络。对于决策树,Adaboost分类用了CART分类树,而Adaboost回归用了CART回归树。
这里对Adaboost算法的优缺点做一个总结。
Adaboost的主要优点有:
1)Adaboost作为分类器时,分类精度很高
2)在Adaboost的框架下,可以使用各种回归分类模型来构建弱学习器,非常灵活。
3)作为简单的二元分类器时,构造简单,结果可理解。
4)不容易发生过拟合
Adaboost的主要缺点有:
1)对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性。
转载自 https://www.cnblogs.com/pinard/p/6133937.html#!comments