学习笔记——提升方法
提升(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)\)
初始化训练数据的权值分布$$D_1 = (w_{11}, ...,w_{1i},...,w_{1N}), w_{1i} = \frac{1}{N}, i = 1,2,...,N$$
对\(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,规范因子不要也问题不大吧)构建基本分类器的线性组合$$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 \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 \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)$$是当前模型拟合数据的残差。
- 回归问题的提升树算法
初始化\(f_0(x) = 0\)
对\(m = 1, 2, ...,M\)
- 计算残差\(r_{mi} = y_i - f_{m-1}(x_i), i = 1, 2, ..., N\)
- 拟合残差\(r_{mi}\)学习一个回归树,得到\(T(x; \Theta_m)\)
- 更新\(f_m(x) = f_{m-1}(x) + T(x; \Theta_m)\)
得到回归问题提升树$$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(x)}$$作为回归问题提升树算法中的残差的近似值,拟合一个回归树。
(注:本文为读书笔记与总结,侧重算法原理,来源为[《统计学习方法》](http://book.douban.com/subject/10590856/)一书第八章)
作者:[rubbninja](http://www.cnblogs.com/rubbninja/) 出处:[http://www.cnblogs.com/rubbninja/](http://www.cnblogs.com/rubbninja/) 关于作者:目前主要研究领域为机器学习与无线定位技术,欢迎讨论与指正!