提升树

集成学习

随机森林

AdaBoost 算法

提升树

梯度提升树(GBDT)

XGBoost



一、提升树

提升树是以 \(CART\) 回归树为基本分类器的提升方法。

提升方法采用加法模型(即基函数的线性组合)与前向分步算法。



1. 提升树模型

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

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

\(T(x;\Theta_m)\) 表示决策树,\(\Theta_m\) 表示决策树的参数,\(M\) 表示树的个数。



2. 提升树算法

提升树算法采用前向分布算法。首先确定初始提升树 \(f_0(x) = 0\),第 \(m\) 步的模型是

\[\tag{14} f_m(x) = f_{m-1}(x) + T(x;\Theta_m) \]

\(f_{m-1}(x)\) 为当前模型,通过损失函数极小化确定下一颗决策树的参数 \(\Theta_m\)

\[\begin{aligned} \hat{\Theta}_m & = arg \ \underset{\Theta_m}{min} \sum_{i=1}^{N} L(y_i,f_{m-1}(x_i) + T(x_i;\Theta_m)) \\ & = arg \ \underset{\Theta_m}{min} \sum_{i=1}^{N} (r_{mi} - T(x_i;\Theta_m))^2 \end{aligned} \tag{15} \]

其中,\(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\),那么树可表示为

\[\tag{16} T(x;\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\) 是回归树的复杂度即叶结点个数



回归问题的提升树算法:


输入:训练集 \(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)\) 。根据数据,考虑如下切分点:

\[1.5,\ 2.5,\ 3.5,\ 4.5,\ 5.5,\ 6.5,\ 7.5,\ 8.5,\ 9.5 \]


\(s = 1.5\)

\[\begin{aligned} & R_1 = \{x | x \leqslant s \} = \{1\} \\ & R_2 = \{x | x > s \} = \{2,3,4,5,6,7,8,9,10\} \\ & c_1 = \frac{1}{N_1} \sum_{x_i \in R_1} y_i = 5.56 \\ & c_2 = \frac{1}{N_2} \sum_{x_i \in R_2} y_i = 15.72 \\ & m(s) = \underset{c_1}{min} \sum_{x_i \in R_1} (y_i-c_1)^2 + \underset{c_2}{min} \sum_{x_i \in R_2} (y_i-c_2)^2 = 0+15.72 = 15.72 \end{aligned} \]

\(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)\)

\[\begin{aligned} T_1(x) & = \begin{cases} 6.24, & x<6.5 \\ 8.91, & x \geqslant 6.5 \end{cases} \\ f_1(x) & = T_1(x) \end{aligned} \]

\(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)\) 拟合训练集的平方损失误差:

\[L(y,f_1(x)) = \sum_{i=1}^{10} (y_i - f_1(x_i))^2 = 1.93 \]


② 求 \(T_2(x)\)。拟合残差列表。

\[T_2(x) = \begin{cases} -0.52, & x<3.5 \\ 0.22, & x \geqslant 3.5 \end{cases} \]

\[f_2(x) = f_1(x) + T_2(x) = \begin{cases} 5.72, & x<3.5 \\ 6.46, & 3.5 \leqslant x < 6.5 \\ 9.13, & x \geqslant 6.5 \end{cases} \]

\(f_2(x)\) 拟合训练集的平方损失误差:

\[L(y, f_2(x)) = \sum_{i=1}^{10}(y_i - f_2(x_i))^2 = 0.79 \]

继续求得

\[\begin{aligned} & T_3(x) = \begin{cases} 0.15, & x<6.5 \\ -0.22, & x \geqslant6.5 \end{cases} \\ & L(y,f_3(x)) = 0.47, \\ \\ & T_4(x) = \begin{cases} -0.16, & x<4.5 \\ 0.11, & x \geqslant 4.5 \end{cases} \\ & L(y,f_4(x)) = 0.30, \\ \\ & T_5(x) = \begin{cases} 0.07, & x<6.5 \\ -0.11, & x \geqslant 6.5 \end{cases} \\ & L(y,f_5(x)) = 0.23, \\ \\ & T_6(x) = \begin{cases} -0.15, & x<2.5 \\ 0.44, & x \geqslant 2.5 \end{cases} \\ \\ & f_6(x) = f_5(x) + T_6(x) = T_1(x) + T_2(x) +...+ T_6(x) \\ & = \begin{cases} 5.63, & x<2.5 \\ 5.82, & 2.5 \leqslant x < 3.5 \\ 6.56, & 3.5 \leqslant x < 4.5 \\ 6.83, & 4.5 \leqslant x < 6.5 \\ 8.95, & x \geqslant 6.5 \end{cases} \end{aligned} \]

\(f_6(x)\) 拟合训练集的平方损失误差

\[L(y,f_6(x)) = \sum_{i=1}^{10} (y_i - f_6(x_i))^2 = 0.17 \]

假设此时满足误差要求,那么 \(f(x) = f_6(x)\) 为所求提升树。



二、梯度提升树

提升树用加法模型与前项分布算法实现学习的优化过程。当损失函数是平方误差损失函数和指数损失函数时,每一步优化很简单的。但对一般损失函数而言,每一步并不容易。

\(Freidman\) 提出利用损失函数的负梯度作为残差的近似值,拟合一个回归树。

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

其中,下标 \({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)} \]



posted @ 2020-07-02 18:51  做梦当财神  阅读(753)  评论(0编辑  收藏  举报