Adaboost算法说实话看文章看见过好多好多次,非常有名的一个算法,这次找到一个讲解非常详细以及清晰的随笔,所以不要脸的转载了,分享给大家!!!

 

集成学习按照个体学习器之间是否存在依赖关系可以分为两类:

  • 第一个是个体学习器之间存在强依赖关系;
  • 另一类是个体学习器之间不存在强依赖关系。

前者的代表算法就是提升(boosting)系列算法。在boosting系列算法中, Adaboost是最著名的算法之一。Adaboost既可以用作分类,也可以用作回归。本文就对Adaboost算法做一个总结。

一 回顾boosting算法的基本原理

AdaBoost是典型的Boosting算法,属于Boosting家族的一员。在说AdaBoost之前,先说说Boosting提升算法。Boosting算法是将“弱学习算法“提升为“强学习算法”的过程,主要思想是“三个臭皮匠顶个诸葛亮”。一般来说,找到弱学习算法要相对容易一些,然后通过反复学习得到一系列弱分类器,组合这些弱分类器得到一个强分类器。Boosting算法要涉及到两个部分,加法模型和前向分步算法。加法模型就是说强分类器由一系列弱分类器线性相加而成。一般组合形式如下:

                               Adaboost算法原理_损失函数

Adaboost算法原理_损失函数_02 前向分步就是说在训练过程中,下一轮迭代产生的分类器是在上一轮的基础上训练得来的。也就是可以写成这样的形式:

                             Adaboost算法原理_python_03

由于采用的损失函数不同,Boosting算法也因此有了不同的类型,AdaBoost就是损失函数为指数损失的Boosting算法

boosting算法系列的基本思想,如下图:

Adaboost算法原理_adaboost_04

 

从图中可以看出,Boosting算法的工作机制是首先从训练集用初始权重D(1)训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。

在上图中有几个具体的问题我们没有详细说明。

  • 如何计算分类误差率e?
  • 如何得到弱学习器权重系数αα(即上式中的βk)?
  • 如何更新训练数据的样本权重D?
  • 使用何种结合策略?

只要是boosting大家族的算法,都要解决这4个问题。那么Adaboost是怎么解决的呢?

二 Adaboost算法的基本思想

我们这里讲解Adaboost是如何解决上面4个问题的。

假设我们的训练集样本是:

                    Adaboost算法原理_权重_05

训练集的在第k个弱学习器的样本权重系数为:

Adaboost算法原理_python_06

注意:在初始化第一个弱分类器输出权重时,我们假设训练集样本具有均匀的权值分布,即每个训练样本在第一个弱分类器的学习中作用相同,这一假设保证可以在训练集样本上学习第一个弱分类器G1(x)。

首先我们看看Adaboost的分类问题

分类问题的误差率很好理解和计算。由于多元分类是二元分类的推广,这里假设我们是二元分类问题,输出为{-1,1},则第k个弱分类器Gk(x)在训练集上的分类误差率为:

          Adaboost算法原理_adaboost_07

接着我们看弱学习器权重系数,对于二元分类问题,第k个弱分类器Adaboost算法原理_损失函数_08的权重系数为:

                          Adaboost算法原理_adaboost_09 

为什么这样计算弱学习器权重系数?从上式可以看出,如果分类误差率Adaboost算法原理_权重_10越大,则对应的弱分类器权重系数Adaboost算法原理_权重_11越小。也就是说,误差率小的弱分类器权重系数越大。具体为什么采用这个权重系数公式,我们在讲Adaboost的损失函数优化时再讲。

第三个问题,如何更新样本权重D。假设第k个弱分类器的样本集权重系数为Adaboost算法原理_python_12,则对应的第k+1个弱分类器的样本权重系数为:

                Adaboost算法原理_依赖关系_13

 这里Adaboost算法原理_损失函数_14是规范化因子:

                Adaboost算法原理_python_15

Adaboost算法原理_损失函数_16计算公式可以看出,如果第i个样本分类错误,则Adaboost算法原理_依赖关系_17,导致样本的权重在第k+1个弱分类器中增大,如果分类正确,则权重在第k+1个弱分类器中减少.不改变所给的训练集数据,通过不断的改变训练样本的权重,使得训练集数据在弱分类器的学习中起不同的作用。具体为什么采用这个样本权重更新公式,我们在讲Adaboost的损失函数优化时再讲。

最后一个问题是集合策略。Adaboost分类采用的是加权平均法,最终的强分类器为:

                  Adaboost算法原理_权重_18

Adaboost算法原理_依赖关系_19

接着我们看看Adaboost的回归问题。由于Adaboost的回归问题有很多变种,这里我们以Adaboost R2算法为准

我们先看看回归问题的误差率的问题,对于第k个弱学习器,计算他在训练集上的最大误差:

              Adaboost算法原理_损失函数_20

然后计算每个样本的相对误差

              Adaboost算法原理_python_21  

Adaboost算法原理_权重_22

Adaboost算法原理_权重_23

三 AdaBoost分类问题的损失函数优化 

上面我们讲到了分类Adaboost的弱学习器权重系数公式和样本权重更新公式。但是没有解释选择这个公式的原因,让人觉得是魔法公式一样。其实它可以从Adaboost的损失函数推导出来。

从另一个角度讲,Adaboost是模型为加法模型,学习算法为前向分步学习算法,损失函数为指数函数的分类问题。

模型为加法模型好理解,我们的最终的强分类器是若干个弱分类器加权平均而得到的。

前向分步学习算法也好理解,我们的算法是通过一轮轮的弱学习器学习,利用前一个弱学习器的结果来更新后一个弱学习器的训练集权重。也就是说,第k-1轮的强学习器为:

Adaboost算法原理_adaboost_24

Adaboost算法原理_损失函数_25

Adaboost算法原理_权重_26

四 AdaBoost二元分类问题算法流程 

Adaboost算法原理_损失函数_27

Adaboost算法原理_依赖关系_28

五 Adaboost回归问题的算法流程

Adaboost算法原理_python_29

Adaboost算法原理_权重_30

六 Adaboost算法的正则化 

Adaboost算法原理_adaboost_31