一文看懂提升树与梯度提升树(GBDT)

1 提升方法与提升树概述

之前讲到的 AdaBoost 是提升方法中最典型的算法思路之一,提升方法则采用加法模型(基函数的线性组合)与前向分步算法,而 AdaBoost 只是将损失函数指定为指数损失函数的提升方法而已。提升树是以分类树或回归树为基本分类器的提升方法。其被认为是统计学习中性能最好的方法之一。

实际上,AdaBoost 更多的是一种算法思路,其并没有指定基函数是决策树还是其他。

对于分类问题,提升树的基决策树是二叉分类树;对于回归问题,提升树的基决策树是二叉回归树。提升树模型可以表示为决策树的加法模型:
f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_M(x) = \sum_{m=1}^MT(x;\Theta_m) fM(x)=m=1MT(x;Θm)
其中, T ( x ; Θ m ) T(x;\Theta_m) T(x;Θm) 表示决策树, Θ m \Theta_m Θm 为决策树的参数, M M M 为树的个数。

2 二分类提升树

对于二类分类问题,提升树算法只需将 AdaBoost 算法中的基本分类器限制为二类分类树即可,即基分类器均为只有一个根节点,两个叶子节点的分类树。此时的提升树算法是 Adaboost 算法的特殊情况。首先回顾一下 AdaBoost 算法:
f ( x ) = ∑ m = 1 M α m G m ( x ) = α 1 G 1 ( x ) + α 2 G 2 ( x ) + ⋯ + α M G M ( x ) \begin{aligned} f(x) &= \sum_{m=1}^M \alpha_mG_m(x)\\ &= \alpha_1G_1(x) + \alpha_2G_2(x) + \cdots + \alpha_MG_M(x) \end{aligned} f(x)=m=1MαmGm(x)=α1G1(x)+α2G2(x)++αMGM(x)
二分类提升树的 G m ( x ) ​ G_m(x)​ Gm(x) 均为二类分类树, α m ​ \alpha_m​ αm 均为 1。即:
f ( x ) = T ( x ; Θ 1 ) + T ( x ; Θ 2 ) + ⋯ + T ( x ; Θ M ) f(x) = T(x;\Theta_1) + T(x;\Theta_2) + \cdots + T(x;\Theta_M) f(x)=T(x;Θ1)+T(x;Θ2)++T(x;ΘM)
总模型为
G ( x ) = { 1 ,     f ( x ) ≤ k − 1 , f ( x ) > k G(x) = \begin{cases} 1,\ \ \ f(x)\le k\\ -1,f(x)\gt k \end{cases} G(x)={ 1,   f(x)k1,f(x)>k
二分类提升树的损失函数仍是指数损失函数,只要用指数损失函数,就可以进行调整样本数据的权值,从而让每个基分类器学到不同的样本内容。

3 回归问题的提升树

假设有训练集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } T=\{ (x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N) \} T={(x1,y1),(x2,y2),,(xN,yN)} x i ∈ X ⊆ R n x_i\in X \subseteq \Bbb R^n xiXRn X X X 为输入空间, y i ∈ Y ⊆ R y_i\in Y \subseteq \Bbb R yiYR Y Y Y 为输出空间。根据回归树理论,如果将输入空间 X X X 划分为 J J J 个互不相交的区域 R 1 , R 2 , ⋯   , R J R_1,R_2,\cdots,R_J R1,R2,,RJ,并且在每个区域上确定输出的常量 c j c_j cj ,那么树可以表示为:
T ( x ; Θ ) = ∑ j = 1 J c j I ( x ∈ R j ) T(x;\Theta) = \sum_{j=1}^Jc_jI(x\in R_j) T(x;Θ)=j=1JcjI(xRj)
其中,参数 Θ = { ( R 1 , c 1 ) , ( R 2 , c 2 ) , ⋯ ( R J , c J ) } \Theta = \{ (R_1,c_1),(R_2,c_2),\cdots(R_J,c_J) \} Θ={(R1,c1),(R2,c2),(RJ,cJ)} 表示树的区域划分和各区域上的常数。 J J J 是回归树的复杂度即叶节点个数。

回归问题提升树使用以下前向分步算法:
f 0 ( x ) = 0 f m ( x ) = f m − 1 ( x ) + T ( x ; Θ m ) ,   m = 1 , 2 , ⋯   , M f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) \begin{aligned} &f_0(x) = 0\\ &f_m(x) = f_{m-1}(x) + T(x;\Theta_m),\ m=1,2,\cdots,M\\ &f_M(x) = \sum_{m=1}^MT(x;\Theta_m) \end{aligned} f0(x)=0fm(x)=fm1(x)+T(x;Θm), m=1,2,,MfM(x)=m=1MT(x;Θm)
在前向分步算法的第 m ​ m​ m 步,给定当前模型 f m − 1 ( x ) ​ f_{m-1}(x)​ fm1(x),需求解
Θ ^ m = arg ⁡ min ⁡ Θ m ∑ i = 1 N L ( y i , f m − 1 ( x i ) + T ( x i ; Θ m ) ) \hat\Theta_m=\arg\min_{\Theta_m}\sum_{i=1}^NL\big(y_i,f_{m-1}(x_i)+T(x_i;\Theta_m)\big) Θ^m=argΘmmini=1NL(yi,fm1(xi)+T(xi;Θm))
得到 Θ ^ m \hat\Theta_m Θ^m ,即第 m m m 棵树的参数。

