AdaBoost&GBDT

1、提升方法的基本思路

提升方法的基本思想就是“三个臭皮匠赛过诸葛亮”,更严谨的说,是由“弱学习算法”提升为“强学习算法”。“弱”和“强”的定义由Kearns和Valiant提出:弱可学习指存在一个多项式算法可学习它且学习正确率仅比随机猜测好;强可学习指存在一个多项式算法可学习它且学习正确率很高。非常有趣的是Schapire证明了强可学习与弱可学习是等价的。也就是说在PAC学习的框架下,一个概念是强可学习的充要条件是这个概念弱可学习。这就为我们将“弱学习算法”提升为“强学习算法”提供了理论基础

理论基础有了,我们再来看一下提升方法的动机,其实这个动机很自然,对一个问题而言,弱学习器的训练比强学习器容易得多。另外,我个人认为提升方法还可以在样本不太大的情形下发挥作用,因为提升方法所做的事就是让各个基学习器关注不同的样本,最后达到兼顾各个样本的效果,可以充分发挥每个样本的作用(这一说法未必准确,但《统计学习方法》中只包含10个样本的例题似乎印证了这一点)。

最后简单说一下提升方法的基本思路提升方法就是从弱学习算法出发,反复学习得到一系列弱分类器(基分类器),然后组合这些弱分类器构成一个强分类器。不难看出这其中的要点有两个,一是如何得到这一系列弱分类器,二是如何组合这些弱分类器,下面我们看一下AdaBoost是如何处理这两个步骤的。

2、AdaBoost算法

AdaBoost算法的流程如下:

(1)初始化训练数据权值分布(均匀分布):

(2)对

  • 使用具有权值分布的数据集进行学习得到基分类器:

  • 计算在训练数据集上的分类误差率(带权重的误差率):

  • 计算的系数:

  • 更新训练数据集权值分布:

这里是规范化因子:

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

从而得到最终分类器:

我们看一下算法中的要点:

a)的系数,可以看到时,且随的减小而增大。这是合理的,前者说明一个基分类器至少要优于随机分类器其权重才大于0,后者说明分类误差率越小的基分类器在最终分类器中的权重越大。

b)更新训练数据权值的式子可以写成:

在a)中我们已经说明了,因此这里的,,这意味着被基分类器误分类样本的权值被扩大,而被正确分类样本的权值则被缩小。也就是说训练下一个分类器的时候我们重点关注当前分类器误分的样本,这样下一个分类器将与当前分类器“互补”,从而最后组合起来将达到在全体数据上较好的效果。

c)需要注意的是,我们训练各个基学习器是序列化进行的,而不是同时进行的,这也意味着AdaBoost算法不能并行计算。也就是说,我们训练当前学习器时用的样本权重是由前一个学习器用的样本权重及其分类结果决定的,因此要按次序进行。

3、AdaBoost算法误差分析

定理1

AdaBoost算法最终分类器的训练误差界为:

证明:

当时,,因此
当时,

从而前半部分得证。

后半部分推导要用到和权重的关系:

由上式可得:

\begin{equation*} \begin{aligned} \frac{1}{N}\sum_i e^{-y_i f(x_i)}&=\frac{1}{N}\sum_i e^{-\sum_{m=1}^M \alpha_m y_i G_m(x_i)}\\ &=\sum_i w_{1i}\prod_{m=1}^M e^{-\alpha_m y_i G_m(x_i)}(w_{1i}=\frac{1}{N})\\ &=Z_1\sum_i w_{2i}\prod_{m=2}^M e^{-\alpha_m y_i G_m(x_i)}(由式(*)可得)\\ &=Z_1 Z_2\sum_i w_{3i}\prod_{m=3}^M e^{-\alpha_m y_i G_m(x_i)}\\ &=\dots\\ &=\prod_{m=1}^M Z_m \end{aligned} \end{equation*}

从而后半部分得证。

定理1为我们提供了AdaBoost的训练误差界,所以我们每一轮选取的应该使得最小,从而使训练误差下降最快。

定理2

二分类问题AdaBoost的训练误差界满足:

\begin{equation*} \begin{aligned} \prod_{m=1}^M Z_m&=\prod_{m=1}^M[2\sqrt{e_m(1-e_m)}]\\ &=\prod_{m=1}^M \sqrt{1-4\gamma_m^2}(\gamma_m=\frac{1}{2}-e_m)\\ &\leq e^{-2\sum_{m=1}^{M}\gamma_m^2} \end{aligned} \end{equation*}

证明:

\begin{equation*} \begin{aligned} Z_m&=\sum_{i=1}^N w_{mi} e^{-\alpha_m y_i G_m(x_i)}\\ &=\sum_{y_i=G_m(x_i)}w_{mi}e^{-\alpha_m}+\sum_{y_i\neq G_m(x_i)}w_{mi}e^{\alpha_m}\\ &=(1-e_m)e^{-\alpha_m}+e_m e^{\alpha_m}\\ &=2\sqrt{e_m(1-e_m)}(因为\alpha_m=\frac{1}{2}ln\frac{1-e_m}{e_m})\\ &=\sqrt{1-4\gamma_m^2} \end{aligned} \end{equation*}

这就完成了定理2中等号部分的证明,至于不等号的证明,我们把项拆开并用代替,于是现在需要证明的结论为:

