目录

提升树模型

回归问题的提升树方法

算法1:

输入:训练数据集$ T={(x_1,y_1),(x_2,y_2),…,(x_N,y_N)}, x_i \in X \subseteq R^n, y_i \in Y \subseteq R $

输出:提升树$ f_m(x) $

(1) 初始化$ f_0(x)=0 $

(2) 对$ m=1,2,…,M $

(2.1) 按式(1)计算残差$ r_{mi}=y_i-f_{m-1}(x_i) $

(2.2) 拟合残差$r_{mi}$学习一个回归树,得到$T(x;\Theta_m)$

(2.3) 更新$ f_m(x)=f_{m-1}(x)+T(x;\Theta_m) $

(3) 得到回归问题的提升树$ f_M(x)=\displaystyle\sum_{m=1}^M T(x;\Theta_m) $

例子:

$x_i$ 1 2 3 4 5 6 7 8 9
$y_i$ 5.56 5.70 5.91 6.40 6.80 7.05 8.90 8.70 9.00

求$ T_1(x) $

2.1 训练数据的某一个划分点s: $ R_1= \lbrace x|x \leq s \rbrace, R_2= \lbrace x|x \gt s \rbrace $

在集合$R_1,R_2$中,计算$ c_1,c_2 $为 $ c_1=\frac{1}{N_1}\displaystyle\sum_{x_i \in R_1} y_i$, $c_2=\frac{1}{N_2}\displaystyle\sum_{x_i \in R_2} y_i $, 这里的$N_1,N_2$分别为$R_1,R_2$的样本点数。

设定切分点s,根据训练集样本可知,考虑如下切分点(也可用本身数据值作划分): 1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5

根据优化问题的公式:$m(s)=\min_s[\min_{c_1}\displaystyle\sum_{x_i \in R_1}(y_i-c_1)^2 + min_{c_2}\displaystyle\sum_{x_i \in R_2}(y_i-c_2)^2]$ 求出相应的$R_1,R_2,c_1,c_2$及$ m(s) $

当s=1.5时,$ R_1=\lbrace 1 \rbrace , R_2=\lbrace 2,3,…,10 \rbrace, c_1=5.56, c_2=7.50, m(s)=0+15.72=15.72 $

将s和$m(s)$的计算结果列出如下表1:

$$表1 计算数据表$$

$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

由表1可知,当s=6.5时$m(s)$达到最大值,此时 $ R_1=\lbrace 1,2,…,6 \rbrace , R_2=\lbrace 7,8,9,10 \rbrace, c_1=6.24, c_2=8.91 $, 所以回归树$ T_1(x) $为 $$ T_1(x) = \begin{cases} 6.24, & x \lt 6.5 \\ 8.91, & x \ge 6.5 \end{cases} $$ $$ f_1(x)=T_1(x) $$

用$ f_1(x) $拟合数据的残差(输出值和真实值之差)见表2所示,表中$ r_{2i}=y_i-f_1(x_i),i=1,2,…,10 $

$$ 表2 数据残差表 $$

$x_i$ 1 2 3 4 5 6 7 8 9
$r_{2i}$ -0.68 -0.54 -0.33 0.16 0.56 0.81 -0.01 -0.21 0.09

此时,用$ f_1(x) $拟合训练数据的平方损失误差为:$$ L(y,f_1(x))=\displaystyle\sum_{i=1}^{10}(y_i-f_1(x_i))^2=1.93 $$

求$T_2(x)$

同理,求$T_2(x)$和求$T_1(x)$的方法是一样的,只是$ f_1(x) $拟合数据的残差,$ f_2(x) $拟合的数据为表2的残差,求得 $$ T_2(x) = \begin{cases} -0.52, & x \lt 3.5 \\ 0.22, & x \ge 3.5 \end{cases} $$ $$ f_2(x)=f_1(x)+T_2(x)= \begin{cases} 5.72, & x \lt 3.5 \\ 6.46, & x \ge 3.5 \cup x \lt 6.5 \\ 9.13, & x \ge 6.5 \end{cases} $$

