梯度提升树GBDT详解


梯度提升树(Gradient Boosting Decison Tree, GBDT)是Boosting(提升)中的一种重要算法。

Adaboost算法利用前一轮迭代弱学习器的误差率来更新训练集的权重,训练得到新的基模型。在GBDT的迭代中,假设前一轮迭代得到的强学习器是 f t − 1 ( x ) f_{t-1}(x) ft1(x), 损失函数是 L ( y , f t − 1 ( x ) ) L(y, f_{t-1}(x)) L(y,ft1(x)), 本轮迭代的目标是找到一个CART回归树模型的弱学习器 h t ( x ) h_t(x) ht(x),让本轮的损失函数 L ( y , f t ( x ) ) = L ( y , f t − 1 ( x ) + h t ( x ) ) L(y, f_{t}(x)) =L(y, f_{t-1}(x)+ h_t(x)) L(y,ft(x))=L(y,ft1(x)+ht(x))最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。GBDT通过迭代不断地拟合损失。

梯度提升树(GBDT)

从回归提升树算法(boosting tree)可以看出当损失函数是平方损失函数和指数函数时,每一步优化很简单。但对于一般的损失函数,则采用梯度提升(gradient boosting)算法。

其核心思想是:利用损失函数的负梯度在当前模型的值:
− [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] -\left[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}\right] [f(xi)L(y,f(xi))]
作为回归问题提升树算法中的残差的近似值,拟合回归树。

为什么是负梯度拟合残差近似值?

我们的目标是找到一个 f ( x ) f(x) f(x)使得损失函数 L ( y i , f ( x i ) ) L(y_i, f(x_i)) L(yi,f(xi))的值最小,那么可以将 f ( x ) f(x) f(x)视为参数,使用梯度下降法进行优化。假设当前找到的 f ( x ) = f m − 1 ( x ) f(x)=f_{m-1}(x) f(x)=fm1(x),则根据梯度下降算法,第m轮的 f ( x ) m f(x)_m f(x)m的迭代公式如下:
f ( x ) m = f ( x ) m − 1 − ∂ L ( y i ,   f m − 1 ( x i ) ) ∂ f m − 1 ( x i ) f(x)_m=f(x)_{m-1}-\frac{\partial L(y_i,\,f_{m-1}(x_i))}{\partial f_{m-1}(x_i)} f(x)m=f(x)m1fm1(xi)L(yi,fm1(xi))
根据前向分步算法的加法模型有:
f ( x ) m = f ( x ) m − 1 + T ( x ; γ ) f(x)_m=f(x)_{m-1}+T(x;\gamma) f(x)m=f(x)m1+T(x;γ)
其中 T ( x ; γ ) = β b ( x i ; γ ) T(x;\gamma) =\beta b(x_i;\gamma) T(x;γ)=βb(xi;γ),是新一轮需要训练的树模型。对比上面两个式子,不难得到:
T ( x ; γ ) = − ∂ L ( y i ,   f m − 1 ( x i ) ) ∂ f m − 1 ( x i ) T(x;\gamma) =-\frac{\partial L(y_i,\,f_{m-1}(x_i))}{\partial f_{m-1}(x_i)} T(x;γ)=fm1(xi)L(yi,fm1(xi))
上面式子的左边为树的预测值,右边为真实值,所以整个过程就变成了每次拟合损失函数的负梯度的值:
r m i = − [ ∂ L ( y i ,   f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi}=-[\frac{\partial L(y_i,\,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)} rmi=[f(xi)L(yi,f(xi))]f(x)=fm1(x)
也就是说,通过拟合损失函数的负梯度值,就可以达到优化损失函数的目的。

上面的结论要求了损失函数必须一阶可导,因此损失函数的选择很重要。

回归梯度提升算法

输入: 训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } , x i ∈ χ ⊆ R n , y i ∈ y ⊆ R T=\{(x_1,y_1),(x_2,y_2) ,\dots,(x_N,y_N)\},x_i \in \chi \sube \R^n ,y_i \in y \sube \R T={(x1,y1),(x2,y2),,(xN,yN)},xiχRn,yiyR ;损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x))
输出:回归树 f ^ ( x ) \hat{f}(x) f^(x)
步骤:

  1. 初始化

