翻译|Adaboost Tutorial

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

在这里插入图片描述

Abstract(摘要)

这篇文章文雅地介绍了AdaBoost算法。AdaBoost算法可以用一堆弱分类器生成一个强分类器。这里从最基础的地方开始推导出了这个算法的数学式。

1. Motivation(动机)

假设你要处理一个二分问题。你手边有一大堆分类器(我们称之为专家)。然而你想要一个更好的分类器,“超级分类器”。因此,你想把这些专家“梦之队”放到一起——比如说从分类器群中挑出11个分类器,并将它们进行组合。对于一个给定的模式 x i x_i xi,每个专家分类器 k j k_j kj可以给出他们的意见 k j ( x i ) ∈ { − 1 , 1 } k_j(x_i)\in \{-1,1\} kj(xi){1,1},专家组 K K K的最终决定为 s i g n ( C ( x i ) ) sign(C(x_i)) sign(C(xi)),即专家组意见的加权求和,其中:
C ( x i ) = α 1 k 1 ( x i ) + α 2 k 2 ( x i ) + ⋯ + α 11 k 11 ( x i ) 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)

k 1 , k 2 , … , k 11 k_1,k_2,\dots ,k_{11} k1,k2,,k11表示从分类器群中挑出的11个专家。常数 α 1 , α 2 , … , α 11 \alpha_1, \alpha_2,\dots,\alpha_{11} α1,α2,,α11表示专家组中每个专家意见的权重。每个专家 k j k_j kj就只会回答“是(+1)”或者“不是(-1)”。

AdaBoost(adaptive boosting)算法是由Yoav Freund和Robert Shapire在1995年提出的用一系列弱分类器生成一个强分类器的方法。Adaboost对连续分类器都是可用的(比如神经网络,线性判别等)。然而,为了简单,咱们假设我们假设专家组是有限的,包含了 L L L个分类器。它们作为AdaBoost的输入。

2. Scouting(侦查)

如果我们想要进行分类器的竞争,我们需要做的有:

  1. 侦查预期的团队成员;
  2. 从中抽取;
  3. 给团队中的成员赋予不同的贡献。

侦查的方法是用包含 N N N个数据点的 x i x_i xi训练集 T T T在分类器群中测试每个分类器。对于每个点 x i x_i xi,我们有标签 y i = 1 y_i=1 yi=1 y i = − 1 y_i=-1 yi=1。我们将分类器群中的所有分类器进行测试和排序,具体的方法是:当某个分类器分类失败了,那么会花费 e β e^\beta eβ的代价;弱国分类器分类成功了,则会花费 e − β e^{-\beta} eβ的代价。我们要求 β > 0 \beta>0 β>0,这样,失败的惩罚就比成功的惩罚要大得多。用非0值来惩罚成功似乎有点奇怪,然而只要对成功的惩罚比对失败的惩罚要小 ( e − β < e b e t a ) (e^{-\beta}<e^{beta}) (eβ<ebeta),就一切OK啦。像这种与平时使用的到分类目标的欧几里德距离所不同的错误函数被称为指数型损失函数。

当我们测试分类器群中的 L L L个分类器的时候,我们构建了一个矩阵 S S S(用于侦查)。我们将所有的失败(1)与成功(0)记录其中。矩阵中的第i行观测的是数据点 x i x_i xi的情况。第 j j j列观察的是第 j j j个分类器的情况。

![矩阵][1]
[1]: http://oawflafkv.bkt.clouddn.com/xz/Pictures/zybuluo/Classifier.png

在上例中,第一个分类器成功分类了 x 1 , x 2 x_1,x_2 x1,x2 x N x_N xN。而在 x 3 x_3 x3上分类失败。读这张表,很容易读出其它分类器的成功/失败情况。

AdaBoost的中心思想,是从分类器群中每迭代一次都能抽取出一个分类器(一共有 M M M次迭代)。数据集中的元素在每次的迭代中都根据其重要程度,被赋予了不同的权值。一开始,所有的元素被赋予了相同的权重(1,或者 1 / N 1/N 1/N,如果我们想要所有的权重加起来是1的话)。当抽取的过程进行时,越困难的例子,即专家组在那个例子上的表现仍然很差的话,则被赋予越来越大的权重。抽取过程专注于为专家组选取新的分类器来解决那些仍然被分类错误的例子。如果抽取的分类器与之前已经抽取的分类器表现差不多,那么似乎就不需要再来抽取它了。如果我们想要抽取一个分类器两次,那我们可以直接将其权重加倍。最好的“团队成员”是那些可以给专家组提供新鲜角度的成员。抽取的分类器应当与目前的分类器互补。

