学习笔记——提升方法

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

提升方法AdaBoost算法

  • 为什么叫”提升“方法

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

大多数的提升方法都是改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据分布调用弱学习算法学习一系列弱分类器。这样,关键就在于如何改变训练数据的权值,以及如何组合这些弱分类器。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} \rightarrow \{-1, +1\}\] b. 计算\(G_m(x)\)在训练数据集上的分类误差率\[e_m = P(G_m(x_i)\neq y_i)=\sum_{i =1}^{N} w_{mi} I(G_m(x_i) \neq 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) \neq 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 [2\sqrt{e_m(1-e_m)} ] = \prod _{m=1}^M \sqrt{(1 - 4\gamma_m^2)} \leq \exp (-2\sum_{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) \neq y_i) \leq \exp (-2M\gamma^2)\]
    这表明在此条件下,AdaBoost的训练误差是以指数速率下降的。

AdaBoost算法的解释

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

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

每一步中极小化损失函数\[(\beta_m, \gamma_m) = \arg \min_{\beta_m, \gamma_m} \sum_{i = 1}^N L(y_i, f_{m-1}(x_i) + \beta 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\) a. 计算残差\(r_{mi} = y_i - f_{m-1}(x_i), i = 1, 2, ..., N\) b. 拟合残差\(r_{mi}\)学习一个回归树,得到\(T(x; \Theta_m)\) c. 更新\(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)}\]作为回归问题提升树算法中的残差的近似值,拟合一个回归树。






(注:本文为读书笔记与总结,侧重算法原理,来源为《统计学习方法》一书第八章)


作者:rubbninja
出处:http://www.cnblogs.com/rubbninja/
关于作者:目前主要研究领域为机器学习与无线定位技术,欢迎讨论与指正!

你可能感兴趣的:(学习笔记——提升方法)