即:

即:

这在时是显然的。从而定理2得证。

不难看出,定理2是在定理1的基础上推出的一个更宽泛的上界,这个上界与各个基分类器的错误率有关,衡量的其实是分类器由于随机分类器的程度,若这个程度有一个下界:,即各个基分类器都与随机分类器的误差率之间有一个“间隙”,则:

这表明随基学习器数目的增加,AdaBoost的训练误差以指数速率下降。这是非常好的性质。

4、AdaBoost算法解释

AdaBoost的另一个解释是模型为加法模型、损失函数为指数函数、学习算法为前向分步算法时的二分类学习方法。

以上解释中有几个关键词:加法模型,前向分步,指数函数。

所谓加法模型,就是最终学习器是由各个基学习器带权加和而成的:

这里表示基函数的参数,表示基函数的系数。

所谓前向分布,就是对于使得上述经验风险极小化的问题:

直接优化组参数是非常复杂的。前向分布算法的思路是每一步只学习一个基学习器及参数,即一次只学习一组系数。具体来说,每步只需优化:

得到最优参数,然后更新:

最后,我们以定理的形式说明AdaBoost的损失函数是指数函数

定理3

AdaBoost算法是前向分步加法算法的特例,模型是由基分类器组成的加法模型,损失函数是指数函数。即损失函数为:

证明:

假设经过轮迭代前向分步算法已经得到:

第轮迭代得到,则为:

目标是使前向分步算法得到的使的指数损失最小:

上式可表示为:

可以看到不依赖和,与最小化无关。

下面我们先求最优的,对任意:

当时,,又为定值,所以我们希望尽可能小,即:

这正是AdaBoost算法的基本分类器,接下来我们求:

\begin{equation*} \begin{aligned} \sum_{i=1}^N \hat{w}_{mi}e^{-y_i \alpha G(x_i)}&=e^\alpha\sum_{y_i\neq G(x_i)} \hat{w}_{mi}+e^{-\alpha} \sum_{y_i=G(x_i)} \hat{w}_{mi}\\ &=(e^\alpha-e^{-\alpha}) \sum_{i=1}^N \hat{w}_{mi} I(y_i\neq G(x_i))+e^{-\alpha} \sum_{i=1}^N \hat{w}_{mi} \end{aligned} \end{equation*}

将带入上式,则有:

又因为权重之和为1:

从而原式变成:

对求导并令其为0:

这也与AdaBoost算法的完全一致。

最后我们看每一轮样本权值的更新。由:

可知:

可以看到,除了规范化因子,这与AdaBoost算法的权值更新过程也完全一致。

5、提升树(Boosting Tree)

以决策树为基函数的提升方法称为提升树。提升树被认为是统计学习中性能最好的方法之一。

提升树模型可以表示为决策树的加法模型:

其中表示决策树,表示决策树参数,为树的个数。

提升树算法采用前向分步算法。首先确定初始提升树,第步模型为:

其中为当前模型,通过经验风险极小化确定下一棵决策树参数:

针对不同问题的提升树学习算法主要区别在于损失函数不同。平方误差对应回归问题,指数损失函数对应分类问题,一般损失函数对应一般决策问题。

5.1、分类问题的提升树方法

上面提到,当损失函数为指数函数的时候,提升树算法可以解决分类问题。我们之前证明了AdaBoost算法是前向分步加法算法的特例,模型是由基分类器组成的加法模型,损失函数是指数函数。

因此针对而分类问题,提升树算法只需将AdaBoost算法中的基分类器限制为二分类决策树即可,也就是说此时提升树算法是AdaBoost算法的特殊情况。

5.2、回归问题的提升树算法

将输入空间划分为个互不相交的区域,并在每个区域上输出常量,则树可以表示为:

其中参数表示树的区域划分和各区域上的常数。是回归树的复杂度即叶子结点个数。

当采用平方误差损失函数时:

其损失为:

这里是当前模型拟合数据的残差。

因此对回归问题的提升树算法来说,只需要简单地拟合当前模型的残差即可。算法流程如下:

(1)初始化
(2)对

  • 计算残差:
  • 拟合残差学习一个回归树,得到
  • 更新
    (3)得到回归问题的提升树:

5.3、梯度提升

当损失函数是均方误差或者指数函数的时候,优化是很简单的,但对一般形式的损失函数来说,往往每一步的优化并不那么容易。梯度提升(Gradient Boosting)算法可以解决这个问题。其关键是利用损失函数的负梯度在当前模型的值:

作为回归问题提升树算法中的残差的近似值,拟合一个回归树。

梯度提升算法流程如下:

(1)初始化:

(2)对:

  • a) 对,计算:

  • b) 对拟合一个回归树,得到第棵树的叶结点区域

  • c) 对,计算:

  • d) 更新

(3)得到回归树:

上述算法流程要点如下:第一步初始化只有一个根结点的树。第2(a)步计算损失函数的负梯度在当前模型的值,将其作为残差的估计(对于平方损失函数这就是残差,对于一般损失函数这就是残差的近似值)。第2(b)步估计回归树叶结点区域,以拟合残差近似值。第2(c)步利用线性搜索估计叶结点区域的值,使损失函数极小化。第2(d)步更新回归树。第3步输出最终模型。

你可能感兴趣的:(AdaBoost&GBDT)