梯度提升树(GBDT)

本文深入解析了提升树模型,一种以决策树为基分类器的增强算法。文章详细阐述了模型构建过程,包括前向分步算法、损失函数优化及梯度提升策略,通过实例演示了如何使用树桩构建回归提升树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提升树模型

提升树是以分类数或回归树为基本分类器的提升方法。提升方法实际采用加法模型(即基函数的线性组合)与前向分布算法,以决策树为基函数的提升方法为提升树(boosting tree)。基本分类器x&lt;vx&lt;vx<vx&gt;vx&gt;vx>v,可以看作是一个根结点直接连接两个叶结点的简单决策树,也就是单层决策树,称为决策树桩(decision stump)。提升树模型可以表达为决策树的加法模型:Fm(x)=∑t=1mf(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)为第jjj棵决策树,θj\theta_{j}θj为参数。
提升树采用前向分布算法,确定初始提升树f0(x)=0f_{0}(\mathbf{x})=0f0(x)=0,第mmm次提升的模型为:Fm(x)=Fm−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)
其中,Fm−1(x)F_{m-1}(\mathbf x)Fm1(x)为前m−1m-1m1个决策树组成的集成分类器,通过最小化经验风险来确定第mmm棵树的参数:
θm=arg⁡min⁡θ∑i=1NL(yi,Fm−1(xi)+f(xi;θ))\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算法的特殊情况。这里叙述回归问题的提升树。
已知训练集{(xi,yi)}1N\{(\mathbf{x}_{i},y_{i})\}_{1}^{N}{(xi,yi)}1N,如果将输入空间划分为JJJ个不相交的区域R1,R2,...,RJR_{1},R_{2},...,R_{J}R1,R2,...,RJ,并且每个区域确定输出的常量cjc_{j}cj,树可表示为:f(x;θ)=∑j=1JcjI(x∈Rj)f(\mathbf{x};\theta)=\sum_{j=1}^{J}c_{j}I(\mathbf{x}\in R_{j})f(x;θ)=j=1JcjI(xRj)
其中,参数θ={(Rj,cj)}1N\theta=\{(R_{j},c_{j})\}_{1}^{N}θ={(Rj,cj)}1N表示树的区域划分和区域的常数值。JJJ是回归树的复杂度,即叶节点的个数。
当误差函数为平方损失误差为:L(y,f(x))=(y−f(x))2L(y,f(x))=(y-f(x))^{2}L(y,f(x))=(yf(x))2
L(y,Fm−1(x)+f(x;θ))=L[y−Fm−1(x)−f(x;θ)]2=[r−f(x;θ)]2L(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−Fm−1(x)r=y-F_{m-1}(\mathbf{x})r=yFm1(x)是当前模型拟合数据的残差(residual)。所以,回归问题的提升树算法只需要拟合当前模型的残差。
回归问题的提升树算法:
输入:训练数据集{(xi,yi)}1N\{(\mathbf{x}_{i},y_{i})\}_{1}^{N}{(xi,yi)}1N
输出:提升树FM(x)F_{M}(\mathbf{x})FM(x)
初始化f0(x)=0f_{0}(\mathbf{x})=0f0(x)=0
m=1,2,...,Mm=1,2,...,Mm=1,2,...,M:
---------计算残差rmi=yi−Fm−1(xi),i=1,2,...,Nr_{mi}=y_{i}-F_{m-1}(\mathbf x_{i}),i=1,2,...,Nrmi=yiFm1(xi),i=1,2,...,N
---------拟合残差学习一个回归树,得到回归树f(x;θm)f(\mathbf{x;\theta_{m}})f(x;θm)
---------更新Fm(x)=Fm−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)
最终得到的回归提升树:FM(x)=∑m=1Mf(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

第一步求回归树f1(x)f_{1}(x)f1(x),通过以下优化问题:
m(s)=min⁡c1∑xi∈R1(yi−c1)2+min⁡c2∑xi∈R2(yi−c2)2m(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
求解训练数据的切分点sssR1={x∣x≤s},R2={x∣x&gt;s}R_{1}=\{x|x\leq s\}, R_{2}=\{x|x&gt;s\}R1={xxs},R2={xx>s}。容易求得在R1,R2R_{1},R_{2}R1,R2内部使平方误差达到最小值的c1,c2c_{1},c_{2}c1,c2为:
c1=1N1∑xi∈R1yi,c2=1N2∑xi∈R2yic_{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.51.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.51.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5
例如:当s=1.5时,R1={1},R2={2,3,...,10},c1=5.56,c2=7.50,m(s)=15.72s=1.5时,R_{1}=\{1\},R_{2}=\{2,3,...,10\},c_{1}=5.56,c_{2}=7.50,m(s)=15.72s=1.5,R1={1}R2={2,3,...,10},c1=5.56,c2=7.50,m(s)=15.72
现将sssm(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.5s=6.5s=6.5时,m(s)m(s)m(s)达到最小值,此时R1={1,2,...,6},R2={7,8,9,10},c1=6.24,c2=8.91R_{1}=\{1,2,...,6\},R_{2}=\{7,8,9,10\},c_{1}=6.24,c_{2}=8.91R1={1,2,...,6},R2={7,8,9,10},c1=6.24,c2=8.91,所以回归树f1(x)={6.24,x&lt;6.58.91,x≥6.5f_{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
f1(x)f_{1}(x)f1(x)拟合训练数据的残差如下表所示:r2i=yi−f1(xi)r_{2i}=y_{i}-f_{1}(x_{i})r2i=yif1(xi)

xxx12345678910
r2ir_{2i}r2i-0.68-0.54-0.330.160.560.81-0.01-0.210.090.14

F1(x)F_{1}(x)F1(x)拟合训练数据的平方损失误差:L(y,F1(x))=∑i=110(yi−F1(xi))2=1.93L(y,F_{1}(x))=\sum_{i=1}^{10}(y_{i}-F_{1}(x_{i}))^{2}=1.93L(y,F1(x))=i=110(yiF1(xi))2=1.93
采用与上面相同的方法拟合残差数据:f2(x)={−0.52,x&lt;3.50.22,x≥3.5f_{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

依次类推可得:
f3(x)={0.15,x&lt;6.5−0.22,x≥6.5,f4(x)={−0.16,x&lt;4.50.11,x≥4.5f_{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
f5(x)={0.07,x&lt;6.5−0.11,x≥6.5,f6(x)={−0.15,x&lt;2.50.04,x≥2.5f_{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
F6(x)=F5(x)+f6(x)=f1(x)+f2(x)+...+f6(x)={5.63,x&lt;2.55.82,2.5≤x&lt;3.56.56,3.5≤x&lt;4.56.83,4.5≤x&lt;6.58.95,x≥6.5F_{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
F6(x)F_{6}(x)F6(x)拟合训练数据的平方损失函数误差是:L(y,F6(x))=∑i=110L(yi,F6(xi))=0.17L(y,F_{6}(x))=\sum_{i=1}^{10}L(y_{i},F_{6}(x_{i}))=0.17L(y,F6(x))=i=110L(yi,F6(xi))=0.17
假设此时已满足误差要求,那么F6(x)F_{6}(x)F6(x)就是所求的提升树。

梯度提升

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值