3. Drafting(抽取)

在每一次的迭代中,我们都会将所有的分类器排序。因此我们可以在当前的分类器群中选择出最好的。在第 m m m次的迭代中,我们已经在专家组里面选择了 m − 1 m-1 m1个分类器。现在,我们想来抽取下个分类器。现在的分类器的线性组合为:

C ( m − 1 ) ( x i ) = α 1 k 1 ( x i ) + α 2 k 2 ( x i ) + ⋯ + α m − 1 k m − 1 ( x i ) 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(m1)(xi)=α1k1(xi)+α2k2(xi)++αm1km1(xi)

现在,我们要将其扩展为:

C m ( x i ) = C ( m − 1 ) ( x i ) + α m k m ( x i ) C_m(x_i)=C_{(m-1)}(x_i)+\alpha_mk_m(x_i) Cm(xi)=C(m1)(xi)+αmkm(xi)

在第一次迭代时 ( m = 1 ) (m=1) (m=1) C ( m − 1 ) C_{(m-1)} C(m1)为0。我们定义全局代价,或全局错误为

E = ∑ i = 1 N e − y i ( C m − 1 ( x i ) + α m k m ( x i ) ) E=\sum_{i=1}^Ne^{-y_i(C_{m-1}(x_i)+\alpha_mk_m(x_i))} E=i=1Neyi(Cm1(xi)+αmkm(xi))

这里, α m \alpha_m αm k m k_m km需要用一种优化方法来决定。既然说我们的目的是要选取 k m k_m km,因而我们重写上面的表达式如下:

E = ∑ i = 1 N w i ( m ) e − y i α m k m ( x i ) \begin{equation} E=\sum_{i=1}^Nw_i^{(m)}e^{-y_i\alpha_mk_m(x_i)} \end{equation} E=i=1Nwi(m)eyiαmkm(xi)

其中,

w i ( m ) = e − y i C ( m − 1 ) ( x i ) \begin{equation} w_i^{(m)}=e^{-y_iC_{(m-1)}(x_i)} \end{equation} wi(m)=eyiC(m1)(xi)

i = 1 , 2 , … , N i=1,2,\dots,N i=1,2,,N。当第一次迭代时, w i ( 1 ) = 1 , i = 1 , 2 , … , N w_i^{(1)}=1,i=1,2,\dots,N wi(1)=1,i=1,2,,N。在之后的迭代中,我们用向量 w ( m ) w^{(m)} w(m)来表示在第 m m m次迭代时,赋予到训练集中每个数据点的权重。我们可以将方程(1)中的加和分为两项。

E = ∑ y i = k m ( x i ) w i ( m ) e − α m + ∑ y i ≠ k m ( x i ) w i ( m ) e α m E=\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

这意味着总代价是所有成功项的加权和加上所有不成功的加权和。把第一项加和写成 W c e − α m W_ce^{-\alpha_m} Wceαm,并把第二项加和写成 W e e α m W_ee^{\alpha_m} Weeαm,我们可以把式子简化为:

E = W c e − α m + W e e α m \begin{equation} E=W_ce^{-\alpha_m}+W_ee^{\alpha_m} \end{equation} E=Wceαm+Weeαm

对于选择 k m k_m km α m > 0 \alpha_m>0 αm>0的确切值无关紧要。因为对于一个固定的 α m \alpha_m αm,最小化E等价于最小化 α m E \alpha_mE αmE,并且由于

e α m E = W c + W e e 2 α m e^{\alpha_m}E=W_c+W_ee^{2\alpha_m} eαmE=Wc+Wee2αm

e 2 α m > 1 e^{2\alpha_m}>1 e2αm>1,我们可以重写上面的表达式

e α m E = ( W c + W e ) + W e ( e 2 α m − 1 ) e^{\alpha_m}E=(W_c+W_e)+W_e(e^{2\alpha_m}-1) eαmE=(Wc+We)+We(e2αm1)

