文章目录
梯度提升决策树(GBDT)
梯度提升决策树(GBDT)算法是梯度提升(GB)算法限定基学习器是回归决策树时的模型,尤其是CART回归树,关于梯度提升(GB)可以看我的blog中对应的部分。
这里根据GB算法,改写成使用CART回归树的GBDT算法。
算法流程
输入:训练集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) … ( x N , y N ) } T=\{(x_{1},y_{1}),(x_{2},y_{2}) \dots (x_{N},y_{N})\} T={
(x1,y1),(x2,y2)…(xN,yN)};回归树个数M;
输出:梯度提升决策树
执行流程:
- 初始化 f 0 ( x ) = a r g min c ∑ i = 1 N L ( y i , c ) f_{0}(x)=arg\min\limits_{c} \sum\limits_{i=1}^{N}L(y_{i},c) f0(x)=argcmini=1∑NL(yi,c)这里初始化和传统的前向分步算法令 f 0 ( x ) = 0 f_{0}(x)=0 f0(x)=0不同,这里这样做应该是保证后面求偏导过程不是在零点。
- 对第m个基回归树,求其残差近似 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)=fm−1(x)
- 利用残差 r m i r_{mi} rmi学习第m个基回归树,确定第m个基回归树的区域划分 R m j , j = 1 , 2 … J R_{mj},j=1,2\dots J Rmj,j=1,2…J。
- 求 R m j R_{mj} Rmj的最终取值 c m j c_{mj} cmj, c m j = a r g min c ∑ x i ∈ R m j L ( y i , f m − 1 ( x ) + c ) c_{mj}=arg\min\limits_{c} \sum\limits_{x_{i}\in R_{mj}}L(y_{i},f_{m-1}(x)+c) cmj=argcminxi∈Rmj∑L(yi,fm−1(x)+c)
- 更新回归树 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\limits_{j=1}^{J}c_{mj}I(x\in R_{mj}) fm(x)=fm−1(x)+j=1∑JcmjI(x∈Rmj)若m<M,递归执行步骤2-5。
- 得到最终的回归树 F ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x ∈ R m j ) F(x)=\sum\limits_{m=1}^{M}\sum\limits_{j=1}^{J}c_{mj}I(x \in R_{mj}) F(x)=m=1∑Mj=1∑JcmjI(x∈Rmj)
在《统计学习方法》中,梯度提升没有基学习器的权值,但在有些文献中,会在上面的步骤4后,加一步求权值的操作,这一步定义成4.1.步骤。
4.1. 计算权值 γ \gamma γ a r g min γ m L ( y i , f m − 1 ( x ) + γ m ∑ j = 1 J c m j I ( x ∈ R m j ) ) arg \min \limits_{\gamma_{m}} L(y_{i}, f_{m-1}(x)+\gamma_{m} \sum\limits_{j=1}^{J}c_{mj}I(x\in R_{mj})) argγmminL(yi,fm−1(x)+γmj=1∑JcmjI(x∈Rmj))
对应的步骤5中,更新的模型变成 f m ( x ) = f m − 1 ( x ) + γ m ∑ j = 1 J c m j I ( x ∈ R m j ) ) f_{m}(x)=f_{m-1}(x)+\gamma_{m} \sum\limits_{j=1}^{J}c_{mj}I(x\in R_{mj})) fm(x)=fm−1(x)+γmj=1∑JcmjI(x∈Rmj))
极端梯度提升(xgboost)算法
极端梯度提升(eXtreme Gradient Boosting,xgboost)可以看成改进版本的GBDT算法,xgboost限定了基学习器一定要是CART回归树(在python的xgboost模块中,基学习器还可以是线性模型或dart,但这篇blog仅推导CART回归树情况),输出一个分数而不是类别,这样有助于我们整合所有的基CART回归树的输出结果(简单相加),xgboost引入了并行化,所以其速度更快,同时xgboost引入了损失函数的二阶偏导,一般效果也更好。
xgboost归根到底属于boost集成学习方法,所以其基学习器的学习是串行的,即当我们要学习第 k k k个学习器时,学习的目标是前 k − 1 k-1 k−1个学习器与目标输出的残差,最终的学习器表示如下: y ^ ( K ) = ∑ k = 1 K f k ( x ) , k = 1 , 2 … K \hat{y}^{(K)}=\sum\limits_{k=1}^{K}f_{k}(x),k=1,2\dots K y^(K)=k=1∑Kfk(x),k=1,2…K
其中, f k ( ⋅ ) f_{k}(·) fk(⋅)代表编号是 k k k的基CART回归树,因此,对于输入 { ( x 1 , y 1 ) , ( x 2 , y 2 ) … ( x n , y n ) } \{(x_{1},y_{1}),(x_{2},y_{2})\dots (x_{n},y_{n})\} { (x1,y1),(x2,y2)…(xn,yn)},学习第 k k k个基学习器时,我们学习的目标函数表示如下: min f k ( x ) ∑ i = 1 n l ( y i , y ^ i ( k − 1 ) + f k ( x i ) ) \min_{f_{k}(x)}\sum\limits_{i=1}^{n}l(y_{i}, \hat{y}^{(k-1)}_{i}+f_{k}(x_{i})) fk(x)mini=1∑nl(yi,y^i(k−1)+fk(xi))
其中, y i y_{i} yi是第 i i i条数据的真实输出, y ^ i ( k − 1 ) \hat{y}^{(k-1)}_{i} y^i(k−1)是已经学习的前 k − 1 k-1 k−1个学习器对第 i i i条数据的集成输出, f k ( ⋅ ) f_{k}(·) fk(⋅)是待学习的第 k k k个学习器。下面主要说明xgboost如何确定第 k k k个基CART回归树的结构和叶子节点的值。
xgboost的目标函数
我们先假设我们已经知道了第 k k k个基CART回归树的结构,下面会推导xgboost对第 k k k个基CART回归树的目标函数。
xgboost比较GBDT,第一个大的改进是,为了防止过拟合,xgboost的目标函数会加入正则化项,这在CART决策树中是没有的,CART决策树会在后期进行决策树剪枝来防止过拟合,加入正则化项后的目标函数如下: min f k ( x ) , Ω ( f j ) ( ∑ i = 1 n l ( y i , y ^ i ( k − 1 ) + f k ( x i ) ) + ∑ j = 1 k Ω ( f j ) ) \min_{f_{k}(x), \Omega(f_{j})}\Big(\sum\limits_{i=1}^{n}l(y_{i}, \hat{y}^{(k-1)}_{i}+f_{k}(x_{i})) + \sum\limits_{j=1}^{k}\Omega(f_{j})\Big) fk(x),Ω(f<