此时,用$ f_2(x) $拟合表的平方损失误差为:$$ L(y,f_2(x))=\displaystyle\sum_{i=1}^{10}(y_i-f_2(x_i))^2=0.79 $$

继续求得: $$ T_3(x) = \begin{cases} 0.15, & x \lt 6.5 \\ -0.22, & x \ge 6.5 \end{cases}, L(y,f_3(x))=0.47 $$ $$ T_4(x) = \begin{cases} -0.16, & x \lt 4.5 \\ 0.11, & x \ge 4.5 \end{cases}, L(y,f_4(x))=0.30 $$ $$ T_5(x) = \begin{cases} 0.07, & x \lt 6.5 \\ -0.11, & x \ge 6.5 \end{cases}, L(y,f_5(x))=0.23 $$ $$ T_6(x) = \begin{cases} -0.15, & x \lt 2.5 \\ 0.04, & x \ge 2.5 \end{cases}, f_6(x)=f_5(x)+T_6(x)= \begin{cases} 5.63, & x \lt 2.5 \\ 5.82, & x \ge 2.5 \cup x \lt 3.5 \\ 6.56, & x \ge 3.5 \cup x \lt 4.5 \\ 6.83, & x \ge 4.5 \cup x \lt 5.5 \\ 8.95, & x \ge 6.5 \end{cases} $$

此时,用$ f_6(x) $拟合表的平方损失误差为:$$ L(y,f_6(x))=\displaystyle\sum_{i=1}^{10}(y_i-f_6(x_i))^2=0.17 $$

假设当前的误差0.17已经满足误差要求,则$f(x)=f_6(x)$为所求的提升树。

梯度提升

当损失函数是平方损失和指数损失函数时,每一步的优化是很简单的,但是对于一般的损失函数而言, 往往每一步优化没那么容易。因此,有研究人员提出了梯度提升算法,这是利用最速下降法的近似方 法,关键是利用损失函数的负梯度在当前模型的值$$ -[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_m-1(x)} $$作为回归问题 提升树算法中的残差的近似值,拟合一回归树。

算法2:

输入:训练数据集$ T={(x_1,y_1),(x_2,y_2),…,(x_N,y_N)}, x_i \in X \subseteq R^n, y_i \in Y \subseteq R $

输出:回归树$ f(x) $

(1) 初始化$ f_0(x)=argmin_c \displaystyle\sum_{i=1}^N L(y_i,c) $

(2) 对$ m=1,2,…,M $

(2.1) 对$ i=1,2,…,N $,计算 $$ r_{mi}=-[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_m-1(x)} $$

(2.2) 对$r_{mi}$拟合一个回归树,得到第m棵树的叶结点区域$R_mj,j=1,2,…,J$

(2.3) 对$j=1,2,…,J$,计算$ c_{mi}=argmin_c \displaystyle\sum_{xi \in R_mj} L(y_i,f_{m-1}(x_i)+c) $

(2.4) 更新$ f_m(x)=f{m-1}(x)+\displaystyle\sum_{j=1}^J c_{mj}I(x \in R_{mj}) $

(3) 得到回归问题$ f(x)=f_M(x)=\displaystyle\sum_{m=1}^M \displaystyle\sum_{j=1}^J c_{mj}I(x \in R_{mj}) $

说明:

第(1)步初始化,估计使损失函数最小化的常数值

第(2.1)步计算损失函数的负梯度在当前模型的值,将它作为残差的估计。注:对于平方损失函数,为残差;对于一般的损失函数,为残差近似值

第(2.2)步估计回归树叶结点区域,以拟合残差的近似值

第(2.3)步利用线性搜索估计叶结点区域的值,使损失函数最小化

第(2.4)步更新回归树

第(3)步得到输出的最终模型$f(x)$

代码实现:

1