GBDT 原理讲解

 

个人认为讲解的最好的一篇GBDT入门文章 转载地址:https://www.cnblogs.com/ScorpioLu/p/8296994.html

从提升树出发,——》回归提升树、二元分类、多元分类三个GBDT常见算法。

  • 提升树
  • 梯度提升树
    • 回归提升树
    • 二元分类
    • 多元分类 
  • 面经

 

提升树

在说GBDT之前,先说说提升树(boosting tree)。说到提升(boosting),总是绕不过AdaBoost

AdaBoost是利用前一轮迭代的误差率来更新训练集的权重,校正前一轮迭代被错误分类的样本,通俗一点的理解就是将重心放在分错的样本上。提升树也是boosting家族的成员,意味着提升树也采用加法模型(基学习器线性组合)和前向分步算法。

下面一个一个进行解释,提升树的基学习器是什么,加法模型和前向分步算法又是怎么用的。

提升树通常以决策树作为基学习器,对分类问题决策树是二叉分类树,回归问题就是二叉回归树。

加法模型,就是说提升树可以表示为以下形式:这里我们约定 T(x;Θm)T(x;Θm)表示第m棵决策树;ΘmΘm表示决策树的参数;MM为树的个数。强分类器fM(x)fM(x)可以由多个弱分类器T(x;Θm)T(x;Θm)线性相加而成。

 

fM(x)=∑m=1MT(x;Θm)fM(x)=∑m=1MT(x;Θm)

提升树的前向分步算法。第m步的模型可以写成:

 

fm(x)=fm−1(x)+T(x;Θm)fm(x)=fm−1(x)+T(x;Θm)

然后得到损失函数

 

L(fm(x),y)=L(fm−1(x)+T(x;Θm),y)L(fm(x),y)=L(fm−1(x)+T(x;Θm),y)

迭代的目的是构建T(x;Θm)T(x;Θm),使得本轮损失L(fm(x),y)L(fm(x),y)最小。思想其实并不复杂,但是问题也很明显,对于不同的任务会有不同的损失函数,当损失函数是平方损失和指数损失函数时,每一步的优化还是简单的。但是对于一般损失函数而言,每一步的优化并不容易。

 

 

梯度提升树

下面关于GBDT的理解来自论文greedy function approximation: a gradient boosting machine

  1. 损失函数的数值优化可以看成是在函数空间,而不是在参数空间。
  2. 损失函数L(y,F)L(y,F)包含平方损失(y−F)2(y−F)2,绝对值损失|y−F||y−F|用于回归问题,负二项对数似然log(1+e−2yF)log⁡(1+e−2yF),y∈{-1,1}用于分类。
  3. 关注点是预测函数的加性扩展。

最关键的点在于损失函数的数值优化可以看成是在函数空间而不是参数空间。怎么理解呢?

首先,我们已经知道强分类器是由多个弱分类器线性相加而成,那么可以写成如下形式:

 

F(x;{βm,am}M1)=∑m=1Mβmh(x;am)F(x;{βm,am}1M)=∑m=1Mβmh(x;am)

这里的h(x;am)h(x;am)指代回归树,例如CART。amam是模型参数,这里指代每个节点的分裂特征(变量),最佳分割点,节点的预测值。MM就是有多少个弱分类器。

然后,我们来回顾一下参数空间的数值优化。假设预测函数为F(x;P)F(x;P),那么损失函数就可以写成:

 

ϕ(P)=L(y,F(x,P))ϕ(P)=L(y,F(x,P))

优化以后得到的参数最优解为:

 

P =argminPϕ(P)P =argminPϕ(P)

回想一下SGD(随机梯度下降)的优化方式,从山顶上选择梯度下降最快的方向挪动最优步长。我们是不是可以把最优参数表达成这个形式?

 

P =∑m=0MpmP =∑m=0Mpm

 

pm=−ρmgmpm=−ρmgm

从初始值p0p0开始,mm对应每一步更新迭代,负梯度−gm−gm就是最速下降方向,ρmρm就是在这个最速下降方向上进行线搜索得到的最优步长。

好了,现在我们说说函数空间的优化方法。

将预测函数F(x)F(x)对应参数PP,最优解变成了:

 

F(x)=∑m=0Mfm(x)F(x)=∑m=0Mfm(x)

相当于在函数空间上作梯度下降。每一步梯度下降:

 

fm(x)=−ρmgm(x)fm(x)=−ρmgm(x)

 

gm(x)=[−∂ϕ(F(x))∂F(x)]F(x)=Fm−1(x)gm(x)=[−∂ϕ(F(x))∂F(x)]F(x)=Fm−1(x)

 

Fm−1(x)=∑i=0m−1fi(x)Fm−1(x)=∑i=0m−1fi(x)

