提升树
一、提升树
提升树是以 \(CART\) 回归树为基本分类器的提升方法。
提升方法采用加法模型(即基函数的线性组合)与前向分步算法。
1. 提升树模型
提升树模型可以表示为决策树的加法模型:
\(T(x;\Theta_m)\) 表示决策树,\(\Theta_m\) 表示决策树的参数,\(M\) 表示树的个数。
2. 提升树算法
提升树算法采用前向分布算法。首先确定初始提升树 \(f_0(x) = 0\),第 \(m\) 步的模型是
\(f_{m-1}(x)\) 为当前模型,通过损失函数极小化确定下一颗决策树的参数 \(\Theta_m\):
其中,\(r_{mi} = y_i - f_{m-1}(x_i)\) 表示残差。
使用不同的损失函数,得到不同的提升树算法。比如:平方误差损失函数的回归问题;指数损失函数、交叉熵损失的分类问题。
提升树算法是 \(AdaBoost\) 算法的特殊情况。
- 对于二分类问题,提升树只需将 \(AdaBoost\) 算法的基本分类器限制为二分类树即可。
- 基分类器的系数 \(\alpha_m\) 全为 \(1\)。
原理:只要损失函数是指数损失函数,就可以用指数损失函数调整样本的权值,从而让每个基分类器学到不同的内容。
1. 回归问题的提升树
训练集 \(T = \{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\},\ x_i \in \pmb{R^n}, y_i \in \pmb{R}\),将输入空间 \(x_i\) 划分为 \(J\) 个互不相交的区域 \(R_1,R_2,...,R_J\),每个区域上确定输出的常量 \(c_j\),那么树可表示为
其中,参数 \(\Theta = \{(R_1,c_1),(R_2,c_2),...,(R_J,c_J)\}\) 表示树的区域划分和各区域上的常数。\(J\) 是回归树的复杂度即叶结点个数。
回归问题的提升树算法:
输入:训练集 \(T = \{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\},\ x_i \in \pmb{R^n}, y_i \in \pmb{R}\);
输出:提升树 \(f_M(x)\)。
① 初始化 \(f_0(x) = 0\)。
② 对 \(m = 1,2,...,M\)。
(a) 对每一个样本 \((x_i,y_i)\) ,按式 \((16)\) 计算残差:
\[r_{mi} = y_i - f_{m-1}(x_i),\ \ \ \ i=1,2,...,N \] (b) 利用 \(\{(x_i,r_{mi})\},\ \ \ \ i=1,2,...,N\) 学习一个回归树,得到 \(T(x;\Theta_m)\)。
(c) 更新 \(f_m(x) = f_{m-1}(x) + T(x;\Theta_m)\)。
③ 得到回归问题提升树
\[f_M(x) = \sum_{m=1}^{M}T(x;\Theta_m) \]
例 \(2\):下表是训练集,\(x \in [0.5,10.5]\),\(y \in [5.0,10.0]\),学习这个回归问题的提升树模型,考虑只用树桩作为基函数。
\(x_i\) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
\(y_i\) | 5.56 | 5.70 | 5.91 | 6.40 | 6.80 | 7.05 | 8.90 | 8.70 | 9.00 | 9.05 |
解:
① 求 \(f_1(x)\) 即回归树 \(T_1(x)\) 。根据数据,考虑如下切分点:
当 \(s = 1.5\),
\(N_1,N_2\) 是 \(R_1,R_2\) 的样本点数。
现将 \(s\) 及 \(m(s)\) 结果列表如下。
\(s\) | 1.5 | 2.5 | 3.5 | 4.5 | 5.5 | 6.5 | 7.5 | 8.5 | 9.5 |
---|---|---|---|---|---|---|---|---|---|
\(m(s)\) | 15.72 | 12.07 | 8.36 | 5.78 | 3.91 | 1.93 | 8.01 | 11.73 | 15.74 |
当 \(s = 6.5\) 时 \(m(s)\) 最小,此时 \(R_1 = \{1,2,3,4,5,6\}\),\(R_2 = \{7,8,9,10\}\),\(c_1 = 6.24\),\(c_2 = 8.91\),
所以回归树 \(T_1(x)\) 为
用 \(f_1(x)\) 拟合训练集,残差列表如下。\(r_{2i} = y_i - f_1(x_i),\ i=1,2,...,10\)。
\(x_i\) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
\(r_{2i}\) | -0.68 | -0.54 | -0.33 | 0.16 | 0.56 | 0.81 | -0.01 | -0.21 | 0.09 | 0.14 |
用 \(f_1(x)\) 拟合训练集的平方损失误差:
② 求 \(T_2(x)\)。拟合残差列表。
用 \(f_2(x)\) 拟合训练集的平方损失误差:
继续求得
用 \(f_6(x)\) 拟合训练集的平方损失误差
假设此时满足误差要求,那么 \(f(x) = f_6(x)\) 为所求提升树。
二、梯度提升树
提升树用加法模型与前项分布算法实现学习的优化过程。当损失函数是平方误差损失函数和指数损失函数时,每一步优化很简单的。但对一般损失函数而言,每一步并不容易。
\(Freidman\) 提出利用损失函数的负梯度作为残差的近似值,拟合一个回归树。
其中,下标 \({f(x)=f_{m-1}(x)}\) 表示 \(f(x)\) 的取值 \(f_{m-1}(x)\)。
梯度提升树回归算法:
输入:训练集 \(T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}\),\(x_i \in \mathcal{X} \subseteq \pmb{R}^n\),\(y_i \in \mathcal{Y} \subseteq \pmb{R}\);
其中,\(N\) 表示样本个数,\(\mathcal{X}\) 表示输入空间,\(\pmb{R}^n\) 表示 \(n\) 维。
输出:回归树 \(\hat{f}(x)\)。
其中,\(\hat{f}(x)\) 表示训练出来的模型。
(1)初始化
\[f_0(x) = arg \ \underset{c}{min} \sum_{i=1}^{N} L(y_i, c) \](2)对 \(m=1,2,...,M\)
(a)对 \(i=1,2,...,N\),计算残差
\[r_{mi} = - \begin{bmatrix} \frac{\partial L(y_i, \ f(x_i))}{\partial f(x_i)} \end{bmatrix} _{f(x)=f_{m-1} \ \ \ (x)} \] (b)将所有样本 \((x_i, r_{mi})\) 拟合一个回归树,得到第 \(m\) 棵树的叶结点区域 \(R_{mj}\),\(j=1,2,...,J\)。
(c)对 \(j=1,2,...,J\),其中 \(J\) 为叶结点的个数,计算
\[c_{mj} = arg\ \underset{c}{min} \sum_{x_i \in R_{mj}} \ L(y_i,f_{m-1} + c) \] (d)更新 \(f_m(x) = f_{m-1}(x) + \sum_{j=1}^{J} c_{mj}I(x \in R_{mj})\)
(3)得到回归树
\[\hat{f}(x) = f_M(x) = \sum_{m=1}^{M} \sum_{j=1}^{J} c_{mj}I(x \in R_{mj}) \]
第 \((1)\) 步初始化,估计使损失函数极小化的常数值,它只有一个根节点。
第 \((2a)\) 步计算损失函数的负梯度在当前模型的值,作为残差的估计。对平方误差损失函数,它就是通常所说的残差;对于一般的损失函数,就是残差的近似值。
第 \((2b)\) 步对残差拟合一个回归树,得到回归树叶结点区域。
第 \((2c)\) 步利用线性搜索估计叶节点区域的值。使损失函数极小化。
第 \((2d)\) 步更新回归树。
第 \((3)\) 步得到最终模型 \(\hat{f}(x)\)。
求证:平方损失函数的负梯度是残差。
证明:为求导方便,在损失函数前乘以 \(\frac{1}{2}\):
\[L(y_i,f(x_i)) = \frac{1}{2} \left( y_i,f(x_i)\right)^2 \]对 \(f(x_i)\) 求导,则有:
\[\frac{\partial L(y_i, \ f(x_i))}{\partial f(x_i)} = f(x_i) - y_i \]残差是梯度相反数,即:
\[r_{mi} = y_i - f_{m-1}(x_i) = - \begin{bmatrix} \frac{\partial L(y_i, \ f(x_i))}{\partial f(x_i)} \end{bmatrix} _{f(x)=f_{m-1}\ \ \ (x)} \]