当采用平方误差损失函数时,
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 i , f m − 1 ( x i ) + T ( x i ; Θ m ) ) ​ L\big(y_i,f_{m-1}(x_i)+T(x_i;\Theta_m)\big)​ L(yi,fm1(xi)+T(xi;Θm)) 演化为:
L ( y i , f m − 1 ( x i ) + T ( x i ; Θ m ) ) = [ y − f m − 1 ( x i ) − T ( x i ; Θ m ) ] 2 = [ r − T ( x i ; Θ m ) ] 2 \begin{aligned} L\big(y_i,f_{m-1}(x_i)+T(x_i;\Theta_m)\big) &= [y-f_{m-1}(x_i)-T(x_i;\Theta_m)]^2\\ &= [r-T(x_i;\Theta_m)]^2 \end{aligned} L(yi,fm1(xi)+T(xi;Θm))=[yfm1(xi)T(xi;Θm)]2=[rT(xi;Θm)]2
上式中 r = y − f m − 1 ( x i ) r = y-f_{m-1}(x_i) r=yfm1(xi) ,即 m − 1 m-1 m1 轮所得模型的残差。因此对于回归问题的提升树算法来说,若采用平方误差损失函数,只需简单地拟合当前模型的残差,就能够选出第 m ​ m​ m 棵树的参数,进而得到完整模型。

m m m 棵树应尽可能地拟合当前模型的残差,这样随着 M M M 的增大,整体模型将越来越逼近真实值( L ( y , y ^ ) L(y,\hat y) L(y,y^) 的值越来越小)。

回归问题的提升树基本思路即用残差去训练个体学习器,然后将所有个体学习器相加,这也是为什么要将 f 0 ( x ) = 0 f_0(x) = 0 f0(x)=0 的原因,即 f 0 f_0 f0 y y y 的残差就是 y y y 本身。

4 回归问题的梯度提升树

提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数式平方损失和指数损失函数时,每一步优化是很简单的。但对于一般的损失函数而言,往往每一步优化并不那么容易。针对这一问题, Freidman 提出了梯度提升(gradient boosting)算法。它是一种前向分步算法、采用梯度提升进行每一步的优化,基学习器被限定为回归树的提升系列算法。它的目的是当使用除平方损失函数外的其他损失函数或自定义损失函数时,以一种简单通用的形式求解:
Θ ^ m = arg ⁡ min ⁡ Θ m ∑ i = 1 N L ( y i , f m − 1 ( x i ) + T ( x i ; Θ m ) ) . \hat\Theta_m=\arg\min_{\Theta_m}\sum_{i=1}^NL\big(y_i,f_{m-1}(x_i)+T(x_i;\Theta_m)\big). Θ^m=argΘmmini=1NL(yi,fm1(xi)+T(xi;Θm)).
这个式子在上一节中已经提到,解它可以在已知 m − 1 m-1 m1 轮模型时得到第 m m m 棵树的参数 Θ ^ m \hat\Theta_m Θ^m

