深度学习树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/winycg/article/details/83475579

提升树模型

提升树是以分类数或回归树为基本分类器的提升方法。提升方法实际采用加法模型(即基函数的线性组合)与前向分布算法,以决策树为基函数的提升方法为提升树(boosting tree)。基本分类器 x < v x<v x > v x>v ,可以看作是一个根结点直接连接两个叶结点的简单决策树,也就是单层决策树,称为决策树桩(decision stump)。提升树模型可以表达为决策树的加法模型: F m ( x ) = t = 1 m f ( x ; θ t ) F_{m}(\mathbf{x})=\sum_{t=1}^{m}f(\mathbf x;\theta_{t})
其中 f ( x ; θ j ) f(\mathbf x;\theta_{j}) 为第 j j 棵决策树, θ j \theta_{j} 为参数。
提升树采用前向分布算法,确定初始提升树 f 0 ( x ) = 0 f_{0}(\mathbf{x})=0 ,第 m m 次提升的模型为: F m ( x ) = F m 1 ( x ) + f ( x ; θ m ) F_{m}(\mathbf{x})=F_{m-1}(\mathbf{x})+f(\mathbf{x};\theta_{m})
其中, F m 1 ( x ) F_{m-1}(\mathbf x) 为前 m 1 m-1 个决策树组成的集成分类器,通过最小化经验风险来确定第 m m 棵树的参数:
θ m = arg min θ i = 1 N L ( y i , F m 1 ( x i ) + f ( x i ; θ ) ) \theta_{m}=\arg\min_{\theta}\sum_{i=1}^{N}L(y_{i},F_{m-1}(\mathbf{x}_{i})+f(\mathbf{x}_{i};\theta))
不同问题的提升树算法,主要区别是使用的损失函数不同。对于二分类问题,提升树算法是AdaBoost算法的特殊情况。这里叙述回归问题的提升树。
已知训练集 { ( x i , y i ) } 1 N \{(\mathbf{x}_{i},y_{i})\}_{1}^{N} ,如果将输入空间划分为 J J 个不相交的区域 R 1 , R 2 , . . . , R J R_{1},R_{2},...,R_{J} ,并且每个区域确定输出的常量 c j c_{j} ,树可表示为: f ( x ; θ ) = j = 1 J c j I ( x R j ) f(\mathbf{x};\theta)=\sum_{j=1}^{J}c_{j}I(\mathbf{x}\in R_{j})
其中,参数 θ = { ( R j , c j ) } 1 N \theta=\{(R_{j},c_{j})\}_{1}^{N} 表示树的区域划分和区域的常数值。 J J 是回归树的复杂度,即叶节点的个数。
当误差函数为平方损失误差为: L ( y , f ( x ) ) = ( y f ( x ) ) 2 L(y,f(x))=(y-f(x))^{2}
L ( y , F m 1 ( x ) + f ( x ; θ ) ) = L [ y F m 1 ( x ) f ( x ; θ ) ] 2 = [ r f ( x ; θ ) ] 2 L(y,F_{m-1}(\mathbf{x})+f(\mathbf{x};\theta))=L[y-F_{m-1}(\mathbf{x})-f(\mathbf{x};\theta)]^{2}=[r-f(\mathbf{x};\theta)]^{2}
r = y F m 1 ( x ) r=y-F_{m-1}(\mathbf{x}) 是当前模型拟合数据的残差(residual)。所以,回归问题的提升树算法只需要拟合当前模型的残差。
回归问题的提升树算法:
输入:训练数据集 { ( x i , y i ) } 1 N \{(\mathbf{x}_{i},y_{i})\}_{1}^{N}
输出:提升树 F M ( x ) F_{M}(\mathbf{x})
初始化 f 0 ( x ) = 0 f_{0}(\mathbf{x})=0
m = 1 , 2 , . . . , M m=1,2,...,M :
---------计算残差 r m i = y i F m 1 ( x i ) , i = 1 , 2 , . . . , N r_{mi}=y_{i}-F_{m-1}(\mathbf x_{i}),i=1,2,...,N
---------拟合残差学习一个回归树,得到回归树 f ( x ; θ m ) f(\mathbf{x;\theta_{m}})
---------更新 F m ( x ) = F m 1 ( x ) + f ( x ; θ m ) F_{m}(\mathbf{x})=F_{m-1}(\mathbf{x})+f(\mathbf{x;\theta_{m}})
最终得到的回归提升树: F M ( x ) = m = 1 M f ( x ; θ m ) F_{M}(\mathbf{x})=\sum_{m=1}^{M}f(\mathbf{x};\theta_{m})
例子: 学习这个回归问题的提升树模型,考虑只用树桩做为基函数。

