集成学习:AdaBoost与LogitBoost

Posted szqfreiburger

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集成学习:AdaBoost与LogitBoost相关的知识,希望对你有一定的参考价值。

总结两种具体的提升算法:

 

AdaBoost算法:

 

         AdaBoost的基本想法是不断调整训练数据中样本的权值来训练新的学习器,对于当前误分类的点在下一步中就提高权重“重点关照一下”,最后再将所有的弱分类器做加权和,对于分类正确率高的权重给得大大(更可靠),分类正确率低的给的权重低乃至是负的权重。其具体的算法可以用前向分布可加模型,配以指数损失函数得到,具体推导如下:

         我们这里讨论二分类问题。设学习训练集$D=lbrace (x_{1},y_{1}),...,(x_{N},y_{N}),y_{i}inlbrace -1,+1 brace brace$, 我们有某个基准的二分类算法$b$,输出为类别$+1$或者$-1$,我们希望用$M$步学习得到某个学习器:$f=sum_{m=1}^{M}alpha_{m}b_{m}$使得误差:

 egin{equation}L(f)=sum_{i=1}^{M}e^{-y_{i}f(x_{i})}end{equation} 

最小。

        我们现在可以考虑其前向分步可加模型了,为方便起见我们令$f_{0}=0$。对任意的$m=1,...,T$,第$m$步学习时,我们已经得到了基模型$b_{1},...,b_{m-1}$以及相应的权重$alpha_{k}$,且令$f_{m-1}=sum_{k=1}^{m-1}alpha_{k}b_{k}$, 那么我们现在只需要求$alpha_{m}$,$b_{m}$使得$L(f_{m-1}+alpha_{m}b_{m})$尽量小。

        这时候我们计算:

    [exp(-y_{i}f_{m-1}(x_{i})-alpha_{m}b_{m}(x_{i})y_{i})=egin{cases} e^{-y_{i}f_{m-1}(x_{i})}cdot e^{-alpha_{m}}& ext{if }y_{i}=b_{m}(x_{i}),\  e^{-y_{i}f_{m-1}(x_{i})}cdot e^{+alpha_{m}} & ext{if } y_{i} eq b_{m}(x_{i}).end{cases}]

       上式也可以写成:

   egin{split}exp(-y_{i}-alpha_{m}b_{m}(x_{i})y_{i})=&(e^{+alpha_{m}}-e^{-alpha_{m}})cdot overline{w}_{m,i}l_{0-1}(b_{m}(x_{i}),y_{i}) ewline +& overline{w}_{m,i}cdot e^{-alpha_{m}} end{split}

   其中:$overline{w}_{m,i}=e^{-y_{i}f_{m-1}(x_{i})}$, 上式两边同时取$sum_{i=1}^{N}$我们立即得到:

   $$L(f_{m-1}+alpha_{m}b_{m})=(e^{alpha_{m}}-e^{-alpha_{m}})sum_{i=1}^{N}overline{w}_{m,i}l_{01}(b_{m}(x_{i}),y_{i})+e^{-alpha_{m}}sum_{i=1}^{N}overline{w}_{m,i}$$

       注意到要使得上式尽量小,务必使:

                                                      $$sum_{i=1}^{N}overline{w}_{m,i}l_{01}(b_{m}(x_{i}),y_{i})$$

  尽量小, 那么b_{m}就应该以第$i$个样本赋予权重$w_{m,i}=overline{w}_{m,i}/overline{W}_{m}$来进行训练模型,其中$overline{W}_{m}=sum_{i=1}^{N}w_{m,i}.$我们同时注意到:

egin{split}L(f_{m-1}+alpha_{m}b_{m})=&e^{-alpha_{m}}sum_{i=1}^{N}overline{w}_{m,i}(1-l_{0,1}(b_{m}(x_{i}),y_{i}))+e^{alpha_{m}}sum_{i=1}^{N}overline{w}_{m,i}(l_{0,1}(b_{m}(x_{i}),y_{i})) ewline =& overline{W}[e^{-alpha_{m}}(1-Err_{m})+e^{+alpha_{m}}Err_{m}]end{split}

其中$Err_{m}$是$b_{m}$的在权重$w_{m,i}$下的误分类率。上式显然在:

$$alpha_{m}=frac{1}{2}logfrac{1-Err_{m}}{Err_{m}}$$