对于任意损失函数,我们该如何像普通的回归问题提升树那样仅使用残差来进行拟合呢?我们需要来点核心前提:

  • 模型存在多个优化器,不断地迭代优化;
  • 确保每增加一个基学习器,都要使得总体损失越来越小。

对于第二点,可以使用数学公式表达
L ( y , f m ( x ) ) < L ( y , f m − 1 ( x ) ) . L(y,f_m(x))\lt L(y,f_{m-1}(x)). L(y,fm(x))<L(y,fm1(x)).
即:
L ( y , f m − 1 ( x ) ) − L ( y , f m ( x ) ) > 0. L(y,f_{m-1}(x))-L(y,f_m(x))\gt 0. L(y,fm1(x))L(y,fm(x))>0.
核心前提有了,我们尝试对损失函数进行一些改造。

已知一阶泰勒展开为
f ( x ) ≈ f ( x 0 ) + f ( x 0 ) ′ ( x − x 0 ) f(x) \approx f(x_0) + f(x_0)'(x-x_0) f(x)f(x0)+f(x0)(xx0)
L ( y , f m ( x ) ) ​ L(y,f_m(x))​ L(y,fm(x)) 的一阶泰勒展开为:
L ( y , f m ( x ) ) ≈ L ( y , f m − 1 ( x ) ) + ∂ L ( y , f ( x ) ) ∂ f ( x ) ∣ f ( x ) = f m − 1 ( x ) ⋅ ( f m ( x ) − f m − 1 ( x ) ) ≈ L ( y , f m − 1 ( x ) ) + ∂ L ( y , f ( x ) ) ∂ f ( x ) ∣ f ( x ) = f m − 1 ( x ) ⋅ T ( x , Θ m ) \begin{aligned} L(y,f_m(x)) &\approx L\big(y,f_{m-1}(x)\big) + \frac{\partial L(y,f(x))}{\partial f(x)}\Bigg|_{f(x)=f_{m-1}(x)} \cdot \big(f_m(x)-f_{m-1}(x)\big)\\ &\approx L\big(y,f_{m-1}(x)\big) + \frac{\partial L(y,f(x))}{\partial f(x)}\Bigg|_{f(x)=f_{m-1}(x)} \cdot T(x,\Theta_m) \end{aligned} L(y,fm(x))L(y,fm1(x))+f(x)L(y,f(x)) f(x)=fm1(x)(fm(x)fm1(x))L(y,fm1(x))+f(x)L(y,f(x)) f(x)=fm1(x)T(x,Θm)
将上式移项,得:
L ( y , f m − 1 ( x ) ) − L ( y , f m ( x ) ) ≈ − ∂ L ( y , f ( x ) ) ∂ f ( x ) ∣ f ( x ) = f m − 1 ( x ) ⋅ T ( x , Θ m ) L\big(y,f_{m-1}(x)\big) - L\big(y,f_m(x)\big) \approx -\frac{\partial L(y,f(x))}{\partial f(x)}\Bigg|_{f(x)=f_{m-1}(x)} \cdot T(x,\Theta_m) L(y,fm1(x))L(y,fm(x))f(x)L(y,f(x)) f(x)=fm1(x)T(x,Θm)
当令 T ( x , Θ m ) ≈ − ∂ L ( y , f ( x ) ) ∂ f ( x ) ∣ f ( x ) = f m − 1 ( x ) ​ T(x,\Theta_m) \approx -\frac{\partial L(y,f(x))}{\partial f(x)}\Big|_{f(x)=f_{m-1}(x)}​ T(x,Θm)f(x)L(y,f(x)) f(x)=fm1(x) 时,可以令我们第二个的核心前提成立,即:
L ( y , f m − 1 ( x ) ) − L ( y , f m ( x ) ) ≥ 0. L(y,f_{m-1}(x))-L(y,f_m(x))\ge 0. L(y,fm1(x))L(y,fm(x))0.
也就是说,此时
L ( y , f m − 1 ( x ) ) ≥ L ( y , f m ( x ) ) . L(y,f_{m-1}(x))\ge L(y,f_m(x)). L(y,fm1(x))L(y,fm(x)).
这说明,如果令 T ( x , Θ m ) ≈ − ∂ L ( y , f ( x ) ) ∂ f ( x ) ∣ f ( x ) = f m − 1 ( x ) ​ T(x,\Theta_m) \approx -\frac{\partial L(y,f(x))}{\partial f(x)}\Big|_{f(x)=f_{m-1}(x)}​ T(x,Θm)f(x)L(y,f(x)) f(x)=fm1(x) ,则加上一个基决策树后,损失不可能增大,只会不变或减小。

