AdaBoost算法详述

AdaBoost算法详解


1. 提升方法的基本思想

提升方法基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当(按照一定权重)的综合(例如线性组合加法模型)所得出的判断,要比其中任何一个专家单独的判断好

历史上,Kearns和Valiant首先提出了“强可学习(strongly learnable)”和“弱可学习(weekly learnable)”的概念,指出在概率近似正确(probably approximately correct,PAC)学习的框架中:

  1. 一个概念(概率规律)如果存在一个多项式的学习算法能够学习它(通过建模抽象拟合),并且正确率很高,那么就称这个概念是强可学习的;
  2. 一个概念如果存在一个多项式的学习算法能够学习它,但是学习的正确率仅比随机猜测略好,那么就称这个概念是弱可学习的

同时,后来Schapire证明强在PAC学习的框架下,一个概念是强可学习的充分必要条件是这个概念是弱可学习的。这样一来,问题就转化为了,在算法训练建模中,如果已经发现了“弱可学习算法”(即当前分类效果并不优秀,甚至仅仅比随机预测效果要好),就有可能将其boosting(提升)为强可学习算法,这其中最具代表性的方法就是AdaBoosting(AdaBoosting algorithm)

提升方法就是从弱学习算法出发,反复学习,得到一系列弱分类器(基本分类器),然后组合这些弱分类器,构成一个强分类器。大多数的提升方法都是改变训练数据的概率分布(训练数据的权重分布)

2. 提升方法的两个关键要素

对于提升方法来说,有两个非常重要的问题

  1. 在每一轮如何改变训练数据的权值或概率分布,修改的策略是什么?
  2. 如何将弱分类器组合成一个强分类器?

这2个问题是所有Boosting方法都要考虑和解决的问题,这里以AdaBoost为例,讨论AdaBoost的策略

  1. 提高那些被前一轮弱分类器错误分类的样本的权值,而降低那些被正确分类样本的权值。这样一来,那些被分错的数据,在下一轮就会得到更大的关注。所以,分类问题被一系列的弱分类器“分而治之”
  2. 对弱分类器的组合,AdaBoost采取加权多数表决的方法。即加大分类误差率小的弱分类器的权值,使其在表决中起较大作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。

3. 前向分步算法

在开始学习AdaBoost算法之前,我们需要先了解前向分步算法思想。实际上,AdaBoost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分步算法时的二类分类学习算法

3.1 加法模型(aditive model)

加法模型是一种线型模型, f ( x ) = m = 1 M β m b ( x ; γ m ) ,其中, b ( x ; γ m ) 为基函数, γ m 为基函数的参数, β m 为基函数的系数(权重)。
在给定训练数据及损失函数 L ( y , f ( x ) ) 的条件下,学习加法模型 f ( x ) 成为经验风险极小化(即损失函数极小化)问题:

m i n β m , γ m i = 1 N L ( y i , m = 1 M β m b ( x i ; γ m ) )

即同时考虑N个样本在整个线性模型组中的损失函数的极小值,通常这是一个十分复杂的优化问题(求极值问题),想要一步到位求出最优解特别困难。前向分步算法(forward stagewise algorithm)求解这一优化问题的思想是:

因为学习的是加法模型(线性模型),如果能够从前向后,每一步只学习一个基函数 b ( x ; γ m ) 及其系数 β m ,逐步逼近优化目标函数式

m i n β m , γ m i = 1 N L ( y i , m = 1 M β m b ( x i ; γ m ) )

那么就可以极大简化优化的复杂度。具体地,每步之选哦优化如下损失函数:
m i n β m , γ m i = 1 N L ( y i , β m b ( x i ; γ m ) )

每次只要考虑一个基函数及其系数即可。

有一点要注意,前向分步的思想和贝叶斯估计有类似的地方:

  • 它们都假设每一步之间的基函数和系数是独立不相关的(在贝叶斯估计中这叫独立同分布),也因为这一假设才可以把原始的全局最优解求解等价为分步的子项求解过程。
  • 但是这种假设会丢失一部分精确度,即每一步之间的依赖关联会被丢弃。

而前向分步算法的思想就是不求一步到位,而是逐步逼近最优解,通过分步求得每一步的最优解来逼近全局最优解。我个人觉得这和SGD梯度下降的求最优思想是一样的

3.2 算法策略

和其他统计机器学习模型一样,前向分布算法的策略也同样是:经验风险最小化。如果在模型中加入了penalty惩罚项,则可以演进为结构风险最小化

3.3 前向分步算法

给定训练数据集 T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , , ( x N , y N ) , x i χ R n , y i Y = { 1 , + 1 } ,损失函数 L ( y , f ( x ) ) 和基函数的集合 b ( x ; γ ) ,学习加法模型 f ( x ) 的前向分步算法如下:

  1. 初始化 f 0 ( x ) = 0
  2. m = 1 , 2 , 3 , , M (M代表基函数个数)
    (a) 在上一步得到的最有基函数的基础上,极小化本次单个基函数的损失函数: ( β m , γ m ) = a r g   m i n β , γ i = 1 N L ( y i , f m 1 ( x i ) + β m b ( x ; γ m ) ) ,得到本轮最优基函数参数 β m , γ m
    (b) 更新(线性累加基函数) f m ( x ) = f m 1 ( x ) + β m b ( x ; γ m )
  3. 得到最终加法模型 f ( x ) = f M ( x ) = m = 1 M β m b ( x ; γ m ) 。这样,前向分步算法将同时求解从m=1到M所有的参数 β m , γ m 的全局最优解问题简化为逐次求解各个 β m , γ m 的局部最优化问题。

4. AdaBoost算法

