梯度提升树(GBDT)

提升树模型

提升树是以分类数或回归树为基本分类器的提升方法。提升方法实际采用加法模型(即基函数的线性组合)与前向分布算法,以决策树为基函数的提升方法为提升树(boosting tree)。基本分类器 x &lt; v x&lt;v x<v x &gt; v x&gt;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}) Fm(x)=t=1mf(x;θt)
其中 f ( x ; θ j ) f(\mathbf x;\theta_{j}) f(x;θj)为第 j j j棵决策树, θ j \theta_{j} θj为参数。
提升树采用前向分布算法,确定初始提升树 f 0 ( x ) = 0 f_{0}(\mathbf{x})=0 f0(x)=0,第 m 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}) Fm(x)=Fm1(x)+f(x;θm)
其中, F m − 1 ( x ) F_{m-1}(\mathbf x) Fm1(x)为前 m − 1 m-1 m1个决策树组成的集成分类器,通过最小化经验风险来确定第 m 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)) θm=argθmini=1NL(yi,Fm1(xi)+f(xi;θ))
不同问题的提升树算法,主要区别是使用的损失函数不同。对于二分类问题,提升树算法是AdaBoost算法的特殊情况。这里叙述回归问题的提升树。
已知训练集 { ( x i , y i ) } 1 N \{(\mathbf{x}_{i},y_{i})\}_{1}^{N} {(xi,yi)}1N,如果将输入空间划分为 J J J个不相交的区域 R 1 , R 2 , . . . , R J R_{1},R_{2},...,R_{J} R1,R2,...,RJ,并且每个区域确定输出的常量 c j c_{j} cj,树可表示为: 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}) f(x;θ)=j=1JcjI(xRj)
其中,参数 θ = { ( R j , c j ) } 1 N \theta=\{(R_{j},c_{j})\}_{1}^{N} θ={(Rj,cj)}1N表示树的区域划分和区域的常数值。 J J J是回归树的复杂度,即叶节点的个数。
当误差函数为平方损失误差为: L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L(y,f(x))=(y-f(x))^{2} L(y,f(x))=(yf(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} L(y,Fm1(x)+f(x;θ))=L[yFm1(x)f(x;θ)]2=[rf(x;θ)]2
r = y − F m − 1 ( x ) r=y-F_{m-1}(\mathbf{x}) r=yFm1(x)是当前模型拟合数据的残差(residual)。所以,回归问题的提升树算法只需要拟合当前模型的残差。
回归问题的提升树算法:
输入:训练数据集 { ( x i , y i ) } 1 N \{(\mathbf{x}_{i},y_{i})\}_{1}^{N} {(xi,yi)}1N
输出:提升树 F M ( x ) F_{M}(\mathbf{x}) FM(x)
初始化 f 0 ( x ) = 0 f_{0}(\mathbf{x})=0 f0(x)=0
m = 1 , 2 , . . . , M 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 rmi=yiFm1(xi),i=1,2,...,N
---------拟合残差学习一个回归树,得到回归树 f ( x ; θ m ) f(\mathbf{x;\theta_{m}}) f(x;θ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}}) Fm(x)=Fm1(x)+f(x;θm)
最终得到的回归提升树: F M ( x ) = ∑ m = 1 M f ( x ; θ m ) F_{M}(\mathbf{x})=\sum_{m=1}^{M}f(\mathbf{x};\theta_{m}) FM(x)=m=1Mf(x;θm)
例子: 学习这个回归问题的提升树模型,考虑只用树桩做为基函数。

x12345678910
y5.565.705.916.406.807.058.908.709.009.05

第一步求回归树 f 1 ( x ) f_{1}(x) f1(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} m(s)=c1minxiR1(yic1)2+c2minxiR2(yic2)2
求解训练数据的切分点 s s s R 1 = { x ∣ x ≤ s } , R 2 = { x ∣ x &gt; s } R_{1}=\{x|x\leq s\}, R_{2}=\{x|x&gt;s\} R1={xxs},R2={xx>s}。容易求得在 R 1 , R 2 R_{1},R_{2} R1,R2内部使平方误差达到最小值的 c 1 , c 2 c_{1},c_{2} c1,c2为:
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} c1=N11xiR1yi,c2=N21xiR2yi

根据所给的数据,考虑如下的切分点: 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 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=1.5,R1={1}R2={2,3,...,10},c1=5.56,c2=7.50,m(s)=15.72
现将 s s s m ( s ) m(s) m(s)的计算结果列表如下:

s1.52.53.54.55.56.57.58.59.5
m(s)15.7212.078.365.783.911.938.0111.7315.74