现在, ( W c + W e ) (W_c+W_e) (Wc+We)是所有数据点的全部权重的加和,即是当前迭代的一个常量。我们要选择的是一个能让右边那一项被最小化,也就是说能让 W e W_e We最小的分类器。这个相像一下也说得过去:下一次的抽取, k m k_m km,应当可以给出能使惩罚最小的权重。

4. Weighting(权重)

当已经选择了专家组的第 m m m个成员之后,我们需要决定 α m \alpha_m αm。从方程(3),我们可以立即看到

d E d α m = − W c e − α m + W e e α m \frac{dE}{d\alpha_m}=-W_ce^{-\alpha_m}+W_ee^{\alpha_m} dαmdE=Wceαm+Weeαm

另这个表达式为0,并且乘以 e α m e^{\alpha_m} eαm,我们得到了

− W c + W e e 2 α m = 0 -W_c+W_ee^{2\alpha_m}=0 Wc+Wee2αm=0

最优的 α m \alpha_m αm因此是:

α m = 1 2 ln ⁡ ( W c W e ) \alpha_m=\frac{1}{2}\ln\left(\frac{W_c}{W_e}\right) αm=21ln(WeWc)

可以用 W W W来表示所有权重的和,因此我们可以重写上式为:

α m = 1 2 ln ⁡ ( W − W e W e ) = 1 2 ln ⁡ ( 1 − e m e m ) \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(WeWWe)=21ln(em1em)

其中 e m = W e / W e_m=W_e/W em=We/W,是在给定数据点权重的情况下的错误率。

5. PseudoCode(伪代码)

给定一个训练集 T T T,其中有数据 x i x_i xi,每个数据有其标签 y i ∈ { − 1 , + 1 } y_i\in \{-1,+1\} yi{1,+1}。我们将 w i ( 1 ) = 1 w_i^{(1)}=1 wi(1)=1赋值给所有的数据点 x i x_i xi。我们想要从分类器群中抽取 M M M个成员。我们执行 M M M次迭代。在每一次迭代中,我们称 W W W为所有数据点权重的加和, W e W_e We为分类器弄错的哪些数据点上的权重。

AdaBoost

  • For m=1 to M
    1. 从分类器群中选择一个分类器 k m k_m km,使得下式最小
      W e = ∑ y i ≠ k m ( x i ) w i ( m ) W_e=\sum_{y_i\ne k_m(x_i)}w_i^{(m)} We=yi=km(xi)wi(m)
    2. 设置分类器的权重 α m \alpha_m αm
      α m = 1 2 ln ⁡ ( 1 − e m e m ) \alpha_m=\frac{1}{2}\ln \left(\frac{1-e_m}{e_m} \right) αm=21ln(em1em)
      其中, e m = W e / W e_m=W_e/W em=We/W
    3. 更新下次数据点的权重。如果 k m ( x i ) k_m(x_i) km(xi)是一个错误的判断,那么就设置
      w i ( m + 1 ) = w i ( m ) e α m = w i m 1 − e m e m w_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=wimem1em
      否则,设置
      w i ( m + 1 ) = w i ( m ) e − α m = w i m e m 1 − e m w_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=wim1emem

有一些关于这个AdaBoost伪代码形式的评论还是挺值得参考的。步骤1中的分类器群可以由分类器族来代替,在给定权重的情况下,可以通过最小化某个错误函数而训练得到最优解。也就是说,分类器群并不需要提前给定,只要它确实存在就可以了。如果说给定了一个分类器的有限集,我们只需要每个分类器都在数据集上跑一遍就可以了。侦查矩阵 S S S可以在每个迭代器中被重用,用转置的向量 w ( m ) w^{(m)} w(m)乘以矩阵 S S S,可以用来得到 W e W_e We

至于权重,可以重写一下,使得只有错误才会导致权重的修改。

注意权重向量 w ( m ) w^{(m)} w(m)是被迭代生成的。它可以在每一次迭代中根据方程(2)全部重新计算,但是迭代地构建更加高效且实现起来更加简单。

同时也注意到,分类器如果做的还没有随机来的好(随机的意思是 e m = 1 / 2 e_m=1/2 em=1/2),那么权值会是0。一个完美的分类器 ( e m = 0 ) (e_m=0) (em=0)会有一个无穷大的权重,因为它将会成为专家组中的唯一成员。一个完美的撒谎者 ( e m = 1 ) (e_m=1) (em=1)会有一个负无穷的权重。我们仅仅取它的相反意见,并且也把它作为专家组的唯一成员。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值