GBT/Xgboost/Lightgbm 之 GBT

本文深入解析了提升树(boosting tree)的概念,包括前向学习、回归提升树及其实现过程。详细介绍了GBT(Gradient Boosting Tree)、GBRT(梯度提升回归树)和GBDT(梯度提升决策树)的算法原理,以及它们在工程实践中的应用技巧,如学习率调整、随机梯度提升和模型复杂度控制。

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

  • GDT
  • Xgboost
  • Lightgbm
    三种算法都是boosting的一种:每个模型间相互依赖,下一个模型修改上一个模型的错误

1 提升树(boosting tree)

采用加法模型和前向分步算法实现学习的优化过程。

  • 对分类问题,基本学习器是二叉决策树;
  • 对回归问题,基本学习器是二叉回归树。
    f ( x ) = f m ( x ) = ∑ m = 1 M h m ( x ∣ Θ m ) f(x) = f_m(x) = \sum_{m=1}^M h_m(x|\Theta_m) f(x)=fm(x)=m=1Mhm(xΘm)
  • M是决策树的数量
1.1前向学习
  • 确定初始提升树 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0
  • 每一轮训练增加一个学习器,在第m轮学习中
    f m ( x ) = f m − 1 ( x ) + h m ( x ∣ Θ m ) f_m(x) = f_{m-1}(x) + h_m(x|\Theta_m) fm(x)=fm1(x)+hm(xΘm)
    通过损失函数极小化确定下一棵树的参数 Θ m \Theta_m Θm(这里并没有正则化)
    Θ ^ m = arg ⁡ min ⁡ Θ m ∑ i = 1 n L ( y i , f m − 1 ( x ) + h m ( x ∣ Θ m ) ) \hat \Theta_m = \arg \min_{\Theta_m} \sum_{i=1}^n L(y_i, f_{m-1}(x) + h_m(x|\Theta_m)) Θ^m=argΘmmini=1nL(yi,fm1(x)+hm(xΘm))
  • 输出最终学习器: f ( x ) = f m ( x ) = ∑ m = 1 M h m ( x ∣ Θ m ) f(x) = f_m(x) = \sum_{m=1}^M h_m(x|\Theta_m) f(x)=fm(x)=m=1Mhm(xΘm)
1.2对于回归提升树
  • 最终输出模型
    h ( x , Θ ) = ∑ j = 1 J c j I ( x ∈ R j ) h(x,\Theta) = \sum_{j=1}^J c_j I(x\in R_j) h(x,Θ)=j=1JcjI(xRj)
    其中J是最终叶节点数目, c j c_j cj是叶节点的最终取值, R j R_j Rj是叶节点的样本集划分)
  • 损失函数是square loss:
    l ( y i , y ^ i ) = ( y i − y ^ i ) 2 l(y_i,\hat y_i) = (y_i-\hat y_i)^2 l(yi,y^i)=(yiy^i)2
  • 每轮循环最小化损失函数得到最佳参数 Θ m \Theta_m Θm
    L ( y , f m ( x ) ) = L ( y , f m − 1 ( x ) + h m ( x ∣ Θ m ) ) = ( y − f m ( x ) ) 2 = [ y − f m − 1 ( x ) − h m ( x ∣ Θ m ) ] 2 = [ r − h m ( x ∣ Θ m ) ] 2 \begin{aligned} L(y,f_m(x)) &= L(y,f_{m-1}(x) + h_m(x|\Theta_m))\\ &=(y-f_m(x))^2 \\ &= [y-f_{m-1}(x) - h_m(x|\Theta_m)]^2 \\ &=[r-h_m(x|\Theta_m)]^2 \end{aligned} L(y,fm(x))=L(y,fm1(x)+hm(xΘm))=(yfm(x))2=[yfm1(x)hm(xΘm)]2=[rhm(xΘm)]2
    其中 r = y − f m − 1 ( x ) r = y-f_{m-1}(x) r=yfm1(x),是当前模型拟合数据的残差。
    每轮用当前的残差学习新的回归树。

损失函数不是平方损失时

  • 回归问题中,损失函数是平方损失和指数损失时,优化简单(因为求导简单)。但对于一般的损失函数而言,优化并不简单。
  • 但不仅是提升树,其他的boosting回归算法,也是拟合当前模型的残差。只是拟合残差的方法不同

2. GBT,Gradient Boosting Tree,梯度提升树

提升树中,损失函数是平方损失时,用残差 r = y − f m − 1 ( x ) r=y-f_{m-1}(x) r=yfm1(x)拟合m轮的树。
当损失函数是一般函数时,Freidman提出,梯度提升算法。

2.1 梯度提升算法

