李航-统计学习方法-笔记-8:提升方法

提升方法

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

本章
(1)介绍boosting方法的思路和代表性的boosting算法AdaBoost
(2)通过训练误差分析探讨AdaBoost为什么能提高学习精度
(3)从前向分布加法模型的角度解释AdaBoost
(4)最后叙述boosting方法更具体的实例——boosting tree(提升树)

boosting基本思路:boosting基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。实际上就是“三个臭皮匠,顶个诸葛亮”的道理。

强可学习:在概率近似正确(probably approximately correct,PAC)学习的框架中,一个概念,如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么称这个概念是强可学习的。

弱可学习:一个概念,如果存在一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测略好,那么称为弱可学习的。

强可学习和弱可学习:Schapire证明了强可学习与弱可学习是等价的,也就是说,在PAC学习的框架下,一个概念是强可学习的充要条件是这个概念是弱可学习的。

从弱学习到强学习:可将“弱学习”提升为“强学习”,弱学习算法通常比强学习算法容易得多。具体如何实施提升,便称为开发提升方法时要解决的问题。有很多提升算法被提出,最具代表性的就是AdaBoost。

提升方法就是从弱学习算法出发,反复学习,得到一系列弱分类器(又称为基分类器),然后组合这些弱分类器,构成一个强分类器。大多数的提升方法都是改变训练数据的概率分布(训练数据的权重分布),针对不同的训练数据分布,调用弱学习算法学习一系列弱分类器。这里就有两个问题。
(1)在每一轮如何改变训练数据的权值或概率分布
(2)如何将弱分类器组合成一个强分类器

AdaBoost

对于前面提到的两个问题,AdaBoost的做法是
(1)提高那些被前一轮弱分类器错误分类样本的权重,降低那些被正确分类样本的权重。这样一来,那些没有得到正确分类的数据,由于权值的加大而受到后一轮的弱分类器的更大关注。
(2)加权多数表决,加大分类器误差小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差大的弱分类器的权值,使其在表决中起较小的作用。

算法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 \{-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} \to \{+1, -1\}\)

(b) 计算\(G_m(x)\)在训练集上的分类误差率

\[e_m = \sum_{i=1}^{N} P(G_m(x_i) \neq y_i) = \sum_{G_m(x_i) \neq y_i }w_{mi} \]

\(w_{mi}\)表示第\(m\)轮中第\(i\)个实例的权值,\(\sum_{i=1}^N w_{mi} = 1\)。这表明,\(G_m(x)\)在加权的训练集上的分类误差率是被\(G_m(x)\)误分类样本的权重之和。

(c) 计算\(G_m(x)\)的系数\(\alpha_m = \frac{1}{2} \log \frac{1- e_m}{e_m}\),对数为自然对数。\(\alpha_m\)表示\(G_m(x)\)在最终分类器中的重要性。\(e_m \leqslant 0.5\)\(\alpha_m \geqslant 0\),而且\(\alpha_m\)随着\(e_m\)的减小而增大,分类误差越小的基分类器在最终分类器中的作用越大。

(d) 更新训练集的权值分布,为下一轮做准备

\[D_{m+1} = (w_{m+1, 1}, ..., w_{m+1, i}, ..., w_{m+1, N}) \]