现在把这个思想代入到gradient boosting,我们之前已经得到预测函数为:

 

F(x;{βm,am}M1)=∑m=1Mβmh(x;am)F(x;{βm,am}1M)=∑m=1Mβmh(x;am)

需要做的事情是得到预测函数的最优解,就是:

 

{βm,am}M1=argmin{βm,am}M1L(y,∑m=1Mβmh(x;am))=argminβm,amL(y,Fm−1(x)+βmhm(x;am)){βm,am}1M=argmin{βm,am}1ML(y,∑m=1Mβmh(x;am))=argminβm,amL(y,Fm−1(x)+βmhm(x;am))

已知最速梯度下降方向为gm(x)=[−∂ϕ(F(x))∂F(x)]F(x)=Fm−1(x)gm(x)=[−∂ϕ(F(x))∂F(x)]F(x)=Fm−1(x),每一个hm(x;am)hm(x;am)都建立在最速梯度下降的方向,我们可以得到:

 

am=argminβm,am[−gm(x)−βmhm(x;am)]2am=argminβm,am[−gm(x)−βmhm(x;am)]2

可以认为是用hm(x;a)hm(x;a)去拟合伪标签y~=−gm(x)y~=−gm(x)。这里为什么用最小二乘,我的理解是GBDT构造的树全是回归树,因此用最小二乘。

然后进行线搜索确定最优步长ρmρm:

 

ρm=argminρmL(y,Fm−1(x)+ρmhm(x;am))ρm=argminρmL(y,Fm−1(x)+ρmhm(x;am))

 

Fm(x)=Fm−1(x)+ρmhm(x;am)Fm(x)=Fm−1(x)+ρmhm(x;am)


ok,现在来整理整个算法流程:

  1. 初始化:F0(x)=argmixρ∑Ni=1L(yi,ρ)F0(x)=argmixρ∑i=1NL(yi,ρ) ,NN表示样本量
  2. For m=1m=1 to MM do:end for
    1. y~=−[∂ϕ(F(x))∂F(x)]F(x)=F(m−1)(x),i=1,2,……,Ny~=−[∂ϕ(F(x))∂F(x)]F(x)=F(m−1)(x),i=1,2,……,N 
    2. am=argminβ,a∑Ni=1[y~−βhm(xi;a)]2am=argminβ,a∑i=1N[y~−βhm(xi;a)]2 
    3. ρm=argminρ∑Ni=1L(yi,Fm−1(xi)+ρhm(xi;am))ρm=argminρ∑i=1NL(yi,Fm−1(xi)+ρhm(xi;am)) 
    4. Fm(x)=Fm−1(x)+ρmhm(x;am)Fm(x)=Fm−1(x)+ρmhm(x;am) 

 

回归提升树

当基学习器h(x;a)h(x;a)是一个包含J个节点的回归树时,可以写成:

 

h(x;a)=h(x;{cj,Rj}J1)=∑j=1JcjI(X∈Rj)h(x;a)=h(x;{cj,Rj}1J)=∑j=1JcjI(X∈Rj)

写完公式发现原来可以写的这么复杂,简单点说就是,对于回归树hh,如果xx被归到某个叶子节点RjRj,那么xx在这个hh中得到的预测值就是叶子节点RjRj的值cjcj。一般用叶子节点上 {xi∈Rj}J1{xi∈Rj}1J的{y~i}J1{y~i}1J平均值近似节点RjRj的值

 

cj=avexi∈Rjy~icj=avexi∈Rjy~i

{Rj}J1{Rj}1J是不相交的区域,集合覆盖预测值的空间。{cj}J1{cj}1J可以认为是回归树hh的系数。什么意思?我们回想一下线性回归,预测函数是θTxθTx,这个θθ就是模型系数。同样的,也可以这么理解{cj}J1{cj}1J,是回归树hh的系数。

ok,现在我们已经得到了回归提升树的预测函数:

 

Fm(x)=Fm−1(x)+ρm∑j=1Jcm,jI(x∈Rj)Fm(x)=Fm−1(x)+ρm∑j=1Jcm,jI(x∈Rj)

令γm,j=ρmcm,jγm,j=ρmcm,j,这个值是叶子节点的最理想的常数更新值,也可以认为兼顾了下降方向和下降步长。

综上,整理一下回归提升树的整个算法流程:

  • 输入:训练数据集T={(x1,y1),(x2,y2),……,(xN,yN)}T={(x1,y1),(x2,y2),……,(xN,yN)},迭代次数MM
  • 1. 初始化:F0(x)=argminρ∑Ni=1L(y,ρ)F0(x)=argminρ∑i=1NL(y,ρ) ,NN表示样本量
  • 2. For m=1m=1 to MM do:
    • (a) 计算损失函数在当前模型Fm−1(x)Fm−1(x)的负梯度值:

 