取得最小值,所以我们应该取$alpha_{m}=frac{1}{2}logfrac{1-Err_{m}}{Err_{m}}$。 

        现在我们总结一下上述推导出来的两个要点:

  • 每一步调整训练数据的权重,使得$w_{m,i}=e^{-y_{i}f_{m-1}(x_{i})}/overline{W}$,注意到其实$w_{m,i}$与之前的权重$w_{m-1,i}$满足: egin{equation}w_{m,i}=w_{m-1,i}cdot e^{-alpha_{m-1}y_{i}b_{m-1}(x_{i})}/sum_{i=1}^{N}w_{m-1,i}cdot e^{-alpha_{m-1}y_{i}b_{m-1}(x_{i})}end{equation}从中也看出,对于分类出错的点,下一次学习中也将分配更大的权重。这一点也很容易理解,那就是出问题的将被重点照顾一下,以提高争取率。
  • 每一步基模型的权重为$alpha_{m}=frac{1}{2}logfrac{1-Err_{m}}{Err_{m}}$,可以观察到,模型的错误率越小,其分配的权重就越大,其在“委员会”里的发言权就越大,这也很好理解。

 

综上所述AdaBoost算法的流程如下:


 

            输入:数据集$D=lbrace(x_{1},y_{1})...(x_{N},y_{N}) brace$,其中$x_{i}inmathbb{R}^{P}$,$y_{i}inlbrace -1,+1 brace$; 正整数$M>0$; 基算法$b$。

            输出:某分类器

            Step1:  选择初始权值:$w_{1,i}=1/N$, i=1,...,N;

            Step2:  对m=1,...,M, 执行:

                                                1)以第$i$个样本配以权值$w_{m,i}$,用基算法训练得到模型$b_{m}$;

                                                2)计算出$b_{m}$的在权重$w_{m,i}$之下的误分类率$Err_{m}$

                                                3)计算出系数:egin{equation}alpha_{m}=frac{1}{2}logfrac{1-Err_{m}}{Err_{m}}end{equation}

                                                4)如果m<M则计算下一步学习的样本权重:egin{equation}w_{m+1,i}=egin{cases} w_{m,i}cdot e^{alpha_{m}}& ext{if $b_{m}$ missclassifies the i-th sample},\  w_{m,i}cdot e^{-alpha_{m}} & ext{otherwise} .end{cases}end{equation}

                                                    除以适当的常数使得$sum_{i=1}^{N}w_{m+1,i}=1$

            Step3:  输出模型$f= ext{sign}(sum_{m=1}^{M}alpha_{m}b_{m})$

 

 

            


 

AdaBoost 对训练集误分类率的估计

 

          定理:设AdaBoost第m步的误分类率为$Err_{m}$, $gamma_{m} riangleqfrac{1}{2}-Err_{m}$, 则最终得到的分类器$f= ext{sign}(sum_{m=1}^{M}alpha_{m}b_{m})$的误分类率满足:

                                      egin{equation}frac{1}{N}sum_{i=1}^{N}l_{01}(f(x_{i}),y_{i})leq exp(-2sum_{m=1}^{M}gamma_{i}^{2})end{equation}  

    

          推论:如果对每一个弱分类器$gamma_{m}geq gamma>0$,则:

 

                                      egin{equation}frac{1}{N}sum_{i=1}^{N}l_{01}(f(x_{i}),y_{i})leq exp(-2Mgamma^{2})end{equation}       

 

AdaBoost 的优缺点:

      优点:1)分类精度很高

                     2)是一种框架性算法,灵活性高,可以自由选择弱分类器的类型。

                     3)不容易过拟合

          缺点:正是由于每次对于误分类点赋予很大的权重将导致AdaBoost模型对异常点的鲁棒性很差。

 