\[w_{m+1, i} = \left\{\begin{matrix} \frac{w_{mi}}{Z_m}e^{-\alpha_m}, & G_m(x_i) = y_i\\ \frac{w_{mi}}{Z_m}e^{\alpha_m}, & G_m(x_i) \neq y_i \end{matrix}\right. \tag{8.4}\]

\[Z_m = \sum_{i=1}^N w_{mi} exp(-\alpha_m y_i G_m(x_i)) \tag{8.5} \]

其中\(Z_m\)为规范化因子。
误分类样本权值变大,正确分类样本权值缩小,两相比较放大了\(\frac{1-e_m}{e_m}\)倍。

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

\[f(x) = \sum_{m=1}^M \alpha_m G_m(x) \tag{8.6} \]

最终分类器为

\[G(x) = sign(f(x)) \tag{8.7} \]

注意\(\alpha_m\)之和不为1。

AdaBoost算法的训练误差分析

AdaBoost最基本的性质是它能在学习过程中不断减少训练误差。

定理8.1(AdaBoost的训练误差界):AdaBoost算法最终分类器的训练误差界为

\[\frac{1}{N} \sum_{i=1}^{N} I(G(x_i) \neq y_i) \leqslant \frac{1}{N} \sum_i exp(-y_i f(x_i)) = \prod_m Z_m \]

证明:当\(G(x_i) \neq y_i\)时,\(y_i f(x_i) < 0\),所以\(exp(-y_i f(x_i)) \geqslant 1\),推导出前半部分。

后半部分推导用到式\((8.4)\)的变形:

\[w_{mi} exp(-\alpha_m y_i G_m(x_i)) = Z_m w_{m+1,i} \]

推导如下:

\[\begin{split} & \frac{1}{N} \sum_i exp(-y_i f(x_i)) \\ &= \frac{1}{N} \sum_i exp(-\sum_{m=1}^M \alpha_m y_i G_m(x_i)) \\ &= \sum_i w_{1i} \prod_{m=1}^M exp(-\alpha_m y_i G_m(x_i)) \\ &= Z_1 \sum_i w_{2i} \prod_{m=2}^M exp(-\alpha_m y_i G_m(x_i)) \\ &= Z_1 Z_2 \sum_i w_{3i} \prod_{m=3}^M exp(-\alpha_m y_i G_m(x_i)) \\ &= ... \\ &= Z_1 Z_2 ... Z_{M-1} \sum_i w_{Mi} exp(-\alpha_m y_i G_m(x_i)) \\ &= \prod_{m=1}^M Z_m \end{split}\]

这一定理说明,可以在每一轮选取恰当的\(G_m\)使得\(Z_m\)最小,从而使训练误差下降最快。

定理8.2(二分类问题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} \leqslant exp(-2\sum_{m=1}^M \gamma_m^2) \]

这里\(\gamma_m = \frac{1}{2} - e_m\)
证明:由\(Z_m\)的定义式\((8.5)\)以及式\((8.1)\)

\[\begin{split} Z_m &= \sum_{i=1}^N w_{mi} exp(-\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)} = \sqrt{1 - 4\gamma_m^2 } \end{split} \tag{8.11}\]

至于不等式$exp(-2\sum_{m=1}^M \gamma_m^2) \geqslant\prod_{m=1}^M \sqrt{1-4\gamma_m^2} $

可由\((e^{-2x^2})^2\)\(x=0\)的泰勒展开得到\((e^{-2x^2})^2 \geqslant 1 - 4x^2\)进而推出。

推论8.1:如果存在\(\gamma > 0\),对所有\(m\)\(\gamma_m \geqslant \gamma\),则

\[\frac{1}{N} \sum_{i=1}^N I(G(x_i) \neq y_i) \leqslant exp(-2M\gamma^2) \]

这表明在此条件下AdaBoost的训练误差是以指数速率下降的,这一性质当然很有吸引力。

与一些早期的提升方法不同,AdaBoost具有适应性,即它能适应弱分类器各自的训练误差率。这也是它名称的由来,Ada是Adaptive的简写。

AdaBoost算法的解释

前向分步算法
考虑加法模型

\[f(x) = \sum_{m=1}^M \beta_m b(x; \gamma_m) \]

其中\(b(x; \gamma_m)\)为基函数,\(\gamma_m\)为基函数的参数,\(\beta_m\)为基函数的系数。

在给定训练集和损失函数\(L(y, f(x))\)的条件下,学习加法模型\(f(x)\)成为经验风险极小化即损失函数极小化问题:

