基本概念
概述
Gradient Boosting Decision Tree,梯度提升决策树。
GBDT是一个Boosting算法 , Boosting算法将弱分类器集成成一个强分类器,相比于bagging:
- boosting算法中当前的分类器会受到之前的学习器的影响,比如adaboost当前学习器中样本的权重是前n轮学习器改变后的结果,比如GBDT中当前学习器要拟合东西是前n个学习器产生的残差。
- 而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.
提升树算法过程:
- 初始化学习器: f0(x)=0f_{0}(x)=0f0(x)=0
- 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=yi−fm−1(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)=fm−1+hm(x)
- 计算每个样本的在第m个学习器时的残差,由前m-1轮的输出与真实值相减可得
- 得到最终的集成学习器: 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步骤,直到满足停止条件
- 将划分的M个区域(叶子节点生成决策树)
GBDT回归模型
回归过程
算法流程:
(1)初始化弱学习器
f0(x)=argminc∑i=1NL(yi,c)
f_{0}(x)=\arg \min _{c} \sum_{i=1}^{N} L\left(y_{i}, c\right)
f0(x)=argcmini=1∑NL(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)=fm−1(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(y−f(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)=ft−1(x)=y−f(xi)
这个负梯度即是我们所谓的残差的形式, 这个残差就是当前学习器中样本的标签,要让当前的学习器去拟合样本的标签。 -
对于新的样本(xi,rti)(x_{i}, r_{ti})(xi,rti), 用一棵CART回归树去拟合它得到第m轮的学习器,求出使损失函数极小化的γjm\gamma_{j m}γjm即可
γjm=argminγ∑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γminxi∈Rjm∑L(yi,fm−1(xi)+γ)
其中,Rjm表示第m个分类器对应的叶子节点的区域,j=1,2,…,JmR_{j m}表示第m个分类器对应的叶子节点的区域, j=1,2, \ldots, J_{m}Rjm表示第m个分类器对应的叶子节点的区域,j=1,2,…,Jm,JmJ_{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)=fm−1(x)+j=1∑JΥjmI(x∈Rjm)
(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=1∑Mj=1∑JΥjmI(x∈Rjm)
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=1∣x)=1+e−∑m=0Mhm(x)1
其中
∑m=0Mhm(x)=F(x)
\sum_{m=0}^{M} h_{m}(x) = F(x)
m=0∑Mhm(x)=F(x)
是GBDT的集成学习器, 学习器的形式跟回归问题一样,只是输出结果时我们取的不是这个学习器的基本输出形式,而是学习器的结果套上了一个sigmoid函数,可以类比于线性回归和逻辑回归,逻辑回归也是将线性回归的结果套上了一层sigmoid函数。
损失函数
GBDT回归问题损失函数用均方差表示,跟线性回归一样。
那么类似的,GBDT分类问题的损失函数使用交叉熵:
下面为单个样本的交叉熵,(yyy是真实概率值,yi^\hat{y_{i}}yi^是预测概率值)。
loss(xi,yi)=−yilogy^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−(1−yi)log(1−y^i)
第k轮学习器中,将前k-1个学习器记录为
F(x)=∑m=1k−1hm(x)
F(x)=\sum_{m=1}^{k-1} h_{m}(x)
F(x)=m=1∑k−1hm(x)
用11+e−F(x)\frac{1}{1+e^{-F(x)}}1+e−F(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,yi∣F(x))=yilog(1+e−F(xi))+(1−yi)[F(xi)+log(1+e−F(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)∂loss∣∣∣∣xi,yi=yi−1+e−F(xi)1=yi−y^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)=ft−1+ht(x)
ft−1f_{t-1}ft−1是前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)=ft−1(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是一个这样的特例:
- GBDT是GBM的一个特例,而GBM子学习器拟合的是梯度
- GBDT的基学习器是Decision Tree,并且是CART回归树
- CART回归树的损失函数的损失函数是MSE, MSE求导得到梯度为y−y^y-\hat{y}y−y^的形式,这个梯度的形式又是残差的形式,所以说GBDT拟合了残差。