AdaBoost提升树学习笔记

提升方法-AdaBoost提升树学习笔记

作为非数学专业出身看到密密麻麻的数学公式刚开始真的是非常头疼。算法的物理逻辑的时候尚能理解,但是涉及到具体的数学公式实现就开始懵逼了:为什么要用这个公式,这个公式是怎么推到的,这个公式达到什么样的效果?
这里结合自己的理解和画图,用最直白的语言对每个公式作用进行解剖。


一、AdaBoost核心概念总结

  1. 提升方法是将弱学习算法提升为强学习算法的统计学习方法。在分类学习中,提升方法通过反复修改训练数据的权值分布,构建一系列基本分类器(弱分类器),并将这些基本分类器线性组合,构成一个强分类器。代表性的提升方法是AdaBoost算法。(重点是:更新分类器的参数训练集的权重见下2

    AdaBoost模型是弱分类器的线性组合:
    $$f(x)=∑^M_{m=1}\alpha _mG_m(x)$$

    • $M$表示该提升树共有$M$个弱分类器组成
    • $G_m(x)$表示第$m$个弱分类器
    • $\alpha_m$为第$m$个弱分类器的参数(反应该分类器的重要性)
  2. AdaBoost算法的特点是通过迭代每次学习一个基本分类器。每次迭代中,核心思想是:提高那些被前一轮分类器错误分类数据的权值,而降低那些被正确分类的数据的权值。最后,AdaBoost将基本分类器的线性组合作为强分类器,其中给分类误差率小的基本分类器以大的权值,给分类误差率大的基本分类器以小的权值

  3. AdaBoost的训练误差分析表明,AdaBoost的每次迭代可以减少它在训练数据集上的分类误差率,这说明了它作为提升方法的有效性。(每次迭代误差递减且误差$0≤\epsilon <0.5$
  4. AdaBoost算法的一个解释是该算法实际是前向分步算法的一个实现。在这个方法里,模型是加法模型,损失函数是指数损失,算法是前向分步算法时的二分类学习方法。每一步中极小化损失函数。
  5. 提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习中最有效的方法之一。

AdaBoost是一种典型的提升树算法。

通过上面的总结我们看到,AdaBoost是一个神奇的算法,以精妙的方式通过更新数据集的权重以及各个弱分类器的参数组合成一个强分类器。那么它具体是怎么做到的呢?

二、AdaBoost算法学习过程

输入:训练数据集$T={(x_1,y_1),(x_2,y_2),…,(x_N,y_N)}$,其中$x_i\in X ⊆R^n,y_i\in Y={-1,1}$,弱学习算法$G_m(x)$;

输出:最终强化算法分类器$G(x)$
(1)初始化训练数据总和为1的权值分布:(初始权重为归一化后的均值既$\frac 1N$)
$$D_1=(w_{11},…,w_{1i},…w_{1N}),w_{1i}=\frac 1N, i=1,2,…N$$
(2)对$m=1,2,…M$:(弱分类器的个数)

(a)使用具有权值分布的$D_m$的训练数据集学习,得到基本分类器:(数据集$X$到{-1,1}的映射)
$$G_m(x):X->{-1,1}$$
(b)计算$Gm(x)$在训练数据集上的分类误差率:(公式不够简洁明了,其实总结下来非常好理解:误差率$e_m$=误分类样本的权值之和)
$$e_m=∑^N_{i=1}P(G_m(x_i)≠y_i)=∑^N_{i=1}w_{mi}I(G_m(x_i)≠y_i)$$

  • 我们来考虑下误差$e_m$的取值空间:由于训练集权制之和为1,因此误差$0≤e_m≤1$。但是这样还不够。因为我们在选择分裂阈值的时候会选择一个最优或局部最优的取值来分裂,且当$e_m=0.5$是表明该分裂阈值对预测无贡献。因此最终得到的$e_m$的实际取值应小于$e_m≤0.5$。
  • 所以最终:$0≤e_m≤0.5$,且每次迭代误差$e_m$递减。这点对下面的参数理解很重要。

(c)计算$G_m(x)$的系数:(这里对数为自然对数)
$$\alpha_m=\frac 12log\frac{1-e_m}{e_m} $$

  • 那么问题来了,为什么要用这个公式来计算更新每个基分类器的参数?我们先画个图出来观察下这个函数。(其中y轴为$\alpha _m$,x轴为误差$e_m$)

  • 由(2-b)我们得到误差$e_m$的取值范围为$0≤e_m<0.5$,结合该图可以可知$0<\alpha_m<1$。
  • 另外可以发现,通过该函数的转换,弱分类器$G_m(x)$的误差的越小,参数$\alpha_m$越大。即实现了给分类误差率小的基本分类器以大的权值,给分类误差率大的基本分类器以小的权值

(d)更新训练数据集的权值分布:(该权值决定数据集的重要性,并让误差的计算变得简单)
$$D_{m+1}=(w_{m+1,1},…,w_{m+1,i},…w_{m+1,N})$$
$$w_{m+1,i}=\frac {w_{mi}}{Z_m}exp(-\alpha_my_iG_m(x-i)),i=1,2,…N$$

  • 这里$y_i={-1,1} $为真实值,$G_m(x_i)={-1,1}$为预测值。当预测正确时$y_iG_m(x_i)$为1,反之为-1。
  • 令$\delta_{m_i}=\alpha_my_iG_m(x_i)$,$\theta_{mi}=\frac {w_{mi}}{Z_m}$(把它看作一个用于归一化权值的加权平均常数)。权重$w_{m+1,i}$的更新函数可以简化为$$w_{m+1,i}=\theta_{mi}exp(\delta {mi}),i=1,2,…N$$画出$y=w{m+1,i}=exp(\delta_{mi})$的图形来看一下:由于$0<\alpha_m<1$,所以$-1<\delta_{m,i }<1$。且使得预测错误的数据集样本点更新后的权重变大,预测正确的权值变小,然后对所有权值进行归一化。这就是该函数实现的作用。(图中y=1是当$\alpha$无限接近于0时的情况:解释为,当$\alpha_m$权值越大,权重$w_{m+1,i}$更新改变的效果越明显。)
  • 这里,$Z_m$是规范化因子,目的是使各数据集的权重进行归一化。理解为$Z_m$=更新后的各数据集权重之和。
    $$Z_m=∑^N_{i=1}w_{mi}exp(-\alpha_my_iG_m(x_i))$$

(3)构建基本分类器的新型组合$f(x)=∑^M_{m=1}\alpha_mG_m(x)$,即:
$$G(x)=sign(f(x))=sign(∑^M_{m=1}\alpha_mG_m(x))$$

  • 函数$sign()$的意义是将正数判别为1,负数判别为-1,最终达到分类的目的。如图:

参数$\alpha_m$公式及权重$w_{m+1,i} $其实是通过前向分步算法分别得到的$\alpha_m$和$G_m(x)$并使得$f_m(x)$再训练数据集$T$上的指数损失最小。具体的推导过程可参考《统计学习方法》–李航 第145~146页

三、AdaBoost算法实现步骤

上面解释了AdaBoost算法的具体内容。这里写出它的分布实现步骤再对上文算法加深下理解:

(1)假设训练数据集具有均匀的权值分布,即每个训练样本在基本分类器的学习中作用相同,这一假设保证第1步能够在原始数据上学习基本分类器$G_1(x)$。

(2)AdaBoost反复学习基本分类器,在每一轮$m=1,2,…,M$顺次地执行下列操作:

(a)使用当前分布$D_m$加权的训练数据集,学习基本分类器$G_m(x)$

(b)计算基本分类器$G_m(x)$再加权训练数据集上的分类误差率(即误分类样本的权值之和。这里要注意$w_{mi}$表示第$m$轮中第$i$个实例的权值,且权值之和为1,即$∑^N_{i=1}w_{mi}=1$):
$$e_m=P(G_m(x_i)≠y_i)=∑_{G_m(x_i)≠y_i}w_{mi}$$

(c)计算基本分类器$G_m (x)$的系数$\alpha_m$。$alpha_m$表示$G_m(x)$在最终分类器中的重要性。由上面(2-c)可知,当$e_m≤1/2$时,$alpha_m≥0$,并且$\alpha_m$随着$e_m$的减小而增大,所以分类误差率越小的分类器在最终分类器中的作用越大。

(d)更新训练数据的权值分布为下一轮作准备。式(2-d)的权重更新函数可以写成:

  • 由此可知,被基本分类器$G_m (x)$误分类样本的权值得以扩大,而被正确分类样本的权值却得以缩小。两相比较,误分类样本的权值被放大$e^{(2\alpha_m)}=\frac{e_m}{1-e_m} $倍。因此,误分类样本在下一轮学习中起更大的作用。不改变所给的训练数据,而不断改变训练数据权值的分布,使得训练数据在基本分类器的学习中起不同的作用,这是AdaBoost的一个特点。

(3)线性组合$f(x)$实现$M$个基本分类器的加权表决。系数$\alpha_m$ 表示了基本分类器$G_m (x)$的重要性,这里,所有$\alpha_m$ 之和并不为1。$f(x)$的符号决定实例x的类,$f(x)$的绝对值表示分类的确信度。利用基本分类器的线性组合构建最终分类器是AdaBoost的另一特点。

提升方法是即采用加法模型(即基数函数的线性组合)与前向分步算法,以决策树为基函数的提升方法称为提升树(boosting tree)。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。

喜欢本文的伙伴请关注我的博客http://ihoge.cn