写在前面
在前面的文章集成学习中对集成学习的大致思想进行了概括性的说明,根据模型之间是否存在依赖可将集成学习分为串行和并行两种,前者依赖于上一次模型的预测结果,后者模型之间并不相互依赖,Adaboost是boosting的最为人所知的模型,既可以用作回归任务,也可用于分类任务。
Adaboost框架原理
前面的文章中,已经对boosting框架的原理进行了说明,这里我们不厌其烦的再次给出boosting的框架示意图:
从图上可以看见,boosting算法机制大致如下:首先,根据初始化权重训练一个弱学习器
h1
;然后,根据
h1
的结果计算该学习器的错误率,并以此更新样本权重,使得错误率较大的样本权重变大,这样权重变大的样本在下一次的学习器训练中获得更多的关注,重复该过程,知道学习器数量到达预先设置的数量。可见,boosting中学习器之间的依赖是在于
ht
学习器的计算必须根据
ht−1
学习的错误率,并且根据这个错误率而更新的样本权值。那么有如下几个问题值得思考:
(1). 怎么计算某个学习器的错误率
e
?
(2). 怎么计算某个学习器的权重α
(3). 怎么更新样本的权值
D
?
(4). 怎么组合这些学习器?
Adaboost的参数计算
首先,我们需要规定一些符号,假设样本数据是:
{(x1,y1),(x2,y2)...(xm,ym)}
第
k
个学习器的样本权重为:
Dk={wk1,wk2,...wkm},∑i=1mwki=1
初始化权重为:
w1i=1m,i=1,2...m
这里先给出算法中参数的计算方式,后面再对这些公式的推导进行说明。
Adaboost分类
首先从最简单的二分类开始,输出为
{−1,1}
,则第
k
个学习器Gk(x)在训练集上的误差是:
ek=P(Gk(xi)≠yi)=∑i=1mwkiI(Gk(xi)≠yi)
接着是第k个分类器的权重:
αk=12log1−ekek
从上式可以看到,当第
k
个学习器的误分类率较大时,对应的权重系数较小,反之,权重系数较大。再者是样本的权重系数更新:
wk+1,i=wk,iZkexp(−αkyiGk(xi))
Zk
是权重归一化系数:
Zk=∑imwk,iexp(−αkyiGk(xi))
从权重系数更新公式可以看出,当第
k
个学习器对样本
i分类错误时
yiGk(xi)<0
,导致在更新时,样本权重系数变大,反之则变小。最后是结合策略,Adaboost采用的是平均加权法,所以最后的分类模型是:
f(x)=sign(∑k=1KαkGk(x))
Adaboost回归
Adaboost回归有多种方式,这里以Adaboost R2为例,延续上面的符号表示,回归问题中学习器
k
在训练集上的最大误差率是:
Ek=max|yi−Gk(xi)|,i=1,2...m
每个样本的相对误差是:
ek,i=|yi−Gk(xi)|Ek
这里如果选择的是平方误差函数则
ek,i=|yi−Gk(xi)|2Ek
,如果选择的是指数误差函数,则
ek,i=1−exp(|yi−Gk(xi)|Ek)
,则第
k
个学习器的总的误差为:
ek=∑i=1mwk,iek,i
第
k
个学习器的权重系数为:
αk=ek1−ek
样本的权重系数按照如下方式更新:
wk+1,i=wk,iZkα1−ek,ik
同样
Zk
是归一化系数:
Zk=∑i=1mwk,iα1−ek,ik
同样采用加权平均,最后的回归模型是:
f(x)=∑k=1Kln(1αk)Gk(x)
Adaboost参数推导
上面我们对Adaboost的参数更新公式进行了阐述,但公式是怎么来的还没有进行说明,这节中我们将对这些公式的推导进行说明。Adaboost是加法模型,最后的模型是对各个学习器进行结合,一般采用加权平均的方式。整个Adaboost学习过程是一个前向学习,形式化的定义是对第
k−1
轮学习器有:
fk−1(x)=∑i=1k−1αiGi(x)
第
k
轮学习器为:
fk(x)=∑i=1kαiGi(x)
则第
k−1
轮和第
k
的关系为:
fk(x)=fk−1(x)+αkGk(x)
定义Adaboost的损失函数为指数函数,即:
argminα,G∑i=1mexp(−yifk(xi))
利用前面的式子对其进行改造为:
(αk,Gk)=argminα,G∑i=1mexp(−yi(fk−1(xi)+αkGk(xi)))
令
w∗k,i=exp(−yifk−1(x))
,它不依赖与
αk,Gk
,所以和最小化无关,仅仅依赖
fk−1(x)
。则损失函数又可写成:
(αk,Gk)=argminα,G∑i=1mw∗k,iexp(−yiαkGk(xi))
显然,误差函数达到最小,对于
Gk
来说,只需要让本轮预测的结果最大程度和
y
相同,即:
Gk(x)=argminG∑i=1mexpw∗iI(Gk(xi)≠yi)
将之带入损失函数中,对
αk
求导,令等于0,得到:
αk=12log1−ekeK
其中
ek
是:
ek=∑mi=1w∗k,iI(yi≠GK(xi))∑mi=1w∗k,i
最后利用
fk(x)=fk−1(x)+Gk(x)
和
w∗k,i=exp(−yifk−1(x))
可得:
w∗k+1,i=wk,i∗exp(−yiαkGk(x))
Adaboost算法步骤
分类
【-输入-】:训练集
T={(x1,y1),(x2,y2)...(xm,ym)}
;弱分类器;弱分类器数目
K
【-输出-】:最终的强分类器f(x);
(1):初始化样本权重:
D(1)=(w11,w12...w1m),w1i=1m,i=1,2...m
(2)from k=1 to K,执行以下步骤:
(a)
:使用样本权值
D(k)
训练出弱分类器
Gk(x)
;
(b)
:计算
Gk(x)
的误差率
ek=P(Gk(xi)≠yi)=∑i=1mwk,iI(Gk(xi)≠yi)
(c)
:计算弱分类器的权重系数:
αk=12log1−ekek
(d)
:更新样本集的权重:
wk+1,i=wk,iZkexp(−αkyiGk(xi))
Zk=∑imwk,iexp(−αkyiGk(xi))
(3)得到最终的强分类器
f(x)
:
f(x)=sign(∑k=1KαkGk(x))
而对于多分类问题,只需要在弱分类器的权重系数上改变一下,比如Adaboost SAMME算法,它的弱分类器的系数:
αk=12log1−ekek+log(R−1)
R是类别数量,当
R=2
时,
log(R−1)=0
。所以和上面的权重系数是统一的。
回归
【-输入-】:训练集
T={(x1,y1),(x2,y2)...(xm,ym)}
;弱分类器;弱分类器数目
K
【-输出-】:最终的强分类器f(x);
(1):初始化样本权重:
D(1)=(w11,w12...w1m),w1i=1m,i=1,2...m
(2)from k=1 to K,执行以下步骤:
(a)
:使用样本权值
D(k)
训练出弱分类器
Gk(x)
;
(b)
:计算训练集上的最大误差:
Ek=max|yi−Gk(xi)|,i=1,2...m
(c):
计算样本的相对误差:
如果是线性误差:ek,i=|yi−Gk(xi)|Ek
如果是平方误差:ek,i=|yi−Gk(xi)|2E2k
如果是指数误差:ek,i=1−exp(|yi−Gk(xi)|Ek)
(d)
:计算回归误差率:
ek=∑i=1mwk,iek,i
(d)
:计算学习器的权重系数:
αk=ek1−ek
(e)
:更新样本权重系数:
wk+1,i=wk,iZkα1−ek,ik
Zk=∑i=1mwk,iα1−ek,ik
(3)得到最终的回归模型是:
f(x)=∑k=1Kln(1αk)Gk(x)
Adaboost的正则化
为防止Adaboost出现过拟合问题,可以对Adaboost模型实施正则化,只需将原来的加法模型:
fk(x)=fk−1(x)+αkGk(x)
变成:
fk(x)=fk−1(x)+vkαkGk(x)
的取值范围为
0<ν≤1
。对于同样的训练集学习效果,较小的
ν
<script type="math/tex" id="MathJax-Element-32437">ν</script>意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。
总结
前面有一个没有提到,就是弱学习器的类型。理论上任何学习器都可以用于Adaboost.但一般来说,使用最广泛的Adaboost弱学习器是决策树和神经网络。对于决策树,Adaboost分类用了CART分类树,而Adaboost回归用了CART回归树。
这里对Adaboost算法的优缺点做一个总结。
Adaboost的主要优点有:
(1)Adaboost作为分类器时,分类精度很高
(2)在Adaboost的框架下,可以使用各种回归分类模型来构建弱学习器,非常灵活。
(3)作为简单的二元分类器时,构造简单,结果可理解。
(4)不容易发生过拟合
Adaboost的主要缺点有:
(1)对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性。