\[\min_{\beta_m, \gamma_m} \sum_{i=1}^N L(y_i, \sum_{m=1}^M \beta_m b(x_i; \gamma_m)) \tag{8.14} \]

通常这是一个复杂的优化问题。前向分步算法求解这一优化问题的想法是:从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式\((8.14)\),那么就可以简化优化的复杂度。每步优化如下损失:

\[\min_{\beta, \gamma} \sum_{i=1}^N L(y_i, \beta b(x_i; \gamma)) \]

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

由前向分步算法可以推导出AdaBoost,用定理叙述这一关系。

定理8.3:AdaBoost算法是前向分步加法算法的特例。这时,模型是由基本分类器组成的加法模型,损失函数是指数函数。

证明:AdaBoost最终分类器为\(f(x) = \sum_{i=1}^M \alpha_m G_m(x)\),由基分类器\(G_m(x)\)及其系数\(\alpha_m\)组成,\(m=1, 2, ..., M\)。前向分步算法逐一学习基函数,这一过程与AdaBoost算法逐一学习基分类器一致。

下面证明前向分步算法的损失函数是指数损失函数

\[L(y, f(x)) = exp[-yf(x)] \]

在第\(m\)轮迭代得到

\[f_m(x) = f_{m-1}(x) + \alpha_m G_m(x) \]

目标是使前向分步算法得到的\(\alpha_m\)\(G_m(x)\)使\(f_m(x)\)在训练数据集\(T\)上的指数损失最小,即

\[(\alpha_m, G_m(x)) = \arg \min_{\alpha, G} \sum_{i=1}^N exp [ -y_i(f_{m-1}(x_i) + \alpha G(x_i))] \tag{8.20} \]

可表示为

\[(\alpha_m, G_m(x)) = \arg \min_{\alpha, G} \sum_{i=1}^N \bar{w}_{mi} exp [ -y_i \alpha G(x_i)] \tag{8.21} \]

其中\(\bar{w}_{mi} = exp [-y_i f_{m-1}(x_i)]\)。因为\(\bar{w}_{mi}\)既不依赖\(\alpha\)也不依赖\(G\),所以与最小化无关。但\(\bar{w}_{mi}\)依赖于\(f_{m-1}(x)\),随着每一轮迭代而发生改变。

对任意\(\alpha > 0\),使\((8.21)\)最小的\(G(x)\)由下式得到:

\[G_m^*(x) = \arg \min_{G} \sum_{i=1}^N \bar{w}_{mi} I(y_i \neq G(x_i)) \]

此分类器\(G_m^*(x)\)即为AdaBoost算法的基本分类器\(G_m(x)\),因为它是使第\(m\)轮加权训练数据分类误差率最小的基本分类器。

之后,求\(\alpha_m^*\),参照式\((8.11)\),式\((8.21)\)

\[\begin{split} &\sum_{i=1}^N \bar{w}_{mi} exp [ -y_i \alpha G(x_i)] \\ &= \sum_{y_i = G_m(x_i)} \bar{w}_{mi} e^{-\alpha} + \sum_{y_i \neq G_m(x_i)} \bar{w}_{mi} e^{\alpha} \\ &= (e^{\alpha} - e^{-\alpha}) \sum_{i=1}^N \bar{w}_{mi} I(y_i \neq G(x_i)) + e^{-\alpha} \sum_{i=1}^N \bar{w}_{mi} \end{split} \tag{8.22}\]

将已求得的\(G_m^*(x)\)代入式\((8.22)\),对\(\alpha\)求导并使导数为0,即得到使式\((8.21)\)最小的\(\alpha\)

\[\alpha_m^* = \frac{1}{2} \log \frac{1-e_m}{e_m} \]

其中\(e_m\)是分类误差率

