学习笔记——提升方法

提升(boosting)方法是一种常用的统计学习方法,应用广泛且有效。在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类性能。

提升方法AdaBoost算法


  • 为什么叫”提升“方法

    在概率近似正确(PAC)学习框架中,一个概念,如果存在一个多项式的学习算法能够学习它,并且正确率很高,称这个概念是强可学习的,若正确率仅比随机猜想略好,称这个概念是弱可学习的。有趣的是有人证明了强可学习与弱可学习是等价的,那么,如果发现了弱学习算法(比较容易找到),就有可能将它提升为强学习算法。最具代表性的是AdaBoost算法。

大多数的提升方法都是改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据分布调用弱学习算法学习一系列弱分类器。这样,关键就在于如何改变训练数据的权值,以及如何组合这些弱分类器。AdaBoost的做法是提高那些前一轮弱分类器错误分类样本的权值。

AdaBoost算法

  • 输入:训练数据集(T = {(x_1,y_1), (x_2, y_2), ..., (x_N,y_N) }),其中(x_i in mathcal{X} subseteq R^n)(y_i in mathcal{Y} = {-1, +1});弱学习算法。
  • 输出:最终分类器(G(x))
  1. 初始化训练数据的权值分布$$D_1 = (w_{11}, ...,w_{1i},...,w_{1N}), w_{1i} = frac{1}{N}, i = 1,2,...,N$$

  2. (m = 1,2,...,M)

    a. 使用具有权值分布(D_m)的训练数据集学习,得到基本分类器$$G_m(x): mathcal{X} ightarrow {-1, +1}$$
    b. 计算(G_m(x))在训练数据集上的分类误差率$$e_m = P(G_m(x_i) eq y_i)=sum_{i =1}^{N} w_{mi} I(G_m(x_i) eq y_i)$$
    c. 计算(G_x(x))的系数$$alpha_m = frac{1}{2} log frac{1 - e_m}{e_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_m y_i G_m(x_i)), i = 1,2,...,N$$,这里,(Z_m)是规范因子$$Z_m = sum_{i = 1}^N w_{wi} exp (-alpha_m y_i G_m(x_i))$$它使(D_m)成为一个概率分布。(简单点就是正确的除以(alpha),错误的乘以alpha,规范因子不要也问题不大吧)

  3. 构建基本分类器的线性组合$$f(x) = sum_{m = 1}^M alpha_m G_m (x)$$得到最终的分类器$$G(x) = sign(f(x)) = sign(sum_{m = 1}^M alpha_m G_m(x))$$

AdaBoost的训练误差分析


  • AdaBoost算法最终分类器的训练误差界为:$$frac{1}{N} sum_{i = 1}^N I(G(x_i) eq y_i) leq frac{1}{N} sum_i exp (-y_i f(x_i)) = prod_m Z_m$$

    在每一轮选取适当的(G_m)使得(Z_m)最小,从而使训练误差下降最快。

  • 二分类问题AdaBoost的训练误差界:$$prod_{m = 1}^M Z_m = prod_{m = 1} ^M [2sqrt{e_m(1-e_m)} ] = prod {m=1}^M sqrt{(1 - 4gamma_m^2)} leq exp (-2sum{m=1}^M gamma_m^2)$$这里,(gamma_m = frac{1}{2} - e_m.)

  • 如果存在(gamma > 0),对所有(m)(gamma_m geq gamma),则$$frac{1}{N} sum_{i = 1}^N I(G(x_i) eq y_i) leq exp (-2Mgamma^2)$$
    这表明在此条件下,AdaBoost的训练误差是以指数速率下降的。

AdaBoost算法的解释


可认为AdaBoost算法是模型为加法模型,损失函数为指数函数,学习算法为前向分步算法时的二分类学习方法。可以由前向分步算法推导出AdaBoost。

加法模型$$f(x) = sum_{m = 1}^M eta_m b(x; gamma_m)$$,其中,(b(x; gamma_m))为基函数,(gamma_m)为基函数的参数,(eta_m)为基函数的系数。

每一步中极小化损失函数$$(eta_m, gamma_m) = arg min_{eta_m, gamma_m} sum_{i = 1}^N L(y_i, f_{m-1}(x_i) + eta b(x_i; gamma))$$

提升树


提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习中性能最好的方法之一。

  • 提升树模型

    [f_M(x) = sum_{m - 1}^M T(x; Theta_m)$$其中,$T(x; Theta_m)$表示决策树;$Theta_m$为决策树的参数;$M$为树的个数。 ]

    与AdaBoost类似,对于二分类问题,提升树算法只需将AdaBoost中的基本分类器限制为二类分类树即可。对于回归问题,采用以下前向分步算法:$$f_0(x) = 0$$ $$f_m(x) = f_{m-1}(x) + T(x; Theta_m), m = 1,2,...,M$$ $$f_M(x) = sum_{m=1}^M T(x; Theta_m)$$ 在前向分步算法的第(m)步,给定当前模型(f_{m-1}(x)),需求解$$hat{Theta}m = arg min{Theta_m} sum_{i =1}^N L(y_i, f_{m-1}(x_i) + T(x_i; Theta_m))$$得到第(m)棵树的参数。

当采用平方误差损失函数时,损失函数化简为:$$[r - T(x; Theta_m)]^2$$,其中$$r = y - f_{m-1}(x)$$是当前模型拟合数据的残差。

  • 回归问题的提升树算法
  1. 初始化(f_0(x) = 0)

  2. (m = 1, 2, ...,M)

    1. 计算残差(r_{mi} = y_i - f_{m-1}(x_i), i = 1, 2, ..., N)
    2. 拟合残差(r_{mi})学习一个回归树,得到(T(x; Theta_m))
    3. 更新(f_m(x) = f_{m-1}(x) + T(x; Theta_m))
  3. 得到回归问题提升树$$f_M(x) = sum_{m -1}^M T(x; Theta_m)$$

  • 梯度提升
    当损失函数是平方损失和指数损失函数时,每一步优化是很简单的。但对一般损失函数而言,不容易。梯度提升(gradient boosting)算法,利用损失函数的负梯度在当前模型的值$$-[frac{partial L(y, f(x_i))}{partial f(x_i)}]{f(x) = f{m -1}(x)}$$作为回归问题提升树算法中的残差的近似值,拟合一个回归树。


(注:本文为读书笔记与总结,侧重算法原理,来源为[《统计学习方法》](http://book.douban.com/subject/10590856/)一书第八章)
作者:[rubbninja](http://www.cnblogs.com/rubbninja/) 出处:[http://www.cnblogs.com/rubbninja/](http://www.cnblogs.com/rubbninja/) 关于作者:目前主要研究领域为机器学习与无线定位技术,欢迎讨论与指正!
原文地址:https://www.cnblogs.com/rubbninja/p/5180921.html