用损失函数的负梯度来拟合本轮残差的近似值,从而拟合新的回归树。
对损失函数一阶泰勒展开:
L ( y , f m ( x ) ) = L ( y , f m − 1 ( x ) + T ( x ∣ Θ m ) ) = L ( y , f m − 1 ( x ) ) + ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) h m ( x ∣ Θ m ) \begin{aligned} L(y,f_m(x)) &= L(y,f_{m-1}(x) + T(x|\Theta_m))\\ &= L(y,f_{m-1}(x)) + \frac{\partial L(y,f_{m-1}(x)) }{ \partial f_{m-1}(x)} h_m(x|\Theta_m) \end{aligned} L(y,fm(x))=L(y,fm1(x)+T(xΘm))=L(y,fm1(x))+fm1(x)L(y,fm1(x))hm(xΘm)
得到
Δ L = L ( y , f m ( x ) ) − L ( y , f m − 1 ( x ) = ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) h m ( x ∣ Θ m ) \Delta L = L(y,f_m(x)) - L(y,f_{m-1}(x) = \frac{\partial L(y,f_{m-1}(x)) }{ \partial f_{m-1}(x)} h_m(x|\Theta_m) ΔL=L(y,fm(x))L(y,fm1(x)=fm1(x)L(y,fm1(x))hm(xΘm)
每轮拟合回归树使,我们希望损失函数极小化,降低损失函数, Δ L &lt; 0 \Delta L &lt;0 ΔL<0,那么 h m ( x ∣ Θ m ) = − ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) h_m(x|\Theta_m) = - \frac{\partial L(y,f_{m-1}(x)) }{ \partial f_{m-1}(x)} hm(xΘm)=fm1(x)L(y,fm1(x))就是一个可选项。

  • 对于平方损失函数,它就是残差 y − f m − 1 ( x ) y-f_{m-1}(x) yfm1(x)
  • 对于一般的损失函数,它就是残差的近似
2.2 GBRT,梯度提升回归树
  • (1)初始化:一个只有根节点的树,使损失函数极小化的常数值
    f 0 ( x ) = a r g min ⁡ c ∑ i = 1 N L ( y i , c ) f_0(x) = arg\min_c \sum_{i=1}^NL(y_i,c) f0(x)=argcmini=1NL(yi,c)
  • (2)对m=1,2,…,M(迭代次数)
    • (a)对i=1,2,…,N计算(每个样本)
      r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi} = -\Bigg[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}\Bigg] _{f(x) = f_{m-1}(x)} rmi=[f(xi)L(yi,f(xi))]f(x)=fm1(x)
      对于平方损失函数,此值即为残差;对于一般的损失函数,即为残差的近似值
    • (b)对 r m i r_{mi} rmi拟合一个回归树,得到第m棵树的叶节点区域 R m j , j = 1 , 2 , ⋯ &ThinSpace; , J R_{mj},j=1,2,\cdots,J Rmj,j=1,2,,J得到的仅仅是节点区域而非参数值
      假设 L = [ y i − f ( x i ) ] 2 L=[y_i - f(x_i)]^2 L=[yif(xi)]2 ; 残差为 − 2 ( y i − f ( x 1 ) ) -2(y_i-f(x_1)) 2(yif(x1)),公式前有系数,近似代表残差,不等同于残差,因此需要根据(c )步计算 c m c_m cm
    • (c )对 j = 1 , 2 , ⋯ &ThinSpace; , J j=1,2,\cdots,J j=1,2,,J,计算每个区域 R m , j R_{m,j} Rm,j的输出值
      c m j = a r g min ⁡ c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{mj} = arg\min_c \sum_{x_i \in R_{mj}}L(y_i,f_{m-1}(x_i) + c) cmj=argcminxiRmjL(yi,fm1(xi)+c)
      利用线性搜索估计叶节点区域的值,使损失函数极小化
    • (d)更新 f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x ∈ R m j ) f_m(x) = f_{m-1}(x) + \sum_{j=1}^Jc_{mj}I(x\in R_{mj}) fm(x)=fm1(x)+j=1JcmjI(xRmj)
  • 得到回归树
    f ( x ) ^ = f M ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x ∈ R m j ) \hat{f(x)} = f_M(x) = \sum_{m=1}^M\sum_{j=1}^Jc_{mj}I(x\in R_{mj}) f(x)^=fM(x)=m=1Mj=1JcmjI(xRmj)
    对于对于每个样本值,在每棵树上只有1个区域内事情函数不为0,此函数最终只有M项
2.3 GBDT,梯度提升决策树

算法和GBRT类似,主要是损失函数不同。

2.4 工程应用
  • 会设置一个学习率(shrink)来更新模型
    f m ( x ) = f m − 1 ( x ) + λ h m ( x , Θ m ) , 0 &lt; λ &lt; 1 f_m(x)= f_{m-1}(x) + \lambda h_m(x,\Theta_m),0&lt; \lambda&lt;1 fm(x)=fm1(x)+λhm(x,Θm),0<λ<1
    它可以降低模型的更新速度。和基本学习器的数量会有一个trade-off
  • 可以用随机梯度提升
    在每轮迭代时,新的决策树拟合的是原始训练集的子集的残差,这个子集是对源数据无放回采样得到。这个采样比率在[0.5,0.8]之间结果较好,可以防止过拟合。
  • 可以限制回归树中每次分裂时考虑的特征最大数目
  • 可以限制每棵树叶节点包含的最少样本数、每棵树的最大深度等

具体调节可以参考sklearn.ensemble.GradientBoostingClassifer


参考:大神的 《AI算法工程师手册》,李航老师的《统计学习方法》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值