Boosting / AdaBoost —— 多级火箭助推

Boosting(提高)

Boosting 是一类算法的统称,它们的主要特色是使用一组弱分类器来构造一个强分类器。弱分类器意思是预测的准确性不高,可能只比随便乱猜稍好一点。强分类器指准确性较高的分类器。简单来讲的话,Boosting 能够理解为俗话所说的“三个臭皮匠顶个诸葛亮”。git

Boosting 并无规定具体的实现方法,不过大多数实现算法会有如下特色:算法

  1. 经过迭代生成多个弱分类器
  2. 将这些弱分类器组合成一个强分类器,一般会根据各弱分类器的准确性设置相应的权重
  3. 每生成一个弱分类器,会从新设置训练样本的权重,被错误分类的样本会增长权重,正确分类的样本会减小权重,即后续生成的分类器将更多的关注以前分错的样本。(不过也有些算法会对老是分错的样本下降权重,视之为噪音)

Boosting家族有一系列算法,常见的好比 AdaBoost、GDBT、XGBoost,还有 BrownBoost、LogitBoost、RankBoost 等等。网络

Bagging/Boosting/Stacking

顺便说一下几种集成学习(Ensemble)方法的区别,集成方法是指构造多种模型,并经过必定的方法组合起来,综合下来的预测效果高于单个模型的预测效果。函数

集成学习有几种方式,Boosting原理 中有几张图很直观,借用在这里。学习

Bagging/投票
Bagging 是一种投票机制,先生成多个模型,而后让它们投票决定最终的结果。典型的好比随机森林算法。spa

Boosting/迭代提高
Boosting 是迭代生成模型,每一个模型要基于上一次模型的效果。每次迭代,模型会关注以前的模型预测效果很差的那些样本。本文下面要讲述的就属于这类算法。3d

Stacking/多层叠加
Stacking 是多层叠加的意思。也是先生成多个模型,可是用这些模型的预测结果做为下一层模型的输入,有点像多层神经网络的意思。blog

AdaBoost(Adaptive Boosting/自适应加强)

AdaBoost 是上述 Boosting 思想的一种具体实现算法,通常采用决策树做为弱分类器。那么看一下 AdaBoost 是如何实现迭代生成一系列弱分类器、调整样本权重,以及设置弱分类器权重从而构造出一个强分类器的。ip

AdaBoost 算法步骤

以离散型AdaBoost(Discrete AdaBoost) 为例:
假设有N个样本 (x1,y1), (x2,y2)…(xN,yN),其中 y1...yN ∈{-1, 1},即二分类问题。rem

  1. 设每一个样本初始权重相同,都是 1/N。即各样本的权重 w1...wN = 1/N
  2. 训练分类器时Loss函数采用指数偏差
  3. 开始进行T次迭代(每次生成一个弱分类器ht,t=1...T)
    3.1 对第t次迭代,使用样本(考虑各样本权重为(w1...wN))训练获得一个弱分类器ht。ht预测的输出也是 {-1, 1}。
    3.2 ht对样本分类的错误率为 ,即全部误分类样本(ht(xi) != yi)的权重的和。

    3.3 计算该分类器 ht 在最终的强分类器中的权重 。这个公式意味着ht的预测准确率越高,在强分类器中的权重越大(下文还有说明)。

    3.4 迭代中的强分类器

    3.5 更新样本权重,对全部样本计算 ,其中 是 第t轮迭代(当前迭代)第 i 个样本的权重, 是该样本下一轮(t+1)的权重。这个公式意味着正确的样本将减小权重,错误的样本将增长权重(下文还有说明)。
    3.6 将全部样本的权重从新归一化,即便得全部样本的权重和为1。可知 (t+1)轮全部样本权重和为 ,令 ,便可使得
    3.7 t = t + 1,进行下一轮迭代

  4. 迭代完成后,获得强分类器 ,sign是符号函数,使得输出是 {-1, 1}。

上面的步骤中,咱们讨论几个问题:

  1. 步骤 3.3 中,分类器权重 ,该函数图像以下图所示。当错误率 εt 越小,系数 αt 越大,意味着偏差小(准确性高)的分类器,在最后的强分类器中有更大的权重。反之,当偏差 εt 越大,系数 αt 越小,即在强分类器中的权重较小。另外能够看出当分类器的 错误率 < 0.5 时,αt > 0;若是分类器的 错误率 > 0.5,意味着该分类器预测反了,此时 αt < 0 将该分类器的预测结果反过来使用。

  1. 步骤 3.5 中,样本权值更新 。这里面 yi 是样本的标签,ht(xi) 是分类器对 xi 的预测,若是预测正确,则二者都等于1 或都等于 -1,因此乘积为1,若是预测错误,则乘积为 -1。公式能够改写为 ,这个分段函数的指数部分的图像以下。若是分类器的 αt > 0,咱们看函数图像中 > 0 的部分,若是分类正确,指数函数的值将 < 1(黄线),乘以权重后将减小权重的值,即分类正确的样本将减小权重;若是分类错误,指数函数的值将 > 1(蓝线),即分类错误的样本将增长权重。若是 αt < 0,看函数图像中 < 0 的部分,指数函数的值反过来了,但此时分类器也预测反了,因此结果依然是正确的样本将减小权重,错误的样本将增长权重。

AdaBoost的优势

AdaBoost 几乎能够“开箱即用”,由于它是自适应的,对参数不会太敏感。
它在必定程度上能够避免“维度灾难”,我理解主要是 AdaBoost 只须要构造弱分类器,好比决策树的话,能够只使用那些比较重要的特征,树的深度很浅,运行速度较快。
同时多个弱分类器的集成还能提高模型的预测能力。

AdaBoost的缺点

比较明显的一点是对噪音和异常数据比较敏感,由于算法中会对分类错误的样本持续提高关注。

AdaBoost公式推导

前面算法中直接给了几个公式,好比分类器的权重 α 和 样本权重更新公式,为何采用这样的计算公式,咱们来推导一下。

假设有N个样本 (x1,y1), (x2,y2)…(xN,yN),其中 y1...yN ∈{-1, 1},即二分类问题。有一系列分类器k 能够线性组合成一个强分类器C,在第 m-1 次迭代,分类器:

这里C是强分类器,k是弱分类器,α 是 k在 C中的权重,下标 1...m-1 是迭代的轮次。注意这里所用的记号与前面算法步骤中的公式的记号有不一样,注意各自的含义。

接下来第m轮分类器

由于是采用迭代的方法逐个构造分类器k,因此在第m轮,能够认为 C_(m-1) 已是肯定的了,如今须要的是找到一个好的 km 及其系数 αm。

对分类器 Cm 采用指数型偏差

令 m=1时 ,m>1时 ,上式可写为

若是km预测正确,则 ,若是km预测错误,则 ,所以上式再分裂为预测正确和预测错误的项:

(公式1)

(公式2)

咱们但愿找到合适的 km 和 αm 使得 E最小。

  1. 先考虑 km。在公式2中,只有 的值受 km 的影响,也就是说,要最小化E,对于km来讲,就是要构造一个最小化 的分类器 km。
  2. 考虑 αm。用公式1对 αm 求导,当导数 = 0 时 E有最小值。

若是令错误率

3.另外看下更新样本权重。
因为

因而

因此

参考

深刻浅出ML之Boosting家族
维基百科 —— Boosting (machine learning))
维基百科 —— AdaBoost