于是令 r m ( x , y ) = − ∂ L ( y , f ( x ) ) ∂ f ( x ) ∣ f ( x ) = f m − 1 ( x ) r_m(x,y) = -\frac{\partial L(y,f(x))}{\partial f(x)}\Big|_{f(x)=f_{m-1}(x)} rm(x,y)=f(x)L(y,f(x)) f(x)=fm1(x) ,将 ( x i , y i ) (x_i,y_i) (xi,yi) 代入 r m ( x , y ) r_m(x,y) rm(x,y) ,得相应的 r m i r_{mi} rmi。进而新一轮基树的训练数据集为:
T m = { ( x 1 , r m 1 ) , ( x 2 , r m 2 ) , ⋯   , ( x N , r m N ) } . T_m = \{(x_1,r_{m1}),(x_2,r_{m2}),\cdots,(x_N,r_{mN})\}. Tm={(x1,rm1),(x2,rm2),,(xN,rmN)}.

4.1 计算步骤

如果是回归问题,预测就会相对简单很多,因为输出的残差值本身就是数值型的。GBDT 回归算法的损失函数就有比较多的选择了,例如平方损失函数、绝对值损失函数、Huber 损失函数和分位数回归损失函数,这些损失函数都可以非常方便地进行一阶导函数的计算。这里不妨以平方损失函数为例,介绍 GBDT 回归算法的计算过程:

(1)初始化一棵仅包含根节点的树,并寻找到一个常数 Const 能够使损失函数达到极小值:
f 0 ( x ) = arg ⁡ 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)计算损失函数的负梯度值,用作残差的估计值,即:
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) = − [ ∂ 1 2 ( y i − f ( x i ) ) 2 ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) = y i − f ( x i ) \begin{aligned} r_{mi} &= -\Big[ \frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \Big]_{f(x)=f_{m-1}(x)}\\ &= -\Big[ \frac{\partial \frac12(y_i-f(x_i))^2}{\partial f(x_i)} \Big]_{f(x)=f_{m-1}(x)}\\ &= y_i-f(x_i) \end{aligned} rmi=[f(xi)L(yi,f(xi))]f(x)=fm1(x)=[f(xi)21(yif(xi))2]f(x)=fm1(x)=yif(xi)
(3)利用数据集 ( x i , r m i ) (x_i,r_{mi}) (xi,rmi) 拟和下一轮基础模型,得到对应的 J J J 个叶子节点 R m j R_{mj} Rmj j = 1 , 2 , ⋯   , J j = 1,2,\cdots,J j=1,2,,J;计算每个叶子节点 R m j R_{mj} Rmj 的最佳拟合值,用以估计残差 r m i r_{mi} rmi
f m ( x ) = ∑ j = 1 J c m j I ( x i ∈ R m j ) f_m(x) = \sum_{j=1}^Jc_{mj}I(x_i\in R_{mj}) fm(x)=j=1JcmjI(xiRmj)
其中, c m j = arg ⁡ min ⁡ c ∑ x i ∈ R m j 1 2 ( y i − ( f m − 1 ( x i ) + c ) ) 2 c_{mj}=\arg\min_c\sum_{x_i\in R_{mj}}\frac12(y_i-(f_{m-1}(x_i)+c))^2 cmj=argmincxiRmj21(yi(fm1(xi)+c))2

