深入理解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. 初始化学习器: f0(x)=0f_{0}(x)=0f0(x)=0
  2. m<-[1,M], 每一轮学习器
    • 计算每个样本的在第m个学习器时的残差,由前m-1轮的输出与真实值相减可得
      rmi=yi−fm−1(xi),i=1,2,…,Nr_{m i}=y_{i}-f_{m-1}(x_{i}), i=1,2, \ldots, Nrmi=yifm1(xi),i=1,2,,N
    • 拟合残差rmir_{mi}rmi学习一个新的回归树,这一轮得到的学习器hm(x)h_{m}(x)hm(x)
    • 更新总的学习器fm(x)=fm−1+hm(x)f_{m}(x)=f_{m-1}+h_{m}(x)fm(x)=fm1+hm(x)
  3. 得到最终的集成学习器: fM(x)=∑m=1Mhm(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)初始化弱学习器
f0(x)=arg⁡min⁡c∑i=1NL(yi,c) f_{0}(x)=\arg \min _{c} \sum_{i=1}^{N} L\left(y_{i}, c\right) f0(x)=argcmini=1NL(yi,c)
选取适合的分裂点即可,初始化,无过多要求
(2)求残差并拟合残差

  • 对每个样本计算负梯度,
    rim=−[∂L(yi,f(xi)))∂f(xi)]f(x)=fm−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(xi))=12(y−f(xi))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(xi))∂f(xi)]f(x)=ft−1(x)=y−f(xi) -\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)
    这个负梯度即是我们所谓的残差的形式, 这个残差就是当前学习器中样本的标签,要让当前的学习器去拟合样本的标签。

  • 对于新的样本(xi,rti)(x_{i}, r_{ti})(xi,rti), 用一棵CART回归树去拟合它得到第m轮的学习器,求出使损失函数极小化的γjm\gamma_{j m}γjm即可
    γjm=arg⁡min⁡γ∑xi∈RjmL(yi,fm−1(xi)+γ) \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)+γ)
    其中,Rjm表示第m个分类器对应的叶子节点的区域,j=1,2,…,JmR_{j m}表示第m个分类器对应的叶子节点的区域, j=1,2, \ldots, J_{m}Rjmm,j=1,2,,JmJmJ_{m}Jm 表示个叶子结点的个数

  • 更新强学习器fm(x)=fm−1(x)+∑j=1JΥjmI(x∈Rjm) 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)=fM(x)=f0(x)+∑m=1M∑j=1JΥjmI(x∈Rjm) 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)=11+e−∑m=0Mhm(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=0Mhm(x)=F(x) \sum_{m=0}^{M} h_{m}(x) = F(x) m=0Mhm(x)=F(x)
是GBDT的集成学习器, 学习器的形式跟回归问题一样,只是输出结果时我们取的不是这个学习器的基本输出形式,而是学习器的结果套上了一个sigmoid函数,可以类比于线性回归和逻辑回归,逻辑回归也是将线性回归的结果套上了一层sigmoid函数。

损失函数

GBDT回归问题损失函数用均方差表示,跟线性回归一样。
那么类似的,GBDT分类问题的损失函数使用交叉熵:
下面为单个样本的交叉熵,(yyy是真实概率值,yi^\hat{y_{i}}yi^是预测概率值)。
loss⁡(xi,yi)=−yilog⁡y^i−(1−yi)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=1k−1hm(x) F(x)=\sum_{m=1}^{k-1} h_{m}(x) F(x)=m=1k1hm(x)
11+e−F(x)\frac{1}{1+e^{-F(x)}}1+eF(x)1代替y^i\hat{y}_{i}y^i
loss⁡(xi,yi∣F(x))=yilog⁡(1+e−F(xi))+(1−yi)[F(xi)+log⁡(1+e−F(xi))] \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个学习器的负梯度为:
−∂loss∂F(x)∣xi,yi=yi−11+e−F(xi)=yi−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
可以发现,这个结果也恰好是残差的形式,只不过是概率残差的形式。
让本轮的学习器hm(x)h_{m}(x)hm(x)去拟合这个残差

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

最终的输出Fm(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), 求其最小值,首先随机选取一个点x0x_{0}x0, 然后通过求f(x)f(x)f(x)在该点的梯度
∇f(x)\nabla_{f}(x)f(x),然后不断更新x1=x0−η∇f(x0),x2=x1−η∇f(x1)…x_{1}=x_{0}-\eta \nabla_{f}\left(x_{0}\right), x_{2}=x_{1}-\eta \nabla_{f}\left(x_{1}\right) \ldotsx1=x0ηf(x0),x2=x1ηf(x1),使得x不断往f(x)f(x)f(x)变小的方向移动。

GBM

GBM 每一轮中:
ft(x)=ft−1+ht(x)f_{t}(x)=f_{t-1}+h_{t}(x)ft(x)=ft1+ht(x)
ft−1f_{t-1}ft1是前t-1个学习器的预测结果,ht(x)h_{t}(x)ht(x)是当前学习器, 这个学习器要拟合的是下面的内容:
−[∂L(y,f(xi))∂f(xi)]f(x)=ft−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中的参数类比于一般函数的梯度下降:

  • 一元函数中, 要求的是最小的xxx, 即我们这里的f(x)f(x)f(x),也就是模型最终的输出
  • 一元函数中的y对应GBM中的损失函数L(y,f(xi))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拟合了残差。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值