[Translate]|AdaBoost and the Super Bowl of Classifiers - A Tutorial Introduction to Adaptive Boosting

Abstract(摘要)
这篇文章文雅地介绍了AdaBoost算法。AdaBoost算法可以用一堆弱分类器生成一个强分类器。这里从最基础的地方开始推导出了这个算法的数学式。
1. Motivation(动机)
假设你要处理一个二分问题。你手边有一大堆分类器(我们称之为专家)。然而你想要一个更好的分类器,“超级分类器”。因此,你想把这些专家“梦之队”放到一起——比如说从分类器群中挑出11个分类器,并将它们进行组合。对于一个给定的模式xix_ixi,每个专家分类器kjk_jkj可以给出他们的意见kj(xi)∈{−1,1}k_j(x_i)\in \{-1,1\}kj(xi)∈{−1,1},专家组KKK的最终决定为sign(C(xi))sign(C(x_i))sign(C(xi)),即专家组意见的加权求和,其中:
C(xi)=α1k1(xi)+α2k2(xi)+⋯+α11k11(xi)C(x_i)=\alpha_1k1(x_i)+\alpha_2k2(x_i)+\dots + \alpha_{11}k_{11}(x_i)C(xi)=α1k1(xi)+α2k2(xi)+⋯+α11k11(xi)
k1,k2,…,k11k_1,k_2,\dots ,k_{11}k1,k2,…,k11表示从分类器群中挑出的11个专家。常数α1,α2,…,α11\alpha_1, \alpha_2,\dots,\alpha_{11}α1,α2,…,α11表示专家组中每个专家意见的权重。每个专家kjk_jkj就只会回答“是(+1)”或者“不是(-1)”。
AdaBoost(adaptive boosting)算法是由Yoav Freund和Robert Shapire在1995年提出的用一系列弱分类器生成一个强分类器的方法。Adaboost对连续分类器都是可用的(比如神经网络,线性判别等)。然而,为了简单,咱们假设我们假设专家组是有限的,包含了LLL个分类器。它们作为AdaBoost的输入。
2. Scouting(侦查)
如果我们想要进行分类器的竞争,我们需要做的有:
- 侦查预期的团队成员;
- 从中抽取;
- 给团队中的成员赋予不同的贡献。
侦查的方法是用包含NNN个数据点的xix_ixi训练集TTT在分类器群中测试每个分类器。对于每个点xix_ixi,我们有标签yi=1y_i=1yi=1或yi=−1y_i=-1yi=−1。我们将分类器群中的所有分类器进行测试和排序,具体的方法是:当某个分类器分类失败了,那么会花费eβe^\betaeβ的代价;弱国分类器分类成功了,则会花费e−βe^{-\beta}e−β的代价。我们要求β>0\beta>0β>0,这样,失败的惩罚就比成功的惩罚要大得多。用非0值来惩罚成功似乎有点奇怪,然而只要对成功的惩罚比对失败的惩罚要小(e−β<ebeta)(e^{-\beta}<e^{beta})(e−β<ebeta),就一切OK啦。像这种与平时使用的到分类目标的欧几里德距离所不同的错误函数被称为指数型损失函数。
当我们测试分类器群中的LLL个分类器的时候,我们构建了一个矩阵SSS(用于侦查)。我们将所有的失败(1)与成功(0)记录其中。矩阵中的第i行观测的是数据点xix_ixi的情况。第jjj列观察的是第jjj个分类器的情况。
![矩阵][1]
[1]: http://oawflafkv.bkt.clouddn.com/xz/Pictures/zybuluo/Classifier.png
在上例中,第一个分类器成功分类了x1,x2x_1,x_2x1,x2和xNx_NxN。而在x3x_3x3上分类失败。读这张表,很容易读出其它分类器的成功/失败情况。
AdaBoost的中心思想,是从分类器群中每迭代一次都能抽取出一个分类器(一共有MMM次迭代)。数据集中的元素在每次的迭代中都根据其重要程度,被赋予了不同的权值。一开始,所有的元素被赋予了相同的权重(1,或者1/N1/N1/N,如果我们想要所有的权重加起来是1的话)。当抽取的过程进行时,越困难的例子,即专家组在那个例子上的表现仍然很差的话,则被赋予越来越大的权重。抽取过程专注于为专家组选取新的分类器来解决那些仍然被分类错误的例子。如果抽取的分类器与之前已经抽取的分类器表现差不多,那么似乎就不需要再来抽取它了。如果我们想要抽取一个分类器两次,那我们可以直接将其权重加倍。最好的“团队成员”是那些可以给专家组提供新鲜角度的成员。抽取的分类器应当与目前的分类器互补。
3. Drafting(抽取)
在每一次的迭代中,我们都会将所有的分类器排序。因此我们可以在当前的分类器群中选择出最好的。在第mmm次的迭代中,我们已经在专家组里面选择了m−1m-1m−1个分类器。现在,我们想来抽取下个分类器。现在的分类器的线性组合为:
C(m−1)(xi)=α1k1(xi)+α2k2(xi)+⋯+αm−1km−1(xi)C_{(m-1)}(x_i)=\alpha_1k_1(x_i)+\alpha_2k_2(x_i)+\dots +\alpha_{m-1}k_{m-1}(x_i)C(m−1)(xi)=α1k1(xi)+α2k2(xi)+⋯+αm−1km−1(xi)
现在,我们要将其扩展为:
Cm(xi)=C(m−1)(xi)+αmkm(xi)C_m(x_i)=C_{(m-1)}(x_i)+\alpha_mk_m(x_i)Cm(xi)=C(m−1)(xi)+αmkm(xi)
在第一次迭代时(m=1)(m=1)(m=1),C(m−1)C_{(m-1)}C(m−1)为0。我们定义全局代价,或全局错误为
E=∑i=1Ne−yi(Cm−1(xi)+αmkm(xi))E=\sum_{i=1}^Ne^{-y_i(C_{m-1}(x_i)+\alpha_mk_m(x_i))}E=i=1∑Ne−yi(Cm−1(xi)+αmkm(xi))
这里,αm\alpha_mαm和kmk_mkm需要用一种优化方法来决定。既然说我们的目的是要选取kmk_mkm,因而我们重写上面的表达式如下:
E=∑i=1Nwi(m)e−yiαmkm(xi) \begin{equation} E=\sum_{i=1}^Nw_i^{(m)}e^{-y_i\alpha_mk_m(x_i)} \end{equation} E=i=1∑Nwi(m)e−yiαmkm(xi)
其中,
wi(m)=e−yiC(m−1)(xi) \begin{equation} w_i^{(m)}=e^{-y_iC_{(m-1)}(x_i)} \end{equation} wi(m)=e−yiC(m−1)(xi)
i=1,2,…,Ni=1,2,\dots,Ni=1,2,…,N。当第一次迭代时,wi(1)=1,i=1,2,…,Nw_i^{(1)}=1,i=1,2,\dots,Nwi(1)=1,i=1,2,…,N。在之后的迭代中,我们用向量w(m)w^{(m)}w(m)来表示在第mmm次迭代时,赋予到训练集中每个数据点的权重。我们可以将方程(1)中的加和分为两项。
E=∑yi=km(xi)wi(m)e−αm+∑yi≠km(xi)wi(m)eαmE=\sum_{y_i=k_m(x_i)}w_i^{(m)}e^{-\alpha_m}+\sum_{yi\ne k_m(x_i)}w_i^{(m)}e^{\alpha_m}E=yi=km(xi)∑wi(m)e−αm+yi=km(xi)∑wi(m)eαm
这意味着总代价是所有成功项的加权和加上所有不成功的加权和。把第一项加和写成Wce−αmW_ce^{-\alpha_m}Wce−αm,并把第二项加和写成WeeαmW_ee^{\alpha_m}Weeαm,我们可以把式子简化为:
E=Wce−αm+Weeαm \begin{equation} E=W_ce^{-\alpha_m}+W_ee^{\alpha_m} \end{equation} E=Wce−αm+Weeαm
对于选择kmk_mkm,αm>0\alpha_m>0αm>0的确切值无关紧要。因为对于一个固定的αm\alpha_mαm,最小化E等价于最小化αmE\alpha_mEαmE,并且由于
eαmE=Wc+Wee2αme^{\alpha_m}E=W_c+W_ee^{2\alpha_m}eαmE=Wc+Wee2αm
且e2αm>1e^{2\alpha_m}>1e2αm>1,我们可以重写上面的表达式
eαmE=(Wc+We)+We(e2αm−1)e^{\alpha_m}E=(W_c+W_e)+W_e(e^{2\alpha_m}-1)eαmE=(Wc+We)+We(e2αm−1)
现在,(Wc+We)(W_c+W_e)(Wc+We)是所有数据点的全部权重的加和,即是当前迭代的一个常量。我们要选择的是一个能让右边那一项被最小化,也就是说能让WeW_eWe最小的分类器。这个相像一下也说得过去:下一次的抽取,kmk_mkm,应当可以给出能使惩罚最小的权重。
4. Weighting(权重)
当已经选择了专家组的第mmm个成员之后,我们需要决定αm\alpha_mαm。从方程(3),我们可以立即看到
dEdαm=−Wce−αm+Weeαm\frac{dE}{d\alpha_m}=-W_ce^{-\alpha_m}+W_ee^{\alpha_m}dαmdE=−Wce−αm+Weeαm
另这个表达式为0,并且乘以eαme^{\alpha_m}eαm,我们得到了
−Wc+Wee2αm=0-W_c+W_ee^{2\alpha_m}=0−Wc+Wee2αm=0
最优的αm\alpha_mαm因此是:
αm=12ln(WcWe)\alpha_m=\frac{1}{2}\ln\left(\frac{W_c}{W_e}\right)αm=21ln(WeWc)
可以用WWW来表示所有权重的和,因此我们可以重写上式为:
αm=12ln(W−WeWe)=12ln(1−emem)\alpha_m=\frac{1}{2}\ln\left(\frac{W-W_e}{W_e}\right)=\frac{1}{2}\ln\left(\frac{1-e_m}{e_m}\right)αm=21ln(WeW−We)=21ln(em1−em)
其中em=We/We_m=W_e/Wem=We/W,是在给定数据点权重的情况下的错误率。
5. PseudoCode(伪代码)
给定一个训练集TTT,其中有数据xix_ixi,每个数据有其标签yi∈{−1,+1}y_i\in \{-1,+1\}yi∈{−1,+1}。我们将wi(1)=1w_i^{(1)}=1wi(1)=1赋值给所有的数据点xix_ixi。我们想要从分类器群中抽取MMM个成员。我们执行MMM次迭代。在每一次迭代中,我们称WWW为所有数据点权重的加和,WeW_eWe为分类器弄错的哪些数据点上的权重。
AdaBoost
- For m=1 to M
- 从分类器群中选择一个分类器kmk_mkm,使得下式最小
We=∑yi≠km(xi)wi(m)W_e=\sum_{y_i\ne k_m(x_i)}w_i^{(m)}We=yi=km(xi)∑wi(m) - 设置分类器的权重αm\alpha_mαm为
αm=12ln(1−emem)\alpha_m=\frac{1}{2}\ln \left(\frac{1-e_m}{e_m} \right)αm=21ln(em1−em)
其中,em=We/We_m=W_e/Wem=We/W。 - 更新下次数据点的权重。如果km(xi)k_m(x_i)km(xi)是一个错误的判断,那么就设置
wi(m+1)=wi(m)eαm=wim1−ememw_i^{(m+1)}=w_i^{(m)}e^{\alpha_m}=w_i^{m}\sqrt{\frac{1-e_m}{e_m}}wi(m+1)=wi(m)eαm=wimem1−em
否则,设置
wi(m+1)=wi(m)e−αm=wimem1−emw_i^{(m+1)}=w_i^{(m)}e^{-\alpha_m}=w_i^{m}\sqrt{\frac{e_m}{1-e_m}}wi(m+1)=wi(m)e−αm=wim1−emem
- 从分类器群中选择一个分类器kmk_mkm,使得下式最小
有一些关于这个AdaBoost伪代码形式的评论还是挺值得参考的。步骤1中的分类器群可以由分类器族来代替,在给定权重的情况下,可以通过最小化某个错误函数而训练得到最优解。也就是说,分类器群并不需要提前给定,只要它确实存在就可以了。如果说给定了一个分类器的有限集,我们只需要每个分类器都在数据集上跑一遍就可以了。侦查矩阵SSS可以在每个迭代器中被重用,用转置的向量w(m)w^{(m)}w(m)乘以矩阵SSS,可以用来得到WeW_eWe。
至于权重,可以重写一下,使得只有错误才会导致权重的修改。
注意权重向量w(m)w^{(m)}w(m)是被迭代生成的。它可以在每一次迭代中根据方程(2)全部重新计算,但是迭代地构建更加高效且实现起来更加简单。
同时也注意到,分类器如果做的还没有随机来的好(随机的意思是em=1/2e_m=1/2em=1/2),那么权值会是0。一个完美的分类器(em=0)(e_m=0)(em=0)会有一个无穷大的权重,因为它将会成为专家组中的唯一成员。一个完美的撒谎者(em=1)(e_m=1)(em=1)会有一个负无穷的权重。我们仅仅取它的相反意见,并且也把它作为专家组的唯一成员。
文章介绍了AdaBoost算法的基本原理,该算法通过结合多个弱分类器生成一个强分类器。它使用权重和指数型损失函数来评估分类器的表现,并在每次迭代中调整数据点的权重,重点关注分类错误的样本。在迭代过程中,选择能最小化错误率的分类器,并计算其权重。最后给出了AdaBoost的伪代码,展示了算法的实施步骤。

592

被折叠的 条评论
为什么被折叠?