(4)重复(2)和(3),并利用 m m m 个基础模型,构建梯度提升模型:
f M ( x ) = f m − 1 ( x ) + f m ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x i ∈ R m j ) \begin{aligned} f_M(x) &= f_{m-1}(x) + f_m(x)\\ &=\sum_{m=1}^M\sum_{j=1}^Jc_{mj}I(x_i\in R_{mj}) \end{aligned} fM(x)=fm1(x)+fm(x)=m=1Mj=1JcmjI(xiRmj)
如上几个步骤中, c m j c_{mj} cmj 表示第 m m m 个基础模型 f m ( x ) f_m(x) fm(x) 在叶节点 j j j 上的预测值; f M ( x ) f_M(x) fM(x) 表示由 M M M 个基础模型构成的梯度提升树,它是每一个基础模型在样本点 x i x_i xi 处的输出值 c m j ​ c_{mj}​ cmj 之和。

5 分类问题的梯度提升树

当因变量为离散的类别变量时,无法直接利用各个类别值拟合残差 r m i ​ r_{mi}​ rmi(因为残差是连续的数值型)。为了解决这个问题,通常将 GBDT 算法的损失函数设置为指数损失函数或对数似然损失函数,进而可以实现残差的数值化。如果损失函数选择为指数损失函数,GBDT 算法实际上退化为 AdaBoost 算法;如果损失函数选择为交叉熵损失函数,GBDT 算法的残差类似于 Logistic 回归的交叉熵损失。

回顾逻辑回归:
Z = w 1 x 1 + w 2 x 2 + ⋯ + w N x N + b = w x + b . Z = w_1x_1+w_2x_2+\cdots + w_Nx_N+b = wx+b. Z=w1x1+w2x2++wNxN+b=wx+b.
预测值为:
y ^ = 1 1 + e − Z \hat y = \frac1{1+e^{-Z}} y^=1+eZ1
损失函数为:
J = − 1 m ∑ i = 1 m y ( i ) log ⁡ y ^ ( i ) + ( 1 − y ( i ) ) log ⁡ ( 1 − y ( i ) ) J = -\frac1m\sum_{i=1}^my^{(i)}\log \hat y^{(i)} + (1-y^{(i)})\log(1-y^{(i)}) J=m1i=1my(i)logy^(i)+(1y(i))log(1y(i))
其核心是通过 Sigmoid 函数,将二分类问题转变为 0 ∼ 1 ​ 0\sim1​ 01​ 概率分布问题。