4.1 算法过程

假设给定一个二类分类的训练数据集(adaboost不限于二类分类)

T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , , ( x N , y N )

其中,每个样本点由实例与标记组成。实例 x i χ R n ,标记 y i Y = { 1 , + 1 } χ 是实例空间, Y 是标记集合。AdaBoost利用以下算法,从训练数据集中学习一系列弱分类器或基本分类器,并将这些弱分类器线性组合成一个强分类器。

  1. 初始化训练数据的权值分布(N代表样本数量):

    D 1 = ( w 11 , , w 1 i , , w 1 N ) ,   i = 1 , 2 , , N

    注:(初始等概率分布体现了最大熵原理,在没有任何先验知识的前提下作等概率假设是最合理的)。这一步假设数据集具有均匀的权值分布,即每个训练样本在基本分类器的学习中作用相同,这一假设保证第一步能够在原始数据上学习基本分类器 G 1 ( x )

  2. 假设训练轮次为M(直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数),则对 m = 1 , 2 , , M
    a. 使用具有权值分布 D m 的训练数据集(对应本轮权值分布的数据集)学习,得到本轮次的基本分类器: G m ( x ) : χ { 1 , + 1 }
    b. 计算 G m ( x ) 在本轮训练数据集上的分类误差率(权重误差函数):

    e m = i = 1 N P ( G m ( x i ) y i ) = i = 1 N w m i I ( G m ( x i ) y i )

    注: G m ( x ) 在加权的训练数据集上的分类误差率是被 G m ( x ) 误分类样本的权值之和,注意,权重误差函数关注的是本轮数据集的权重(概率)分布,而不关注弱分类器内部的参数。即我们对本轮高概率分布(重点关注的数据)的错误会给与更大的惩罚,这样就体现了模型Adding组合过程中根据权重误差进行模型组合选择的策略了.

    c. 根据本轮的弱分类器对数据集的分类误差计算 G m ( x ) 的模型系数:

    α m = 1 2 l o g 1 e m e m

    代表了本轮得到的弱分类器的重要程度。

    由左式可知,当 e m 1 2 时, α m 0 ,并且 α m 随着 e m 的减小而增大,所以在本轮分类误差率越小的基本分类器在最终分类器中的作用越大。

    d. 更新下一轮训练数据集的权值分布

    D m + 1 = ( w m + 1 , 1 , , w m + 1 , i , , w m + 1 , N )

    w m + 1 , i = w m i Z m e x p ( α m y i G m ( x i ) ) ,   i = 1 , 2 , , N

    这里, Z m 是规范化因子:
    Z m = i = 1 N w m i e x p ( α m y i G m ( x i ) )

    它使得 D m + 1 成为一个概率分布(每一轮的权值总和都为1, i = 1 N w m i = 1 )。

    注:更新训练数据的权值分布为下一轮作准备。 w m + 1 , i 式子可以写成:

    w m + 1 , i = { w m i Z m e α m , G m ( x i ) = y i w m i Z m e α m , G m ( x i ) y i

    由此可知, 被基本分类器 G m ( x ) 误分类样本的权值得以扩大,而被正确分类样本的权值却在下一轮得以缩小。两相比较,误分类样本的权值被放大了 e 2 α m 倍,因此误分类样本在下一轮学习中起更大作用。 不改变所给的训练数据本身,而不断改变训练数据权值的分布,使得训练数据在基本分类器的学习中起不同的作用,一次优化一个弱分类模型,或者理解为一次优化全局复杂问题中的一次子问题(分而治之)。

  3. 构建基本分类器的线性组合:

    f ( x ) = m = 1 M α m G m ( x )

    得到最终分类器:
    G ( x ) = s i g n ( f ( x ) ) = s i g n ( m = 1 M α m G m ( x ) )

    线性组合 f ( x ) 实现M个基本分类器的加权表决。系数 α m 表示了基本分类器 G m ( x ) 的重要性。

注:可以看到,在每轮的训练中,训练样本的权值分布不断在变动,同时
1. 权值分布对本轮的弱分类器在最终线性分类器组合中重要程度起正比例作用;
2. 对下一轮的样本权值调整起反比例作用


注:传统的AdaBoost只能用于二分类,现在已经出现了可以用于回归于多分类的变体。
AdaBoost可以看作是boosting + 指数损失函数的组合,其损失函数指定为指数损失函数 l o s s = e x p ( y i f ( x i ) ) ,boosting也可以组合其他损失函数如平方损失等,但这将不再是AdaBoost而是其他boosting变体,如GBDT的损失函数为绝对损失函数,而XGBoost则进一步衍化为支持任意可求一阶、二阶导的损失函数,包括logistic loss function. hinge loss function等,也同样支持自定义损失函数。

这里写图片描述

5. 总结

到这里Adaboost就写完了,前面有一个没有提到,就是弱学习器的类型。理论上任何学习器都可以用于Adaboost.但一般来说,使用最广泛的Adaboost弱学习器是决策树和神经网络。对于决策树,Adaboost分类用了CART分类树,而Adaboost回归用了CART回归树。

这里对Adaboost算法的优缺点做一个总结。

Adaboost的主要优点有:

  1. Adaboost作为分类器时,分类精度很高
  2. 在Adaboost的框架下,可以使用各种回归分类模型来构建弱学习器,非常灵活。
  3. 作为简单的二元分类器时,构造简单,结果可理解。
  4. 不容易发生过拟合

Adaboost的主要缺点有:

  1. 对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性。

6. 示例:可参考陈航《统计机器学习》 p 140 示例。

猜你喜欢

转载自blog.csdn.net/Dby_freedom/article/details/81990279