一、引言
在集成学习原理介绍中,简单的介绍了根据个体学习器学习方式不同划分的两大类集成学习方法,个体学习器间存在强依赖关系、必须串行生成的序列化方法,如Boosting;个体学习器间不存在强依赖关系、可同时生成的并行化方法,如Bagging。
回顾一下Boosting算法的学习机制:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的的训练样本在后续受到更多关注,然后基于调整后的样本分布训练下一个基学习器;重复进行,直到基学习器数目达到事先指定的值T,最终将这T个基学习器加权结合
二、Adaboost的基本思路
Boosting算法中,我们发现了几个没有展开的细节问题:
1.如何根据基学习器的表现对训练样本分布进行调整?
2.如何计算基学习器的权重?
我们来看看Adaboost是如何实现这两个细节的。
1.Adaboost的三个实质
假设我们要解决一个二分类问题,每个基分类器
ht(x):χ−>{−1,+1} h t ( x ) : χ − > { − 1 , + 1 }
我们来思考一下这个问题,第一个基学习器是在原始数据上训练的,即初始化的样本权重是这样的,每个样本都是一样的权重
D1=(ω11,ω12,⋯,ω1N) D 1 = ( ω 11 , ω 12 , ⋯ , ω 1 N )
ω1i=1N,i=1,2,⋯,N ω 1 i = 1 N , i = 1 , 2 , ⋯ , N
第二个基学习器根据第一个基学习器的表现来调整权重,那么怎么衡量第一个基学习器的表现呢?很简单,看看谁错了,谁对了,就可以了嘛。这里我们用基学习器的输出 Gm(x)f(x)=1 G m ( x ) f ( x ) = 1 表示预测正确, Gm(x)f(x)=−1 G m ( x ) f ( x ) = − 1 表示预测错误,同时,我们用分类错误率来衡量这个基分类器的表现
em=∑Ni=1P(ht(x)≠f(x)) e m = ∑ i = 1 N P ( h t ( x ) ≠ f ( x ) )
接下来我们要使得做错的样本在下一轮学习中受到更多关注,也就是预测错误的样本的权重要增大,使得在新的样本分布上训练的基学习器能纠正前一轮分类器的错误。我们考虑最小化分类错误率,但是分类错误率是一个0/1损失,很难优化,很容易想到0/1损失的一些替代损失函数,这里我们用指数损失函数,为什么可以用指数损失函数呢?
lexp(H|D)=e−H(x)f(x) l e x p ( H | D ) = e − H ( x ) f ( x )
∂lexp(H|D)∂H(x)=e−H(x)f(x)(−f(x)) ∂ l e x p ( H | D ) ∂ H ( x ) = e − H ( x ) f ( x ) ( − f ( x ) )
=−e−H(x)P(f(x)=1|x)+eH(x)P(f(x)=−1|x) = − e − H ( x ) P ( f ( x ) = 1 | x ) + e H ( x ) P ( f ( x ) = − 1 | x )
令上式等于0,得 H(x)=12lnP(f(x)=1|x)P(f(x)=−1|x) H ( x ) = 1 2 l n P ( f ( x ) = 1 | x ) P ( f ( x ) = − 1 | x )
=argmaxy∈{−1,1}P(f(x)=y|x) = a r g m a x y ∈ { − 1 , 1 } P ( f ( x ) = y | x )
可见, sign(H(x)) s i g n ( H ( x ) ) 达到了贝叶斯最优错误率,如果指数损失最小化,分类错误率也将最小化,所以指数损失函数可以替代0/1损失。
第一个实质:损失函数为指数损失函数
继续我们的问题,最小化指数损失函数,如果上一轮的强学习器是
Ht−1(x)=∑t−1i=1αihi(x) H t − 1 ( x ) = ∑ i = 1 t − 1 α i h i ( x )
那么这一轮的强学习器为
Ht(x)=∑ti=1αihi(x) H t ( x ) = ∑ i = 1 t α i h i ( x )
=Ht−1(x)+αtht(x)
=
H
t
−
1
(
x
)
+
α
t
h
t
(
x
)
第二个实质:学习算法是前向分布学习算法
所以这一轮我们的损失函数为
lexp(H|D)=e−(Ht−1(x)+αtht(x))f(x) l e x p ( H | D ) = e − ( H t − 1 ( x ) + α t h t ( x ) ) f ( x )
=e−f(x)Ht−1(x))e−f(x)αtht(x) = e − f ( x ) H t − 1 ( x ) ) e − f ( x ) α t h t ( x )
经过数学推导(省略),可以得到
Dt+1=(ωt+1,1,ωt+1,2,⋯,ωt+1,N) D t + 1 = ( ω t + 1 , 1 , ω t + 1 , 2 , ⋯ , ω t + 1 , N )
ωt+1,i=ωt,iexp(αtf(x)ht(x))∑Ni=1ωt,iexp(αtf(xi)ht(xi)) ω t + 1 , i = ω t , i e x p ( α t f ( x ) h t ( x ) ) ∑ i = 1 N ω t , i e x p ( α t f ( x i ) h t ( x i ) )
αt=12log1−etet α t = 1 2 l o g 1 − e t e t 是基分类器的系数
好了,权重和分布调整我们都有了,下面总结一下 AdaBoost算法的流程
Step1:初始化样本权重
D1=(ω11,ω12,⋯,ω1N) D 1 = ( ω 11 , ω 12 , ⋯ , ω 1 N )
ω1i=1N,i=1,2,⋯,N ω 1 i = 1 N , i = 1 , 2 , ⋯ , N
Step2:当
t=1,2,⋯,T
t
=
1
,
2
,
⋯
,
T
(1)在带权重的训练数据上学习基分类器
ht(x)
h
t
(
x
)
(2)计算基分类器的分类误差率
em=∑Ni=1P(ht(x)≠f(x)) e m = ∑ i = 1 N P ( h t ( x ) ≠ f ( x ) )
=∑ht(x)≠f(x)ωti
=
∑
h
t
(
x
)
≠
f
(
x
)
ω
t
i
(3)计算基分类器的系数
αt=12log1−etet α t = 1 2 l o g 1 − e t e t
(4)更新样本分布权重
ωt+1,i=ωt,iexp(αtf(x)ht(x))∑Ni=1ωt,iexp(αtf(xi)ht(xi)) ω t + 1 , i = ω t , i e x p ( α t f ( x ) h t ( x ) ) ∑ i = 1 N ω t , i e x p ( α t f ( x i ) h t ( x i ) )
Step3:得到强分类器
H(x)=sign(∑Tt=1αtht(x)) H ( x ) = s i g n ( ∑ t = 1 T α t h t ( x ) )
第三个实质:这是个加法模型
2.AdaBoost总结
分类误差率
et
e
t
:由算法流程中的分类误差率计算公式我们可以看到,训练数据集上的分类误差率实际上就是误分类样本的权值之和。
基分类器系数
αt
α
t
:
αt
α
t
表示
ht(x)
h
t
(
x
)
在最终分类器中重要性,当
et≤12
e
t
≤
1
2
时,
αt≥0
α
t
≥
0
,
et
e
t
越小,
αt
α
t
越大,所以分类误差率越小的基分类器在最终分类器中的作用越大,