分类问题梯度提升树的损失函数的演化——以交叉熵损失函数为例
L ( y , y ^ ) = − y log ⁡ y ^ − ( 1 − y ) log ⁡ ( 1 − y ^ ) = − y log ⁡ 1 1 + e f M ( x ) − ( 1 − y ) log ⁡ ( 1 − 1 1 + e − f M ( x ) ) = − y ( log ⁡ 1 − log ⁡ ( 1 + e − f M ( x ) ) ) − ( 1 − y ) log ⁡ ( e − f M ( x ) 1 + e − f M ( x ) ) = − y ( log ⁡ 1 − log ⁡ ( 1 + e − f M ( x ) ) ) − ( 1 − y ) ( log ⁡ e − f M ( x ) − log ⁡ ( 1 + e − f M ( x ) ) ) = y log ⁡ ( 1 + e − f M ( x ) ) − log ⁡ e − f M ( x ) + log ⁡ ( 1 + e − f M ( x ) ) + y log ⁡ e − f M ( x ) − y log ⁡ ( 1 + e − f M ( x ) ) = f M ( x ) − y f M ( x ) + log ⁡ ( 1 + e − f M ( x ) ) = log ⁡ ( 1 + e − f M ( x ) ) + ( 1 − y ) f M ( x ) \begin{aligned} L(y,\hat y) &= -y\log\hat y - (1-y)\log(1-\hat y)\\ &= -y\log\frac1{1+e^{f_M(x)}} - (1-y)\log(1-\frac1{1+e^{-f_M(x)}})\\ &= -y\big(\log1-\log(1+e^{-f_M(x)})\big)-(1-y)\log(\frac{e^{-f_M(x)}}{1+e^{-f_M(x)}})\\ &= -y\big(\log1-\log(1+e^{-f_M(x)})\big)-(1-y)\big(\log e^{-f_M(x)} - \log(1+e^{-f_M(x)})\big)\\ &= y\log(1+e^{-f_M(x)}) - \log e^{-f_M(x)} + \log(1+e^{-f_M(x)}) + y\log e^{-f_M(x)} - y\log(1+e^{-f_M(x)})\\ &= f_M(x) - yf_M(x) + \log(1+e^{-f_M(x)})\\ &= \log(1+e^{-f_M(x)}) + (1-y)f_M(x) \end{aligned} L(y,y^)=ylogy^(1y)log(1y^)=ylog1+efM(x)1(1y)log(11+efM(x)1)=y(log1log(1+efM(x)))(1y)log(1+efM(x)efM(x))=y(log1log(1+efM(x)))(1y)(logefM(x)log(1+efM(x)))=ylog(1+efM(x))logefM(x)+log(1+efM(x))+ylogefM(x)ylog(1+efM(x))=fM(x)yfM(x)+log(1+efM(x))=log(1+efM(x))+(1y)fM(x)
综上,在选择第 m ​ m​ m 棵树时,分类问题梯度提升树的损失函数为:
L ( y , f m ( x ) ) = log ⁡ ( 1 + e − f m ( x ) ) + ( 1 − y ) f m ( x ) L(y,f_m(x)) = \log(1+e^{-f_m(x)}) + (1-y)f_m(x) L(y,fm(x))=log(1+efm(x))+(1y)fm(x)
计算负梯度
∂ L ( y , f m ( x ) ) ∂ f m ( x ) = ∂ log ⁡ ( 1 + e − f m ( x ) ) ∂ f m ( x ) + 1 − y = ∂ log ⁡ ( 1 + e − f m ( x ) ) ∂ ( 1 + e − f m ( x ) ) × ∂ ( 1 + e − f m ( x ) ) ∂ e − f m ( x ) × ∂ e − f m ( x ) ∂ f m ( x ) + 1 − y = 1 1 + e − f m ( x ) × 1 × ( − e − f m ( x ) ) + 1 − y = − e − f m ( x ) 1 + e − f m ( x ) + 1 − y = 1 1 + e − f m ( x ) − y \begin{aligned} \frac{\partial L(y,f_m(x))}{\partial f_m(x)} &= \frac{\partial\log(1+e^{-f_m(x)})}{\partial f_m(x)} + 1 - y\\ &= \frac{\partial\log(1+e^{-f_m(x)})}{\partial(1+e^{-f_m(x)})}\times \frac{\partial(1+e^{-f_m(x)})}{\partial e^{-f_m(x)}}\times\frac{\partial e^{-f_m(x)}}{\partial f_m(x)} + 1 - y\\ &= \frac1{1+e^{-f_m(x)}}\times1\times(-e^{-f_m(x)}) + 1 - y\\ &= -\frac{e^{-f_m(x)}}{1+e^{-f_m(x)}} +1 -y\\ &= \frac1{1+e^{-f_m(x)}} - y \end{aligned} fm(x)L(y,fm(x))=fm(x)log(1+efm(x))+1y=(1+efm(x))log(1+efm(x))×efm(x)(1+efm(x))×fm(x)efm(x)+1y=1+efm(x)1×1×(efm(x))+1y=1+efm(x)efm(x)+1y=1+efm(x)1y