f 0 ( x ) = arg ⁡ min ⁡ c ∑ i = 1 N L ( y i , c ) f_0(x)=\arg\min\limits_c\sum_{i=1}^NL(y_i, c) f0(x)=argcmini=1NL(yi,c)

  1. m = 1 , 2 , … , M m=1,2,\dots,M m=1,2,,M

(a)对 i = 1 , 2 , … , N i=1,2,\dots,N i=1,2,,N,计算
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi}=-\left[\frac{\partial L(y_i, f(x_i))}{\partial f(x_i)}\right]_{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 m m棵树的叶节点区域 R m j , j = 1 , 2 , … , J R_{mj}, j=1,2,\dots,J Rmj,j=1,2,,J

(c)对 j = 1 , 2 , … , J j=1,2,\dots,J j=1,2,,J
c m j = arg ⁡ min ⁡ c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{mj}=\arg\min_c\sum_{xi\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)

  1. 得到回归树

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步初始化,估计使损失函数极小化的常数值,它是只有一个根结点的树。

第2(a)步计算损失函数的负梯度在当前模型的值,将它作为残差的估计。对于平方损失函数,它就是通常所说的残差:对于一般损失函数,它就是残差的近似值。

第2(b)步估计回归树叶结点区域,以拟合残差的近似值。

第2©步利用线性搜索估计叶结点区域的值,使损失函数极小化。

第2(d)步更新回归树。

第3步得到输出的最终模型f(x)

分类梯度提升算法

因为GBDT是通过拟合损失函数负梯度来进行学习的,GBDT分类算法与GBDT回归不同之处在于由于样本的输出值是不连续的,无法从输出类别去拟合输出的误差。通过选择合适的损失函数来解决这个问题。GBDT分类常用的损失函数如下:

  • 指数损失
    L ( y , f ( x ) ) = e ( − y f ( x ) ) L(y,f(x))=e^{(-yf(x))} L(y,f(x))=e(yf(x))

  • 对数似然损失(二分类)
    L ( y , f ( x ) ) = l o g ( 1 + e ( − y f ( x ) ) ) L(y,f(x))=log\left(1+e^{(-yf(x))}\right) L(y,f(x))=log(1+e(yf(x)))

  • 对数似然损失(多分类)
    L ( y , f ( x ) ) = − ∑ k = 1 K y k   l o g   p k ( x ) L(y,f(x))=-\sum_{k=1}^Ky_k\,log\,p_k(x) L(y,f(x))=k=1Kyklogpk(x)

当使用指数损失函数,此时GBDT退化为AdaBoost算法。所以通常使用对数似然损失函数来拟合损失。

二分类GBDT算法

  • 输入:

    • 训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } , x i ∈ X ⊆ R n , y i ∈ Y = { − 1 , + 1 } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\},x_i\in X\subseteq R^n,y_i \in Y=\{-1,+1\} T={(x1,y1),(x2,y2),...,(xN,yN)},xiXRn,yiY={1,+1};损失函数 L ( y , f ( x ) ) = l o g ( 1 + e ( − y f ( x ) ) ) L(y,f(x))=log\left(1+e^{(-yf(x))}\right) L(y,f(x))=log(1+e(yf(x)));最大迭代次数 M M M
  • 输出:

    • 分类树 f ( x ) f(x) f(x)
  • 初始化弱学习器 f 0 ( x ) = arg ⁡ min ⁡ c ∑ i = 1 N L ( y i , c ) f_0(x)=\mathop{\arg\min}_{c}\sum_{i=1}^{N}L(y_i,c) f0(x)=argminci=1NL(yi,c)

  • m = 1 , 2 , . . . , M m=1,2,...,M m=1,2,...,M

    • i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N,计算损失函数在当前模型的负梯度:
      r m i = − [ ∂ L ( y i ,   f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) = y i 1 + e ( y i   f ( x i ) ) r_{mi}=-[\frac{\partial L(y_i,\,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)}=\frac{y_i}{1+e^{(y_i\,f(x_i))}} rmi=[f(xi)L(yi,f(xi))]f(x)=fm1(x)=1+e(yif(xi))yi
  • 利用 ( x i , r m i )   ( i = 1 , 2 , . . . , N ) (x_i,r_{mi})\,(i=1,2,...,N) (xi,rmi)(i=1,2,...,N),拟合一棵CART树,得到第 m m m棵树,其对应的叶子节点区域为 R m j ,   j = 1 , 2 , . . . , J R_{mj},\,j=1,2,...,J Rmj,j=1,2,...,J。其中 J J J为树 m m m的叶子节点的个数。

  • j = 1 , 2 , . . . , J j=1,2,...,J j=1,2,...,J,在损失函数极小化条件下,估计出相应叶节点区域的最佳拟合值:
    c m j = arg ⁡ min ⁡ c ∑ x j ∈ R m j N l o g ( 1 + e ( − y i ( f t − 1 ( x i ) + c ) ) ) c_{mj}=\mathop{\arg\min}_{c}\sum_{x_j\in R_{mj}}^{N}log\left(1+e^{(-y_i(f_{t-1}(x_i)+c))}\right) cmj=argmincxjRmjNlog(1+e(yi(ft1(xi)+c)))

    • 由于上式比较难优化,我们一般使用近似值代替:
      c m j = ∑ x j ∈ R m j / ∑ x j ∈ R m j ∣ r m i ∣ ( 1 − ∣ r m i ∣ ) c_{mj}=\sum_{x_j\in R_{mj}}/\sum_{x_j\in R_{mj}}|r_{mi}|(1-|r_{mi}|) cmj=xjRmj/xjRmjrmi(1rmi)

    • 更新强学习器:
      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}^{J}c_{mj}\,I(x\in R_{mj}) fm(x)=fm1(x)+j=1JcmjI(xRmj)

  • 得到强学习器 f ( x ) f(x) f(x)的表达式:
    f ( x ) = f M ( x ) = f 0 ( x ) + ∑ m = 1 M ∑ j = 1 J c m j   I ( x ∈ R m j ) f(x)=f_M(x)=f_0(x)+\sum_{m=1}^M\sum_{j=1}^{J}c_{mj}\,I(x\in R_{mj}) f(x)=fM(x)=f0(x)+m=1Mj=1JcmjI(xRmj)

不难发现,除了负梯度计算和叶子节点的最佳负梯度拟合的线性搜索,二元GBDT分类和GBDT回归算法过程相同。

多分类GBDT算法

考虑到分类和回归算法的过程相似性,以下就阐述多分类GBDT算法的时候不再给出具体的流程,而仅仅列出差异的部分。

多分类GBDT比二分类GBDT复杂些,对应的是多元逻辑回归和二元逻辑回归的复杂度差别。假设类别数为 K K K,则此时我们的对数似然损失函数为:
L ( y , f ( x ) ) = − ∑ k = 1 K y k   l o g   p k ( x ) L(y,f(x))=-\sum_{k=1}^Ky_k\,log\,p_k(x) L(y,f(x))=k=1Kyklogpk(x)

其中如果样本输出类别为 k k k,则 y i y_i yi =1,第 k k k 类的概率 p k ( x ) p_k(x) pk(x) 的表达式为:
p k ( x ) = e f k ( x ) ∑ l = 1 K e f l ( x ) p_k(x)=\frac{e^{f_k(x)}}{\sum_{l=1}^{K}e^{f_l(x)}} pk(x)=l=1Kefl(x)efk(x)

集合上两式,我们可以计算出第 m m m 轮的第 i i i 个样本对应类别 l l l 的负梯度误差为:
r m i l = − [ ∂ L ( y i ,   f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f l ,   m − 1 ( x ) = y i l − p l , m − 1 ( x i ) r_{mil}=-[\frac{\partial L(y_i,\,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{l,\,m-1}(x)}=y_{il}-p_{l,m-1}(x_i) rmil=[f(xi)L(yi,f(xi))]f(x)=fl,m1(x)=yilpl,m1(xi)

观察上式可以看出,其实这里的误差就是样本 i i i 对应类别 l l l 的真实概率和 t − 1 t-1 t1 轮预测概率的差值。

对于生成的决策树,我们各个叶子节点的最佳负梯度拟合值为:
c m j l = arg ⁡ min ⁡ c j l ∑ i = 0 m ∑ k = 1 K L ( y k ,   f m − 1 ,   l ( x ) + ∑ j = 0 J c j l   I ( x i ∈ R m j ) ) c_{mjl}=\mathop{\arg\min}_{c_{jl}}\sum_{i=0}^{m}\sum_{k=1}^{K}L\left(y_k,\,f_{m-1,\,l}(x)+\sum_{j=0}^{J}c_{jl}\,I(x_i \in R_{mj})\right) cmjl=argmincjli=0mk=1KL(yk,fm1,l(x)+j=0JcjlI(xiRmj))

由于上式比较难优化,我们一般使用近似值代替:
c m j l = K K − 1 ∑ x i ∈ R m j l r m i l ∑ x i ∈ R m i l ∣ r m i l ∣ ( 1 − ∣ r m i l ∣ ) c_{mjl}=\frac{K}{K-1}\frac{\sum_{x_i\in R_{mjl}}r_{mil}}{\sum_{x_i\in R_{mil}}|r_{mil}|(1-|r_{mil}|)} cmjl=K1KxiRmilrmil(1rmil)xiRmjlrmil

除了负梯度计算和叶子节点的最佳负梯度拟合的线性搜索,多分类GBDT与二分类GBDT以及GBDT回归算法过程相同。

GBDT正则化

GBDT有非常快降低Loss的能力,这也会造成一个问题:Loss迅速下降,模型偏差(bias),方差(variance)高,造成过拟合。下面简单介绍GBDT中抵抗过拟合的方法:

  • 限制树的复杂度,即对弱学习器CART树进行正则化剪枝,比如如控制树的最大深度、节点的最少样本数、最大叶子节点数、节点分支的最小样本数等
  • Shrinkage,其思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。用方程来看更清晰,即给每棵数的输出结果乘上一个步长 α \alpha α(learning rate)

对于前面的弱学习器的迭代:

f m ( x ) = f m − 1 ( x ) + T ( x ; γ m ) f_m(x)=f_{m-1}(x)+T(x;\gamma_m) fm(x)=fm1(x)+T(x;γm)

加上正则化项,则有

f m ( x ) = f m − 1 ( x ) + α   T ( x ; γ m ) f_m(x)=f_{m-1}(x)+\alpha\, T(x;\gamma_m) fm(x)=fm1(x)+αT(x;γm)

此处, α \alpha α的取值范围为(0,1]。对于同样的训练集学习效果,较小 α \alpha α的意味着需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起决定算法的拟合效果。

优缺点

优点

  • 可以灵活处理各种类型的数据,包括连续值和离散值
  • 具有伸缩不变性,不用归一化特征
  • 具有特征组合和特征选择的作用
  • 可自然地处理缺失值
  • 相对SVM而言,在相对较少的调参时间情况下,预测的准确率也比较高
  • 在使用一些健壮的损失函数,对异常值得鲁棒性非常强。比如Huber损失函数和Quantile损失函数

缺点

  • 由于弱学习器之间存在较强依赖关系,难以整体并行训练

参考链接:GBDT算法梳理

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
梯度提升(Gradient Boosting Decision Tree,简称GBDT)是一种流行的机器学习算法,常用于回归和分类任务。下面以回归为例,详细介绍GBDT的工作原理。 在回归任务中,我们的目标是预测一个连续变量的值。GBDT通过多次迭代的方式,逐步拟合训练数据的残差,最终得到一个强大的回归模型。 首先,GBDT使用一个单独的决策作为基模型。该是通过最小化损失函数(例如均方误差)建立的,将输入特征映射到预测值上。 接下来,GBDT通过计算真实值与当前模型的预测值之间的残差,得到一个新的训练数据集。这些残差成为下一棵决策的目标。 然后,通过训练一棵新的决策来拟合残差数据。这个过程是一个迭代的过程,每迭代一次,都会拟合一棵新的决策,并更新模型的预测值。 最后,将每棵的预测结果累加,得到最终的回归模型。这个模型能够准确地预测目标变量的值。 举例来说,假设我们有一组数据,包含一些自变量(如房屋面积、房间数量等)和一个连续的因变量(如房屋价格)。我们想建立一个回归模型来预测房屋价格。 首先,我们使用一棵决策来拟合这些数据,但是预测结果可能与真实值存在差距。 然后,我们计算真实值和当前模型的预测值之间的残差。使用这些残差作为新的目标,我们训练一棵新的决策。 接着,我们将第一棵决策和第二棵决策的预测结果相加,得到一个更新后的预测值。 我们可以反复迭代这个过程,每次都拟合一棵新的决策,并更新预测值。最终,我们将所有决策的预测结果相加,得到最终的回归模型。 通过这种方式,GBDT能够逐步提升模型的性能,对于复杂的非线性关系,也能够进行有效的拟合。 总而言之,GBDT是一种基于决策机器学习算法,通过迭代拟合残差来构建一个强大的回归模型。它在回归任务中具有广泛的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值