x 1 2 3 4 5 6 7 8 9 10
y 5.56 5.70 5.91 6.40 6.80 7.05 8.90 8.70 9.00 9.05

第一步求回归树 f 1 ( x ) f_{1}(x) ,通过以下优化问题:
m ( s ) = min c 1 x i R 1 ( y i c 1 ) 2 + min c 2 x i R 2 ( y i c 2 ) 2 m(s)=\min_{c_{1}}\sum_{x_{i}\in R_{1}}(y_{i}-c_{1})^{2}+\min_{c_{2}}\sum_{x_{i}\in R_{2}}(y_{i}-c_{2})^{2}
求解训练数据的切分点 s s R 1 = { x x s } , R 2 = { x x > s } R_{1}=\{x|x\leq s\}, R_{2}=\{x|x>s\} 。容易求得在 R 1 , R 2 R_{1},R_{2} 内部使平方误差达到最小值的 c 1 , c 2 c_{1},c_{2} 为:
c 1 = 1 N 1 x i R 1 y i , c 2 = 1 N 2 x i R 2 y i c_{1}=\frac{1}{N_{1}}\sum_{x_{i}\in R_{1}}y_{i},c_{2}=\frac{1}{N_{2}}\sum_{x_{i}\in R_{2}}y_{i}

根据所给的数据,考虑如下的切分点: 1.5 , 2.5 , 3.5 , 4.5 , 5.5 , 6.5 , 7.5 , 8.5 , 9.5 1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5
例如:当 s = 1.5 , R 1 = { 1 } R 2 = { 2 , 3 , . . . , 10 } , c 1 = 5.56 , c 2 = 7.50 , m ( s ) = 15.72 s=1.5时,R_{1}=\{1\},R_{2}=\{2,3,...,10\},c_{1}=5.56,c_{2}=7.50,m(s)=15.72
现将 s s m ( 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 s=6.5 时, m ( s ) m(s) 达到最小值,此时 R 1 = { 1 , 2 , . . . , 6 } , R 2 = { 7 , 8 , 9 , 10 } , c 1 = 6.24 , c 2 = 8.91 R_{1}=\{1,2,...,6\},R_{2}=\{7,8,9,10\},c_{1}=6.24,c_{2}=8.91 ,所以回归树 f 1 ( x ) = { 6.24 , x < 6.5 8.91 , x 6.5 f_{1}(x)=\left\{\begin{matrix} 6.24,x<6.5\\ 8.91,x\geq 6.5 \end{matrix}\right.
f 1 ( x ) f_{1}(x) 拟合训练数据的残差如下表所示: r 2 i = y i f 1 ( x i ) r_{2i}=y_{i}-f_{1}(x_{i})

x x 1 2 3 4 5 6 7 8 9 10
r 2 i 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 ) F_{1}(x) 拟合训练数据的平方损失误差: L ( y , F 1 ( x ) ) = i = 1 10 ( y i F 1 ( x i ) ) 2 = 1.93 L(y,F_{1}(x))=\sum_{i=1}^{10}(y_{i}-F_{1}(x_{i}))^{2}=1.93
采用与上面相同的方法拟合残差数据: f 2 ( x ) = { 0.52 , x < 3.5 0.22 , x 3.5 f_{2}(x)=\left\{\begin{matrix} -0.52, x<3.5\\ 0.22, x \geq 3.5 \end{matrix}\right.

依次类推可得:
f 3 ( x ) = { 0.15 , x < 6.5 0.22 , x 6.5 , f 4 ( x ) = { 0.16 , x < 4.5 0.11 , x 4.5 f_{3}(x)=\left\{\begin{matrix} 0.15, x<6.5\\ -0.22, x \geq 6.5 \end{matrix}\right.,f_{4}(x)=\left\{\begin{matrix} -0.16, x<4.5\\ 0.11, x \geq 4.5 \end{matrix}\right.
f 5 ( x ) = { 0.07 , x < 6.5 0.11 , x 6.5 , f 6 ( x ) = { 0.15 , x < 2.5 0.04 , x 2.5 f_{5}(x)=\left\{\begin{matrix} 0.07, x<6.5\\ -0.11, x \geq 6.5 \end{matrix}\right.,f_{6}(x)=\left\{\begin{matrix} -0.15, x<2.5\\ 0.04, x \geq 2.5 \end{matrix}\right.
F 6 ( x ) = F 5 ( x ) + f 6 ( x ) = f 1 ( x ) + f 2 ( x ) + . . . + f 6 ( x ) = { 5.63 , x < 2.5 5.82 , 2.5 x < 3.5 6.56 , 3.5 x < 4.5 6.83 , 4.5 x < 6.5 8.95 , x 6.5 F_{6}(x)=F_{5}(x)+f_{6}(x)=f_{1}(x)+f_{2}(x)+...+f_{6}(x)=\left\{\begin{matrix} 5.63,x<2.5\\ 5.82,2.5\leq x <3.5\\ 6.56,3.5\leq x <4.5\\ 6.83,4.5\leq x <6.5\\ 8.95,x \geq 6.5 \end{matrix}\right.
F 6 ( x ) F_{6}(x) 拟合训练数据的平方损失函数误差是: L ( y , F 6 ( x ) ) = i = 1 10 L ( y i , F 6 ( x i ) ) = 0.17 L(y,F_{6}(x))=\sum_{i=1}^{10}L(y_{i},F_{6}(x_{i}))=0.17
假设此时已满足误差要求,那么 F 6 ( x ) F_{6}(x) 就是所求的提升树。

梯度提升

提升树利用加法模型和前向分步算法实现学习的优化过程。当损失函数为平方损失函数和指数损失函数时,每一步的优化很容易实现,但对一般的损失函数而言,优化困难。Freidman提出了梯度提升方法(gradient boosting),利用损失函数的负梯度在当前模型的值:
[ L ( y i , F ( x i ) ) F ( x i ) ] F ( x ) = F m 1 ( x ) -[\frac{\partial{L(y_{i},F(\mathbf{x}_{i}))}}{\partial{F({\mathbf{x}_{i}})}}]_{F({\mathbf{x}})=F_{m-1}(\mathbf x)}
作为回归问题提升树中残差的近似值来优化。
梯度提升的一般框架
对于第 m m 步, ( β m , a m ) = arg min β , a i = 1 N L ( y i , F m 1 ( x i ) + β h ( x i ; a ) ) (\beta_{m},a_{m})=\arg \min_{\beta,a}\sum_{i=1}^{N}L(y_{i},F_{m-1}(\mathbf{x}_{i})+\beta h(\mathbf{x}_{i};a))
上述的误差可能很难去直接优化,不妨先通用的求解梯度:
g m ( x i ) = [ L ( y i , F ( x i ) ) F ( x i ) ] F ( x ) = F m 1 ( x ) -g_{m}(\mathbf{x}_{i})=-[\frac{\partial{L(y_{i},F(\mathbf{x}_{i}))}}{\partial{F({\mathbf{x}_{i}})}}]_{F({\mathbf{x}})=F_{m-1}(\mathbf x)}
我们先把 F m 1 ( x i ) F_{m-1}({\mathbf{x}_{i}}) 看做一个整体,也就是一个参数。求解梯度后,我们通常会这样更新: F m ( x i ) = F m 1 ( x i ) g m ( x i ) F_{m}({\mathbf{x}_{i}})=F_{m-1}({\mathbf{x}_{i}})-g_{m}(\mathbf{x}_{i})
此时, F m ( x i ) F_{m}({\mathbf{x}_{i}}) 就要比 F m 1 ( x i ) F_{m-1}({\mathbf{x}_{i}}) 更优。但是我们的目的是要得到如下而不是更新 F ( x i ) F({\mathbf{x}_{i}}) F m ( x i ) = F m 1 ( x i ) + β h ( x i ; a ) F_{m}({\mathbf{x}_{i}})=F_{m-1}({\mathbf{x}_{i}})+\beta h(\mathbf{x}_{i};a)
所以新组合得到的分类器就要去拟合负梯度:
a m = arg min a , β i = 1 N [ g m ( x i ) β h ( x i ; a ) ] 2 a_{m}=\arg \min_{a,\beta}\sum_{i=1}^{N}[-g_{m}(\mathbf{x}_{i})-\beta h(\mathbf{x}_{i};a)]^{2}
β m \beta_{m} 无需求解的原因是下面求解的 ρ m \rho_{m} 可能会比其更优:
ρ m = arg min ρ i = 1 N L ( y i , F m 1 ( x i ) + ρ h ( x i ; a m ) ) \rho_{m}=\arg\min_{\rho}\sum_{i=1}^{N}L(y_{i},F_{m-1}(\mathbf{x}_{i})+\rho h(\mathbf{x}_{i};a_{m}))
更新组合分类器:
F m ( x i ) = F m 1 ( x i ) + ρ m h ( x i ; a m ) ) F_{m}(\mathbf{x}_{i})=F_{m-1}(\mathbf{x}_{i})+\rho_{m} h(\mathbf{x}_{i};a_{m}))
框架伪代码:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/winycg/article/details/83475579