− ∂ L ( y , f m ( x ) ) ∂ f m ( x ) = y − 1 1 + e − f m ( x ) -\frac{\partial L(y,f_m(x))}{\partial f_m(x)} = y - \frac1{1+e^{-f_m(x)}} fm(x)L(y,fm(x))=y1+efm(x)1
因此
r m ( x , y ) = − ∂ L ( y , f ( x ) ) ∂ f ( x ) ∣ f ( x ) = f m − 1 ( x ) = y − 1 1 + e − f m − 1 ( x ) = y − y ^ \begin{aligned} r_m(x,y) &= -\frac{\partial L(y,f(x))}{\partial f(x)}\Bigg|_{f(x)=f_{m-1}(x)}\\ &= y - \frac1{1+e^{-f_{m-1}(x)}}\\ &= y - \hat y \end{aligned} rm(x,y)=f(x)L(y,f(x)) f(x)=fm1(x)=y1+efm1(x)1=yy^
所以, r m i = y i − y ^ m − 1 , i r_{mi} = y_i - \hat y_{m-1,i} rmi=yiy^m1,i

T m = { ( x 1 , r m 1 ) , ( x 2 , r m 2 ) , ⋯   , ( x N , r m N ) } T_m = \{(x_1,r_{m1}),(x_2,r_{m2}),\cdots,(x_N,r_{mN})\} Tm={(x1,rm1),(x2,rm2),,(xN,rmN)} 作为训练集训练第 m m m 轮基树。

5.1 计算步骤

(1)初始化一棵仅包含根节点的树,并寻找到一个常数 Const 能够使损失函数达到极小值:
f 0 ( x ) = arg ⁡ 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)计算损失函数的负梯度值,用作残差的估计值,即:
r m ( x , y ) = − ∂ L ( y , f ( x ) ) ∂ f ( x ) ∣ f ( x ) = f m − 1 ( x ) = y − 1 1 + e − f m − 1 ( x ) = y − y ^ \begin{aligned} r_m(x,y) &= -\frac{\partial L(y,f(x))}{\partial f(x)}\Bigg|_{f(x)=f_{m-1}(x)}\\ &= y - \frac1{1+e^{-f_{m-1}(x)}}\\ &= y - \hat y \end{aligned} rm(x,y)=f(x)L(y,f(x)) f(x)=fm1(x)=y1+efm1(x)1=yy^

如果使用对数似然损失函数 L = ∑ i = 1 N log ⁡ ( 1 + e − y i f ( x i ) ) L = \sum_{i=1}^N\log(1+e^{-y_if(x_i)}) L=i=1Nlog(1+eyif(xi)),则:
r m i ( x , y ) = y i 1 + e − y i f ( x i ) . r_{mi}(x,y) = \frac{y_i}{1+e^{-y_if(x_i)}}. rmi(x,y)=1+eyif(xi)yi.

(3)利用数据集 ( x i , r m i ) ​ (x_i,r_{mi})​ (xi,rmi) 拟合下一轮基础模型:
f m ( x ) = ∑ j = 1 J c m j I ( x i ∈ R m j ) f_m(x) = \sum_{j=1}^Jc_{mj}I(x_i\in R_{mj}) fm(x)=j=1JcmjI(xiRmj)
其中, c m j = arg ⁡ min ⁡ c ∑ x i ∈ R m j log ⁡ ( 1 + e − f m ( x i ) ) + ( 1 − y ) f m ( x i ) c_{mj} = \arg\min_c\sum_{x_i\in R_{mj}}\log(1+e^{-f_m(x_i)}) + (1-y)f_m(x_i) cmj=argmincxiRmjlog(1+efm(xi))+(1y)fm(xi)

(4)重复(2)和(3),并利用 m m m 个基础模型,构建梯度提升模型:
f M ( x ) = f M − 1 ( x ) + f m ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x i ∈ R m j ) \begin{aligned} f_M(x) &= f_{M-1}(x) + f_m(x)\\ &=\sum_{m=1}^M\sum_{j=1}^Jc_{mj}I(x_i\in R_{mj}) \end{aligned} fM(x)=fM1(x)+fm(x)=m=1Mj=1JcmjI(xiRmj)

猜你喜欢

转载自blog.csdn.net/meng_xin_true/article/details/128790593