Gradient Boosting Decision Tree,梯度提升决策树。
GBDT是一个Boosting算法 , Boosting算法将弱分类器集成成一个强分类器,相比于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.
提升树算法过程:
记录在了这里:https://blog.csdn.net/dpengwang/article/details/87879861
总的来说,CART回归树的回归过程如下
算法流程:
(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=1∑NL(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)=fm−1(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(y−f(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)=ft−1(x)=y−f(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γminxi∈Rjm∑L(yi,fm−1(xi)+γ)
其中, R j m 表 示 第 m 个 分 类 器 对 应 的 叶 子 节 点 的 区 域 , j = 1 , 2 , … , J m R_{j m}表示第m个分类器对应的叶子节点的区域, j=1,2, \ldots, J_{m} Rjm表示第m个分类器对应的叶子节点的区域,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)=fm−1(x)+j=1∑JΥjmI(x∈Rjm)
(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=1∑Mj=1∑JΥjmI(x∈Rjm)
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=1∣x)=1+e−∑m=0Mhm(x)1
其中
∑ m = 0 M h m ( x ) = F ( x ) \sum_{m=0}^{M} h_{m}(x) = F(x) m=0∑Mhm(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−(1−yi)log(1−y^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=1∑k−1hm(x)
用 1 1 + e − F ( x ) \frac{1}{1+e^{-F(x)}} 1+e−F(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,yi∣F(x))=yilog(1+e−F(xi))+(1−yi)[F(xi)+log(1+e−F(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)∂loss∣∣∣∣xi,yi=yi−1+e−F(xi)1=yi−y^i
可以发现,这个结果也恰好是残差的形式,只不过是概率残差的形式。
让本轮的学习器 h m ( x ) h_{m}(x) hm(x)去拟合这个残差
最终的输出 F m ( x ) F_{m}(x) Fm(x)经过sigmoid函数后的结果,即先求弱学习器的和再sigmoid, 而不是每个分类器先sigmoid再求和,因为损失函数求梯度的适合是对F(x)求导的,而不是对sigmoid(F(x)),(想想一般梯度下降中的x)这和回归过程优点区别。
所以GBDT分类过程是将分类转化为概率的预测,而概率的预测又是一个回归问题,这个过程中虽然使用的损失函数是交叉熵,但是求得的梯度也是残差的形式。
对于一般函数 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 每一轮中:
f t ( x ) = f t − 1 + h t ( x ) f_{t}(x)=f_{t-1}+h_{t}(x) ft(x)=ft−1+ht(x)
f t − 1 f_{t-1} ft−1是前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)=ft−1(x)
即上一轮产生的总损失和对上一轮的总输出的梯度, 为什么要拟合这个梯度,可以将GBM中的参数类比于一般函数的梯度下降:
所以这就是一个利用梯度下降使得损失函数最小从而求x的过程
GBDT中当前学习器拟合的是之前学习器的残差,之所以可以说是拟合残差,因为GBDT是一个这样的特例: