深入理解GBDT

基本概念

概述

Gradient Boosting Decision Tree,梯度提升决策树。

GBDT是一个Boosting算法 , Boosting算法将弱分类器集成成一个强分类器,相比于bagging:

  1. boosting算法中当前的分类器会受到之前的学习器的影响,比如adaboost当前学习器中样本的权重是前n轮学习器改变后的结果,比如GBDT中当前学习器要拟合东西是前n个学习器产生的残差。
  2. 而bagging算法中每一个学习器都是相对独立的,不会受到其他学习器的影响。

GBDT 相当于 Gradient + Boosting Decision Tree
基于Gradient算法的Boosting学习器叫做GBM(Gradient Boosting Machine),GBM可以选择不同的算法作为基学习器。当基学习器为决策树时称为GBDT。

GBDT的基学习器是决策树,且是CART回归树,不管是分类问题还是回归问题,GBDT使用的都是CART回归树,不用ID3,C4.5或者CART分类树是因为,GBDT迭代的过程中要使用到梯度,所以要求基学习器的输出结果是一个连续值。

背景-提升树

GBDT = G + BDT
BDT:
不断的用决策树来拟合上一轮学习器误差,比如房价为1000,第一轮预测800,那么第二轮就要预测200,第二轮给的预测值是150,第三轮就要预测这个误差50.
提升树算法过程:

  1. 初始化学习器: f 0 ( x ) = 0 f_{0}(x)=0 f0(x)=0
  2. m<-[1,M], 每一轮学习器
    • 计算每个样本的在第m个学习器时的残差,由前m-1轮的输出与真实值相减可得
      r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , … , N r_{m i}=y_{i}-f_{m-1}(x_{i}), i=1,2, \ldots, N rmi=yifm1(xi),i=1,2,,N
    • 拟合残差 r m i r_{mi} rmi学习一个新的回归树,这一轮得到的学习器 h m ( x ) h_{m}(x) hm(x)
    • 更新总的学习器 f m ( x ) = f m − 1 + h m ( x ) f_{m}(x)=f_{m-1}+h_{m}(x) fm(x)=fm1+hm(x)
  3. 得到最终的集成学习器: f M ( x ) = ∑ m = 1 M h m ( x ) f_{M}(x)=\sum_{m=1}^{M} h_{m}(x) fM(x)=m=1Mhm(x)

背景-CART 回归树

记录在了这里:https://blog.csdn.net/dpengwang/article/details/87879861
总的来说,CART回归树的回归过程如下

  1. 遍历所有切分变量(即特征),对于每个切分变量,遍历所有可能的切分点,
  2. 对于切分点左右两边的数据,利用线性搜索计算出每部分数据产生的最小误差和,两部分的误差和作为该切分变量、该切分点的评测依据
  3. 递归调用1,2步骤,直到满足停止条件
  4. 将划分的M个区域(叶子节点生成决策树)

GBDT回归模型

回归过程