y~=−[∂ϕ(F(x))∂F(x)]F(x)=Fm−1(x)=yi−Fm−1(xi),i=1,2,……,Ny~=−[∂ϕ(F(x))∂F(x)]F(x)=Fm−1(x)=yi−Fm−1(xi),i=1,2,……,N

    • (b) 根据y~iy~i学习得到了第mm棵回归树,对应的叶节点区域为{Rj}J1{Rj}1J
    • (c) γm,j=argminγ∑xi∈Rm,jL(yi,Fm−1(xi)+γ)γm,j=argminγ∑xi∈Rm,jL(yi,Fm−1(xi)+γ)
    • (d) 得到本轮最佳拟合决策树为:

 

hm(x;a)=∑j=1Jγm,jI(x∈Rm,j)hm(x;a)=∑j=1Jγm,jI(x∈Rm,j)

    • (e) 得到本次迭代得到的强学习器:

 

Fm(x)=Fm−1(x)+∑j=1Jγm,jI(x∈Rm,j)Fm(x)=Fm−1(x)+∑j=1Jγm,jI(x∈Rm,j)

  • 3.结束迭代之后的强学习器为:     

 

FM(x)=∑m=1M∑j=1Jγm,jI(x∈Rm,j)FM(x)=∑m=1M∑j=1Jγm,jI(x∈Rm,j)

当当当~看到第3点,我们发现损失函数在当前模型Fm−1(x)Fm−1(x)的负梯度值刚刚好是y−Fm−1(x)y−Fm−1(x),也就是我们常说的残差!看到这里有没有很激动?这不就是我们常说的GBDT是在拟合前几轮迭代的残差吗?

下面给出证明:

令当前的预测函数模型为Fm−1(x)Fm−1(x),下一棵要学习的回归树为hm(x;a)hm(x;a),则下一步要学习的预测函数为:

 

Fm(x)=Fm−1(x)+hm(x;am)Fm(x)=Fm−1(x)+hm(x;am)

回归提升树的损失函数为平方损失:

 

Loss=L(Fm(x),y)=12(Fm(x)−y)2Loss=L(Fm(x),y)=12(Fm(x)−y)2

对Fm(x)Fm(x)求关于amam的偏导:

 

∂Loss∂am=(Fm(x)−y)=Fm−1(x)+hm(x;am)−y∂Loss∂am=(Fm(x)−y)=Fm−1(x)+hm(x;am)−y

我们要使经验风险极小化,令偏导为0:

 

hm(x;am)=y−Fm−1(x)hm(x;am)=y−Fm−1(x)

也就是说,构建的回归树要去拟合前面的残差,得证。可以这么理解,GBDT是在函数空间的梯度下降求最优值,当损失函数为平方损失时,恰好去拟合了残差。

下面给一个简单的例子方便理解,现在要通过购物金额和上网时长来预测年龄。假设有5个训练样本,标签分别14,17,13,25,27。第m轮迭代,通过前几轮的残差构建决策树,得到预测函数Fm(x)Fm(x)的预测年龄分别为16,15,12,19,29,计算残差-2,2,1,6,-2。第m+1轮迭代,就去学习这个残差,通俗一点说就是以残差作为第i+1轮迭代构建决策树的标签。


二元分类

我们使用负二项对数似然作为损失函数:

 

L(y,F)=log(1+exp(−2yF)),y∈{1,1}L(y,F)=log(1+exp(−2yF)),y∈{1,1}

其中,F(x)=12log[P(y=1|x)P(y=−1|x)]F(x)=12log[P(y=1|x)P(y=−1|x)]

看这个公式有没有很熟悉?是的,这个负二项对数似然可以推到逻辑回归的损失函数。

我们知道逻辑回归的预测函数为:

 

P(y=1|x)=11+exp(−θTx),y∈{0,1}P(y=1|x)=11+exp(−θTx),y∈{0,1}

我们知道这里的负样本y=-1对应于逻辑回归里的负样本y=0,所以有:

 

F(x)=12log[P(y=1|x)P(y=−1|x)]=12log[P(y=1|x)P(y=0|x)]=12θTxF(x)=12log[P(y=1|x)P(y=−1|x)]=12log[P(y=1|x)P(y=0|x)]=12θTx

将上式代入L(y,F)L(y,F),可得L(y,F)=log(1+exp(−2yF))=log(1+exp(−yθTx)),y∈{−1,1}L(y,F)=log(1+exp(−2yF))=log(1+exp(−yθTx)),y∈{−1,1}

当y=1时,L(y,F)=log(1+exp(−θTx))=ylog(1+exp(−θTx))=ylog(P(y=1|x))L(y,F)=log⁡(1+exp⁡(−θTx))=ylog⁡(1+exp⁡(−θTx))=ylog(P(y=1|x))