由上表可知,当 s = 6.5 s=6.5 s=6.5时, m ( s ) 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 R1={1,2,...,6},R2={7,8,9,10},c1=6.24,c2=8.91,所以回归树 f 1 ( x ) = { 6.24 , x &lt; 6.5 8.91 , x ≥ 6.5 f_{1}(x)=\left\{\begin{matrix} 6.24,x&lt;6.5\\ 8.91,x\geq 6.5 \end{matrix}\right. f1(x)={6.24,x<6.58.91,x6.5
f 1 ( x ) f_{1}(x) f1(x)拟合训练数据的残差如下表所示: r 2 i = y i − f 1 ( x i ) r_{2i}=y_{i}-f_{1}(x_{i}) r2i=yif1(xi)

x x x12345678910
r 2 i r_{2i} r2i-0.68-0.54-0.330.160.560.81-0.01-0.210.090.14

F 1 ( x ) F_{1}(x) F1(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 L(y,F1(x))=i=110(yiF1(xi))2=1.93
采用与上面相同的方法拟合残差数据: f 2 ( x ) = { − 0.52 , x &lt; 3.5 0.22 , x ≥ 3.5 f_{2}(x)=\left\{\begin{matrix} -0.52, x&lt;3.5\\ 0.22, x \geq 3.5 \end{matrix}\right. f2(x)={0.52,x<3.50.22,x3.5

依次类推可得:
f 3 ( x ) = { 0.15 , x &lt; 6.5 − 0.22 , x ≥ 6.5 , f 4 ( x ) = { − 0.16 , x &lt; 4.5 0.11 , x ≥ 4.5 f_{3}(x)=\left\{\begin{matrix} 0.15, x&lt;6.5\\ -0.22, x \geq 6.5 \end{matrix}\right.,f_{4}(x)=\left\{\begin{matrix} -0.16, x&lt;4.5\\ 0.11, x \geq 4.5 \end{matrix}\right. f3(x)={0.15,x<6.50.22,x6.5,f4(x)={0.16,x<4.50.11,x4.5
f 5 ( x ) = { 0.07 , x &lt; 6.5 − 0.11 , x ≥ 6.5 , f 6 ( x ) = { − 0.15 , x &lt; 2.5 0.04 , x ≥ 2.5 f_{5}(x)=\left\{\begin{matrix} 0.07, x&lt;6.5\\ -0.11, x \geq 6.5 \end{matrix}\right.,f_{6}(x)=\left\{\begin{matrix} -0.15, x&lt;2.5\\ 0.04, x \geq 2.5 \end{matrix}\right. f5(x)={0.07,x<6.50.11,x6.5,f6(x)={0.15,x<2.50.04,x2.5
F 6 ( x ) = F 5 ( x ) + f 6 ( x ) = f 1 ( x ) + f 2 ( x ) + . . . + f 6 ( x ) = { 5.63 , x &lt; 2.5 5.82 , 2.5 ≤ x &lt; 3.5 6.56 , 3.5 ≤ x &lt; 4.5 6.83 , 4.5 ≤ x &lt; 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&lt;2.5\\ 5.82,2.5\leq x &lt;3.5\\ 6.56,3.5\leq x &lt;4.5\\ 6.83,4.5\leq x &lt;6.5\\ 8.95,x \geq 6.5 \end{matrix}\right. F6(x)=F5(x)+f6(x)=f1(x)+f2(x)+...+f6(x)=5.63,x<2.55.82,2.5x<3.56.56,3.5x<4.56.83,4.5x<6.58.95,x6.5
F 6 ( x ) F_{6}(x) F6(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 L(y,F6(x))=i=110L(yi,F6(xi))=0.17
假设此时已满足误差要求,那么 F 6 ( x ) F_{6}(x) F6(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)} [F(xi)L(yi,F(xi))]F(x)=Fm1(x)
作为回归问题提升树中残差的近似值来优化。
梯度提升的一般框架
对于第 m 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)) (βm,am)=argβ,amini=1NL(yi,Fm1(xi)+βh(xi;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)} gm(xi)=[F(xi)L(yi,F(xi))]F(x)=Fm1(x)
我们先把 F m − 1 ( x i ) F_{m-1}({\mathbf{x}_{i}}) Fm1(xi)看做一个整体,也就是一个参数。求解梯度后,我们通常会这样更新: 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}) Fm(xi)=Fm1(xi)gm(xi)
此时, F m ( x i ) F_{m}({\mathbf{x}_{i}}) Fm(xi)就要比 F m − 1 ( x i ) F_{m-1}({\mathbf{x}_{i}}) Fm1(xi)更优。但是我们的目的是要得到如下而不是更新 F ( x i ) F({\mathbf{x}_{i}}) F(xi) 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) Fm(xi)=Fm1(xi)+βh(xi;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} am=arga,βmini=1N[gm(xi)βh(xi;a)]2
β m \beta_{m} βm无需求解的原因是下面求解的 ρ m \rho_{m} ρ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})) ρm=argρmini=1NL(yi,Fm1(xi)+ρh(xi;am))
更新组合分类器:
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})) Fm(xi)=Fm1(xi)+ρmh(xi;am))
框架伪代码:
在这里插入图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页