算法流程:
(1)初始化弱学习器
f 0 ( x ) = arg ⁡ min ⁡ c ∑ i = 1 N L ( y i , c ) f_{0}(x)=\arg \min _{c} \sum_{i=1}^{N} L\left(y_{i}, c\right) f0(x)=argcmini=1NL(yi,c)
选取适合的分裂点即可,初始化,无过多要求
(2)求残差并拟合残差

  • 对每个样本计算负梯度,
    r i m = − [ ∂ L ( y i , f ( x i ) ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{i m}=-\left[\frac{\partial L\left(y_{i}, f\left(x_{i}\right)\right) )}{\partial f\left(x_{i}\right)}\right]_{f(x)=f_{m-1}(x)} rim=[f(xi)L(yi,f(xi)))]f(x)=fm1(x)
    因为
    L ( y , f ( x i ) ) = 1 2 ( y − f ( x i ) ) 2 L\left(y, f\left(x_{i}\right)\right)=\frac{1}{2}\left(y-f\left(x_{i}\right)\right)^{2} L(y,f(xi))=21(yf(xi))2
    所以负梯度为:
    − [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f t − 1 ( x ) = y − f ( x i ) -\left[\frac{\partial L\left(y, f\left(x_{i}\right)\right)}{\partial f\left(x_{i}\right)}\right]_{f(x)=f_{t-1}(x)}=y-f\left(x_{i}\right) [f(xi)L(y,f(xi))]f(x)=ft1(x)=yf(xi)
    这个负梯度即是我们所谓的残差的形式, 这个残差就是当前学习器中样本的标签,要让当前的学习器去拟合样本的标签。

  • 对于新的样本 ( x i , r t i ) (x_{i}, r_{ti}) (xi,rti), 用一棵CART回归树去拟合它得到第m轮的学习器,求出使损失函数极小化的 γ j m \gamma_{j m} γjm即可
    γ j m = arg ⁡ min ⁡ γ ∑ x i ∈ R j m L ( y i , f m − 1 ( x i ) + γ ) \gamma_{j m}=\arg \min _{\gamma} \sum_{x_{i} \in R_{j m}} L\left(y_{i}, f_{m-1}\left(x_{i}\right)+\gamma\right) γjm=argγminxiRjmL(yi,fm1(xi)+γ)
    其中, R j m 表 示 第 m 个 分 类 器 对 应 的 叶 子 节 点 的 区 域 , j = 1 , 2 , … , J m R_{j m}表示第m个分类器对应的叶子节点的区域, j=1,2, \ldots, J_{m} Rjmm,j=1,2,,Jm J m J_{m} Jm 表示个叶子结点的个数

  • 更新强学习器 f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J Υ j m I ( x ∈ R j m ) f_{m}(x)=f_{m-1}(x)+\sum_{j=1}^{J} \Upsilon_{j m} I\left(x \in R_{j m}\right) fm(x)=fm1(x)+j=1JΥjmI(xRjm)

(3)得到最终的学习器
f ( x ) = f M ( x ) = f 0 ( x ) + ∑ m = 1 M ∑ j = 1 J Υ j m I ( x ∈ R j m ) f(x)=f_{M}(x)=f_{0}(x)+\sum_{m=1}^{M} \sum_{j=1}^{J} \Upsilon_{j m} I\left(x \in R_{j m}\right) f(x)=fM(x)=f0(x)+m=1Mj=1JΥjmI(xRjm)

GBDT分类模型

GBDT回归过程中,第m轮学习器拟合的是前m-1轮学习器的残差,因为是回归问题,所以显得比较直观,每次拟合前m-1轮的预测值和真实值之间的差即可。
对于GBDT的分类过程,过程也是类似的,只不过损失函数和要拟合的东西没有归回过程那么直观(回归问题中损失函数是均方差,拟合为残差)。

如何表达结果

回归问题中直接用连续值来表达预测结果,分类问题中类似逻辑回归,用概率值来表达样本被预测为某一类的概率,这样就将分类问题转变成了一个伪回归问题。
GBDT的分类模型可以表达为:
P ( y = 1 ∣ x ) = 1 1 + e − ∑ m = 0 M h m ( x ) P(y=1 | x)=\frac{1}{1+e^{-\sum_{m=0}^{M} h_{m}(x)}} P(y=1x)=1+em=0Mhm(x)1
其中
∑ m = 0 M h m ( x ) = F ( x ) \sum_{m=0}^{M} h_{m}(x) = F(x) m=0Mhm(x)=F(x)
是GBDT的集成学习器, 学习器的形式跟回归问题一样,只是输出结果时我们取的不是这个学习器的基本输出形式,而是学习器的结果套上了一个sigmoid函数,可以类比于线性回归和逻辑回归,逻辑回归也是将线性回归的结果套上了一层sigmoid函数。

损失函数

GBDT回归问题损失函数用均方差表示,跟线性回归一样。
那么类似的,GBDT分类问题的损失函数使用交叉熵:
下面为单个样本的交叉熵,( y y y是真实概率值, y i ^ \hat{y_{i}} yi^是预测概率值)。
loss ⁡ ( x i , y i ) = − y i log ⁡ y ^ i − ( 1 − y i ) log ⁡ ( 1 − y ^ i ) \operatorname{loss}\left(x_{i}, y_{i}\right)=-y_{i} \log \hat{y}_{i}-\left(1-y_{i}\right) \log \left(1-\hat{y}_{i}\right) loss(xi,yi)=yilogy^i(1yi)log(1y^i)
第k轮学习器中,将前k-1个学习器记录为
F ( x ) = ∑ m = 1 k − 1 h m ( x ) F(x)=\sum_{m=1}^{k-1} h_{m}(x) F(x)=m=1k1hm(x)
1 1 + e − F ( x ) \frac{1}{1+e^{-F(x)}} 1+eF(x)1代替 y ^ i \hat{y}_{i} y^i
loss ⁡ ( x i , y i ∣ F ( x ) ) = y i log ⁡ ( 1 + e − F ( x i ) ) + ( 1 − y i ) [ F ( x i ) + log ⁡ ( 1 + e − F ( x i ) ) ] \operatorname{loss}\left(x_{i}, y_{i} | F(x)\right)=y_{i} \log \left(1+e^{-F\left(x_{i}\right)}\right)+\left(1-y_{i}\right)\left[F\left(x_{i}\right)+\log \left(1+e^{-F\left(x_{i}\right)}\right)\right] loss(xi,yiF(x))=yilog(1+eF(xi))+(1yi)[F(xi)+log(1+eF(xi))]
损失函数对于前k-1个学习器的负梯度为:
− ∂ l o s s ∂ F ( x ) ∣ x i , y i = y i − 1 1 + e − F ( x i ) = y i − y ^ i -\left.\frac{\partial l o s s}{\partial F(x)}\right|_{x_{i}, y_{i}}=y_{i}-\frac{1}{1+e^{-F\left(x_{i}\right)}}=y_{i}-\hat{y}_{i} F(x)lossxi,yi=yi1+eF(xi)1=yiy^i
可以发现,这个结果也恰好是残差的形式,只不过是概率残差的形式。
让本轮的学习器 h m ( x ) h_{m}(x) hm(x)去拟合这个残差

剩下的过程和GBDT回归过程相同

输出

最终的输出 F m ( x ) F_{m}(x) Fm(x)经过sigmoid函数后的结果,即先求弱学习器的和再sigmoid, 而不是每个分类器先sigmoid再求和,因为损失函数求梯度的适合是对F(x)求导的,而不是对sigmoid(F(x)),(想想一般梯度下降中的x)这和回归过程优点区别。

小结

所以GBDT分类过程是将分类转化为概率的预测,而概率的预测又是一个回归问题,这个过程中虽然使用的损失函数是交叉熵,但是求得的梯度也是残差的形式。

GBDT的拟合残差和拟合梯度

GBM为什么要拟合梯度

一般的梯度下降算法

对于一般函数 y = f ( x ) y=f(x) y=f(x), 求其最小值,首先随机选取一个点 x 0 x_{0} x0, 然后通过求 f ( x ) f(x) f(x)在该点的梯度
∇ f ( x ) \nabla_{f}(x) f(x),然后不断更新 x 1 = x 0 − η ∇ f ( x 0 ) , x 2 = x 1 − η ∇ f ( x 1 ) … x_{1}=x_{0}-\eta \nabla_{f}\left(x_{0}\right), x_{2}=x_{1}-\eta \nabla_{f}\left(x_{1}\right) \ldots x1=x0ηf(x0),x2=x1ηf(x1),使得x不断往 f ( x ) f(x) f(x)变小的方向移动。

GBM

GBM 每一轮中:
f t ( x ) = f t − 1 + h t ( x ) f_{t}(x)=f_{t-1}+h_{t}(x) ft(x)=ft1+ht(x)
f t − 1 f_{t-1} ft1是前t-1个学习器的预测结果, h t ( x ) h_{t}(x) ht(x)是当前学习器, 这个学习器要拟合的是下面的内容:
− [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f t − 1 ( x ) -\left[\frac{\partial L\left(y, f\left(x_{i}\right)\right)}{\partial f\left(x_{i}\right)}\right]_{f(x)=f_{t-1}(x)} [f(xi)L(y,f(xi))]f(x)=ft1(x)
即上一轮产生的总损失和对上一轮的总输出的梯度, 为什么要拟合这个梯度,可以将GBM中的参数类比于一般函数的梯度下降:

  • 一元函数中, 要求的是最小的 x x x, 即我们这里的 f ( x ) f(x) f(x),也就是模型最终的输出
  • 一元函数中的y对应GBM中的损失函数 L ( y , f ( x i ) ) L\left(y, f\left(x_{i}\right)\right) L(y,f(xi))
  • ∇ f ( x ) \nabla_{f}(x) f(x)对应GBM中上式子

所以这就是一个利用梯度下降使得损失函数最小从而求x的过程

为什么说GBDT拟合的是残差

GBDT中当前学习器拟合的是之前学习器的残差,之所以可以说是拟合残差,因为GBDT是一个这样的特例:

  1. GBDT是GBM的一个特例,而GBM子学习器拟合的是梯度
  2. GBDT的基学习器是Decision Tree,并且是CART回归树
  3. CART回归树的损失函数的损失函数是MSE, MSE求导得到梯度为 y − y ^ y-\hat{y} yy^的形式,这个梯度的形式又是残差的形式,所以说GBDT拟合了残差。

你可能感兴趣的:(机器学习)