当y=-1时,L(y,F)=log(1+exp(θTx))=log(1−P(y=1|x))L(y,F)=log⁡(1+exp⁡(θTx))=log⁡(1−P(y=1|x))

令yy←0,L(y,F)=(1−y)log(1−P(y=1|x))L(y,F)=(1−y)log(1−P(y=1|x))

结合在一起,可以写成:

 

L(y,F)=ylog(P(y=1|x))+(1−y)log(1−P(y=1|x)),y∈{0,1}L(y,F)=ylog(P(y=1|x))+(1−y)log(1−P(y=1|x)),y∈{0,1}

与逻辑回归损失函数一致,得证。

预测函数Fm−1(x)Fm−1(x)的当前负梯度值,也可以说是伪响应y~y~为:

 

y~=−[∂L(F(x),y)∂F(x)]F(x)=Fm−1(x)=2y1+exp(2yFm−1(x))y~=−[∂L(F(x),y)∂F(x)]F(x)=Fm−1(x)=2y1+exp(2yFm−1(x))

我们仍然将回归树作为基学习器,进行线搜索得到最优叶子节点值:

 

γm,j=argminy∑x∈Rm,jlog(1+(−2y(Fm−1(x)+γ)))γm,j=argminy∑x∈Rm,jlog(1+(−2y(Fm−1(x)+γ)))

一看这个公式就知道计算量不是一般的大,我们用[Newton-Raphson近似][2],得到:

 

γm,j=∑x∈Rm,jy~i∑x∈Rm,j|y~i|(2−|y~|)γm,j=∑x∈Rm,jy~i∑x∈Rm,j|y~i|(2−|y~|)

总结一下算法流程如下:

  • 1. 初始化:F0(x)=argmixρ∑Ni=1L(y,ρ)F0(x)=argmixρ∑i=1NL(y,ρ) ,NN表示样本量
  • 2. For m=1m=1 to MM do:3. end For
    • (a) y~i=2yi1+exp(2yiFm−1(xi)),i=1,2,……,Ny~i=2yi1+exp(2yiFm−1(xi)),i=1,2,……,N
    • (b) 根据y~iy~i学习得到了第m棵回归树,对应的叶节点区域为{Rj}J1{Rj}1J 
    • (c) γm,j=∑x∈Rm,jy~i∑x∈Rm,j|y~i|(2−|yi~|)γm,j=∑x∈Rm,jy~i∑x∈Rm,j|y~i|(2−|yi~|) 
    • (d) Fm(x)=Fm−1(x)+∑Jj=1γm,jI(x∈Rm,j)Fm(x)=Fm−1(x)+∑j=1Jγm,jI(x∈Rm,j)
  •  

最后,我们得到了预测函数FM(x)FM(x),用来进行概率估计:

 

P(y=1|x)=p=e2F(x)1+e2F(x)=11+e−2F(x)P(y=1|x)=p=e2F(x)1+e2F(x)=11+e−2F(x)

 

P(y=−1|x)=1−p=11+e2F(x)P(y=−1|x)=1−p=11+e2F(x)

有了概率之后,我们可以对样本进行分类。

 

多元分类

我们使用多分类log损失作为损失函数:

 

L(y,F)=−∑k=1Kyklogpk(x)L(y,F)=−∑k=1Kyklogpk(x)

对应的概率pk(x)pk(x)为(就是softmax):

 

pk(x)=eFk(x)∑Kl=1eFl(x)pk(x)=eFk(x)∑l=1KeFl(x)

对于多分类问题,在构建基学习器时,我们要为每个类别k创建一棵回归树Fk(x),k=1,2,……,KFk(x),k=1,2,……,K

 

y~i,k=yi,k−pk,m−1(xi)y~i,k=yi,k−pk,m−1(xi)

因此,每次迭代m,以概率角度来计算当前残差。

叶子节点值近似为:

 

γm,j=K−1K∑x∈Rm,jy~i∑x∈Rm,j|y~i|(2−|y~|)γm,j=K−1K∑x∈Rm,jy~i∑x∈Rm,j|y~i|(2−|y~|)

 


面经

  1. GBDT为什么是在拟合前面几轮的残差?请公式推导。
  2. SVM为什么要比GBDT好?(这个问题有点奇怪,但是面试官真的是这么问的(微笑脸),因为我简历里写了用SVM做分类,面试官就问为什么不用GBDT,SVM比GBDT好在哪里?……)这个问题我至今不知道答案,请大神赐教。
  3. GBDT和LR的差别。(这个问题可以推广的,和AdaBoost、RF、XgBoost,etc的差别)
  4. 在你所知的算法中,哪个抗噪能力最强?哪个对采样不敏感?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值