首先介绍提升算法的思路和代表性的提升算法AdaBoost,然后分析AdaBoost为什么可以提高学习精度,从前向分步加法模型的角度解释AdaBoost,最后介绍提升方法更具体的实力,提升树boosting tree
提升方法AdaBoost算法
提升方法的基本思路
三个臭皮匠顶个诸葛亮,在概率近似正确PAC框架中
- 强可学习:一个类如果存在一个多项式的学习算法能够学习它,并且正确率很高;
- 弱可学习:一个类如果存在一个多项式的学习算法能够学习它,正确率仅比随机猜测要好,这个类就是弱可学习的
弱可学习算法更容易发现,也就是求弱分类器比求强分类器容易,提升算法就是从弱分类器算法出发,反复学习求得一系列弱分类器,然后组合这些弱分类器,构成一个强分类器,这些弱分类器是通过改变训练数据的概率分布来学习到的,提升算法主要关注:每一轮如何改变训练数据的概率分布或权值,如何将弱分类器组合成为强分类器
AdaBoost算法
输入:训练数据集\(T = \{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}\),其中\(x_i \in \mathcal{X} \subseteq R^n,y_i \in \mathcal{Y} = \{-1,+1\}\),弱分类器算法
输出:最终分类器\(G(x)\)
- 初始化训练数据的权值分布
- 使用具有权值分布\(D_m\)的训练数据集学习,得到基本分类器
- 计算\(G_m(x)\)在训练数据集上的分类误差率
- 计算\(G_m(x)\)的系数
这里的对数是自然对数
- 更新训练数据集的权值分布
\(Z_m\)是规范化因子
\[Z_m = \sum_{i = 1}^Nw_{mi}exp(-\alpha_my_iG_m(x_i)),i = 1,2,\cdots,N \]- 构建基本分类器的线性组合
得到最终的分类器:
\[G(x) = sign(f(x)) = sign\left(\sum_{m = 1}^{M}\alpha_mG_m(x)\right) \]AdaBoost算法的训练误差分析
- AdaBoost算法最终分类器的训练误差界为:
可以在每一轮选择适当的\(G_m\)使得\(Z_m\)最小,从而使得训练误差下降得最快
- 对于二类分类问题:二类分类问题AdaBoost的训练误差界
其中\(\gamma_m = \frac{1}{2} - e_m\)
- 如果存在\(\gamma \gt 0\)对所有\(m\)有\(\gamma_m \geq \gamma\)则有:
AdaBoost的训练误差是以指数速率下降的
AdaBoost算法的解释
可以认为AdaBoost算法是加法模型、损失函数为指数函数、学习算法为前向分步算法时的二类分类学习算法
前向分步算法
加法模型如下:
\[f(x) = \sum_{m = 1}^M\beta_mb(x;\gamma_m) \]其中\(b(x;\gamma_m)\)是基函数,\(\gamma_m\)是基函数的参数,\(\beta_m\)是基函数的系数,在给定训练数据及损失函数\(L(y,f(x))\)的条件下,学习加法模型\(f(x)\)称为经验风险最小化即损失函数极小化的问题:
\[\mathop{min}\limits_{\beta_m,\gamma_m}\sum_{i = 1}^N\left(y_i,\sum_{m = 1}^M\beta_mb(x;\gamma_m)\right) \]前向分步算法求解这一个问题的思路是每次只学习一个基函数及其系数,逐步逼近优化目标函数式,就可以简化优化的复杂度,也就是每次可以只优化如下损失函数:
\[\mathop{min}\limits_{\beta,\gamma}\sum_{i = 1}^N\left(y_i,\beta b(x;\gamma)\right) \]前向分步算法总结如下:
输入:训练数据集\(T = \{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}\),损失函数\(L(y,f(x))\),基函数集\(\{b(x;\gamma)\}\)
输出:加法模型\(f(x)\)
- 初始化\(f_0(x) = 0\)
- 对\(m = 1,2,\cdots,M\)
极小化损失函数:
得到参数\(\beta_m,\gamma_m\)
更新:
- 得到加法模型
前向分步算法将同时求解从\(m = 1\)到\(M\)的所有参数\(\beta_m,\gamma_m\)的优化问题简化为逐次求解各个\(\beta_m,\gamma_m\)的优化问题
前向分步算法与AdaBoost
- AdaBoost算法是前向分步算法的特例,这时,模型是由基本分类器组成的加法模型,损失函数是指数函数
提升树
提升树是以分类树或回归树为基本分类器的提升方法
提升树模型
提升树boosting tree:采用加法模型即基函数的线性组合与前向分步算法,以决策树为基函数的提升方法,对分类问题是二叉分类树,对回归问题是二叉回归树
提升树模型可以表示为决策树的加法模型:
其中,\(T(x,\theta_m)\)表示决策树,\(\theta_m\)为决策树的参数,\(M\)为决策树的个数
回归问题的提升树算法
对于二类分类问题,提升树算法只需要将上面的基本分类器的种类限制为二类分类树即可,下面叙述回归问题的提升树:
输入:训练数据集\(T \{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\},x_i \in \mathcal{X} \subseteq R^n,y_i \in \mathcal{Y}\subseteq R\)
输出:提升树\(f_M(x)\)
- 初始化\(f_0(x) = 0\)
- 对\(m = 1,2,\cdots,M\)
因为采用平方误差损失函数:
所以计算残差:
\[r_{mi} = y_i - f_{m - 1}(x_i),i = 1,2,\cdots,N \]拟合残差\(r_{mi}\)学习一个回归树。得到\(T(x;\theta_m)\)
更新\(f_m(x) = f_{m - 1}(x) + T(x;\theta_m)\)
- 得到回归问题提升树
梯度提升
目的:当损失函数是平方损失和指数损失的时候,每一步优化是简单的,但是对于一般损失函数,每一步优化没有那么简单,梯度提升gradient boosting算法是利用损失函数的负梯度在当前模型的值
\[-\left[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}\right]_{f(x) = f_{m - 1}(x)} \]作为回归问题提升树算法中的残差的近似值
输入:训练数据集\(T \{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\},x_i \in \mathcal{X} \subseteq R^n,y_i \in \mathcal{Y}\subseteq R\),损失函数\(L(y,f(x))\)
输出:回归树\(\hat{f}(x)\)
- 初始化
- 对\(m = 1,2,\cdots,M\)
对\(i = 1,2,\cdots,N\)计算
对\(r_{mi}\)拟合一个回归树,得到第\(m\)棵树的叶结点区域\(R_{mj},j = 1,2,\cdots,J\)
对\(j = 1,2,\cdots,J\)计算
更新\(f_m(x) = f_{m - 1}(x) + \sum_{j = 1}^Jc_{mj}I(x \in R_{mj})\)
- 得到回归树