\[e_m = \frac{\sum_{i=1}^N \bar{w}_{mi} I(y_i \neq G_m(x_i))}{\sum_{i=1}^N \bar{w}_{mi}} = \sum_{i=1}^N w_{mi} I(y_i \neq G_m(x_i)) \]

这里的\(\alpha_m^*\)与AdaBoost算法第2(c)步的\(\alpha_m\)完全一致。

最后来看每一轮样本权值的更新,由

\[f_m(x) = f_{m-1}(x) + \alpha_m G_m(x) \]

以及$$\bar{w}{mi} = exp[-y_i f(x_i)]$$
可到

\[\bar{w}_{m+1, i} = \bar{w}_{m,i} exp [-y_i \alpha_m G_m(x)] \]

这与AdaBoost算法第2(d)步的样本权值更新,只差规范化因子,因而等价。

提升树

提升树简述

提升树被认为是统计学习中性能最好的方法之一。

提升方法实际采用加法模型(即基函数的线性组合)与前向分步算法。以决策树为基函数的提升方法称为提升树(boosting tree)。

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

\[f_M(x) = \sum_{m=1}^{M} T(x; \theta_m) \]

其中,\(T(x; \theta_m)\)表示决策树,\(\theta_m\)为决策树的参数,\(M\)为树的个数。

\(m\)步的模型是\(f_m(x) = f_{m-1}(x) + T(x; \theta_m)\)

其中,\(f_{m-1}(x)\)为当前模型,通过经验风险极小化确定下一棵决策树的参数\(\theta_m\)

\[\hat{\theta}_m = \arg \min_{\theta_m} \sum_{i=1}^N L(y_i, f_{m-1}(x_i) + T(x_i ; \theta_m)) \]

由于树的线性组合可以很好地拟合训练数据,即使数据中的输入与输出之间的关系很复杂。所以提升树是一个高功能的学习算法。

提升树的学习算法:下面讨论对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同。包括用指数损失的分类问题,用平方损失的回归问题,以及用一般损失的一般决策问题。

对于二分类问题,只需将AdaBoost的基分类器限制为二分类树即可。

回归问题的提升树,将输入空间\(\mathcal{X}\)划分为\(J\)个互不相交的区域\(R_1, R_2, ..., R_J\),并且在每个区域上确定输出的常量\(c_j\),那么树可以表示为

\[T(x_i; \theta) = \sum_{j=1}^J c_j I(x \in R_j) \]

其中,参数\(\theta= \{(R_1, c_1), (R_2, c_2), ..., (R_J, c_J),\}\)表示树的区域划分和各区域上的常数。\(J\)是回归树的复杂度即叶结点个数。

使用以下前向分步算法

\[\begin{split} f_0(x) &= 0 \\ f_m(x) &= f_{m-1}(x) + T(x; \theta_m), \ \ m=1,2,...,M \\ f_M(x) &= \sum_{i=1}^M T(x; \theta_m)\end{split}\]

在前向分步算法的第\(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)) \]

得到\(\hat{\theta}_m\),即第\(m\)棵树的参数。

当采用平方损失时

\[\begin{split} &L(y, f_{m-1}(x) + T(x;\theta_m)) \\ &= [y - f_{m-1}(x) - T(x; \theta_m)]^2 \\ &= [r - T(x; \theta_m)]^2 \end{split}\]

这里,\(r= y - f_{m-1}(x)\),是当前模型拟合数据的残差。所以,对回归问题的提升树算法来说,只需简单地拟合当前模型的残差。

梯度提升
提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失时,每一步优化是简单的。

但对一般损失函数而言,往往每一步优化并不容易。针对这一问题,Freidman提出了梯度提升(gradient boosting)算法。这是利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值

\[-[\frac{\partial L(y, f(x_i))}{\partial f(x_i)}]_{f(x) = f_{m-1}(x)} \]

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

posted @ 2019-06-05 15:54  PilgrimHui  阅读(1709)  评论(0编辑  收藏  举报