LogitBoost算法

 

          AdaBoost对于误分类点的惩罚过大造成对异常点敏感,并且不能预测类别的概率。LogitBoost算法可以弥补这两个缺憾,它采样前向分步可加模型,损失函数选取为对数损失函数,每一步迭代的时候是考虑牛顿下降法应用于误差函数来更新模型,具体说来如下:

          对于数据$D=lbrace(x_{1},y_{1}),...,(x_{N},y_{N}) brace$, $x_{i}inmathbb{R}^{P}$, $y_{i}inlbrace+1,-1 brace,$, 某种基准回归算法$b$, 我们用前向分布可加模型依次利用数据集$D$,算法$b$训练得到模型$b_{m}$, $m=1,...,M$, 最终集成为模型$f=sum_{m=1}^{M}b_{i}$,其中损失函数我们选择:

                                                                egin{equation}L(f)=sum_{i=1}^{N}log(1+e^{-y_{i}f(x_{i})})end{equation}

         并且我们可以预测概率:egin{equation}P(Y=1mid X=x)=frac{1}{1+e^{-f(x)}}end{equation}

         所谓的牛顿下降法在XGBoost中有应用, 我们简要看一下。为了接下来讨论方便我们令函数:$l:mathbb{R} imesmathbb{R}longrightarrow mathbb{R}$, $l(t,y) riangleqlog(1+e^{-ty})$。容易计算得到:

                                              egin{equation}partial_{1}l(t,y)=frac{-ye^{-ty}}{1+e^{-ty}}end{equation}

                                              egin{equation}partial^{2}_{11}l(t,y)=frac{e^{-ty}}{(1+e^{-ty})^{2}}end{equation}                                                   

         在前向分布的第$m$步迭代的时候,我们有:

                                              egin{split}L(f_{m-1}+b_{m})=&sum_{i=1}^{N}l(f_{m-1}(x_{i})+b_{m}(x_{i}),y_{i}) ewline approx&sum_{i=1}^{N}[l(f_{m-1}(x_{i}),y_{i})+g_{m,i}b_{m}(x_{i})+frac{1}{2}w_{m,i}b^{2}_{m}(x_{i})] ewline =& L(f_{m-1})+sum_{i=1}^{N}w_{m,i}(b_{m}(x_{i})+g_{m,i}/w_{m,i})^{2}-frac{1}{2}sum_{i=1}^{N}g_{m,i}^{2}/w_{m,i}end{split}

其中:

                    $$g_{m,i}=partial_{1}l(f_{m-1}(x_{i}),y_{i}),\  w_{m,i}=partial^{2}_{11}l(f_{m-1}(x_{i}),y_{i}) $$

所以我们为了让$L(f_{m-1}+b_{m})$尽量小,得让:

                                                    $$sum_{i=1}^{N}w_{m,i}(b_{m}(x_{i})+g_{m,i}/w_{m,i})^{2}$$

尽量小,这时候应该在一权重为$w_{m,i}$的MSE为损失函数训练出模型$b_{m}$。

         这时我们总结一下LogitBoost算法如下:

 


 

                               输入:训练集$D=lbrace(x_{1},y_{1}),...,(x_{N},y_{N}) brace$, 基准回归算法$b$, 正整数$M>0$

                               输出:分类器以及概率预测函数

                               Step1.令$b_{0}=0$

                               Step2.对$m=1,...,M:$

                                             1)计算 $$w_{m,i}=frac{e^{-y_{i}f_{m-1}(x_{i})}}{(1+e^{-y_{i}f_{m-1}(x_{i})})^{2}}$$

                                                         $$z_{m,i}=y_{i}(1+e^{-y_{i}f(x_{i})})$$

                                             2)用算法$b$训练数据集D,误差函数选:

                                                           $$L(b)=sum_{i=1}^{N}w_{m,i}(b(x_{i})-z_{m,i})^{2}$$

                                                得到模型$b_{m}$

                                             3)令:$$f=f_{m-1}+b_{m}$$

                               Step3. 输出分类器$f_{M}$以及概率预测函数$hat{P}(Y=1mid X=x) riangleq frac{1}{1+e^{-f_{M}(x)}}$


 

参考文献:

1. 李航:《统计学习方法》,北京,清华大学出版社,2012.

2. 周志华:《机器学习》,北京,清华大学出版社,2016.

3. Kevin P. Murphy:Machine Learning: A Probabilistic Perspective, The MIT Press Cambridge, Massachusetts London, England, © 2012 Massachusetts Institute of Technology

以上是关于集成学习:AdaBoost与LogitBoost的主要内容,如果未能解决你的问题,请参考以下文章

机器学习实战第7章——利用AdaBoost元算法提高分类性能

吴裕雄 python 机器学习——集成学习AdaBoost算法回归模型

吴裕雄 python 机器学习——集成学习AdaBoost算法分类模型

谈谈模型融合之一 —— 集成学习与 AdaBoost

统计学习方法--提升方法adaBoost算法(集成学习)

集成算法