GBDT & XGBoost

1. GBDT

1.1 算法介绍

  • GBDT(Gradient Boosting Decision Tree,梯度提升决策树)是boosting类型的机器学习算法,是传统机器学习算法中对真实分布拟合最好的几种之一,既可以用于分类也可以用于回归,可以筛选特征
  • GBDT采用加法模型(基函数的线性组合),通过不断减小训练过程产生的残差来达到数据的分类或回归

1.2 GBDT训练过程

  • GBDT通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练
  • 对弱分类器的要求一般是足够简单、低方差、高偏差,因为训练的过程是通过降低偏差来不断提高最终分类器的精度,一般默认选择CART树(二叉树)
  • GBDT特征选择的过程就是CART树生成的过程,原始的GBDT会遍历所有特征和每个特征所有可能的切分点,从而找到最优的分类

在这里插入图片描述
1.3 公式表述
具体来说,假设有训练样本 { x ( i ) , y ( i ) } , i = 1 , ⋯   , m \{x^{(i)},y^{(i)}\},i=1,\cdots,m {x(i),y(i)},i=1,,m,第 r − 1 r-1 r1步获得的集成学习器为 F r − 1 ( x ) F_{r-1}(x) Fr1(x),那么GBDT将通过下面的递推式,获得一个新的弱学习器 h r ( x ) h_{r}(x) hr(x) h r ( x ) = arg min ⁡ h ∈ H ∑ i = 1 m L ( y ( i ) , F r − 1 ( x ( i ) ) + h ( x ( i ) ) ) h_{r}(x)=\argmin_{h\in H}\sum_{i=1}^mL(y^{(i)},F_{r-1}(x^{(i)})+h(x^{(i)})) hr(x)=hHargmini=1mL(y(i),Fr1(x(i))+h(x(i)))其中 H H H代表整个函数空间,但是想在函数空间中直接得到最小化损失函数对应的 h r ( x ) h_{r}(x) hr(x)是不现实的,于是使用梯度下降法来减小损失函数。

梯度下降法中,向量移动的方向应为损失函数的负梯度方向,这样若使用训练集 { x ( i ) , − ∂ L ( y ( i ) , F r − 1 ( x ( i ) ) ) ∂ F r − 1 ( x ( i ) ) } i = 1 m \begin{Bmatrix}x^{(i)},-\cfrac{\partial L(y^{(i)},F_{r-1}(x^{(i)}))}{\partial F_{r-1}(x^{(i)})}\end{Bmatrix}_{i=1}^m {x(i),Fr1(x(i))L(y(i),Fr1(x(i)))}i=1m去训练 h r ( x ) h_{r}(x) hr(x),就相当于朝着损失函数减小的方向走了一步。第 r r r步获得的集成学习器为 F r ( x ) F_{r}(x) Fr(x)为: F r ( x ) = F r − 1 ( x ) + h r ( x ) F_r(x)=F_{r-1}(x)+h_{r}(x) Fr(x)=Fr1(x)+hr(x)GBDT本质上还是梯度下降法,每一步通过学习一颗拟合负梯度的树(残差树),来使得损失函数逐渐减小。最终的GBDT模型可用公式表示为: F ( x ) = ∑ r = 1 R T ( x ; θ r ) F(x)=\sum_{r=1}^RT(x;\theta_r) F(x)=r=1RT(x;θr)式中, T ( x ; θ r ) T(x;\theta_r) T(x;θr)表示决策树; θ r \theta_r θr为决策树的参数; R R R为树的个数,也是训练的次数。

1.4 GBDT用于分类
GBDT无论用于分类还是回归都使用CART回归树,不会因为任务是分类就使用分类树。因为GBDT每轮的训练是在上一轮的训练的残差基础之上进行训练的,这就要求每轮迭代时,弱分类器的输出的结果相减是有意义的。GBDT用于回归问题时,损失函数一般用平方差损失函数,过程较为直观,不做详细说明。

GBDT分类模型可以表达为: P ( y = 1 ∣ x ) = 1 1 + e − F r ( x ) P(y=1|x)=\cfrac{1}{1+e^{-F_r(x)}} P(y=1x)=1+eFr(x)1其中 F r ( x ) F_r(x) Fr(x)为第 r r r步迭代之后的集成学习器。损失函数 L L L可用交叉熵表示,由逻辑回归的结论可知,交叉熵损失函数的负梯度为: − ∂ L ∂ F r ( x ) = y − y ^ -\cfrac{\partial L}{\partial F_r(x)}=y-\hat{y} Fr(x)L=yy^用于第 r + 1 r+1 r+1步基学习器的训练。

GBDT进行多分类算法流程如下:

  • 输入:待分类类别数 K K K,训练数据集 { x ( i ) ∈ R n ∣ i = 1 , 2 , ⋯   , m } \{x^{(i)}\in R^n|i=1,2,\cdots,m\} {x(i)Rni=1,2,,m},训练数据集对应的分类标签 { y ( i ) ∈ R K ∣ i = 1 , 2 , ⋯   , m } \{y^{(i)}\in R^K|i=1,2,\cdots,m\} {y(i)RKi=1,2,,m},其中 n n n为数据特征维度, m m m为数据集大小, y ( i ) y^{(i)} y(i)只有一项值为1,其余项均为0
  • 第一步:根据待分类类别数,同时训练 K K K颗CART回归树。数据 x ( i ) x^{(i)} x(i)对应第 j j j颗树的真实值记为 y j , 1 ( i ) y^{(i)}_{j,1} yj,1(i),对应向量 y ( i ) y^{(i)} y(i)中的第 j j j个值,在训练完成后的回归树上的输出值记为 y ^ j , 1 ( i ) \hat{y}^{(i)}_{j,1} y^j,1(i)
  • 第二步:将第一批训练得到的 K K K颗树作为第一个弱分类器,每棵树的残差作为下一批树的真实值。对于第 r r r个弱分类器而言,有: y j , r ( i ) = y j , r − 1 ( i ) − y ^ j , r − 1 ( i ) y^{(i)}_{j,r}=y^{(i)}_{j,r-1}-\hat{y}^{(i)}_{j,r-1} yj,r(i)=yj,r1(i)y^j,r1(i)共训练 R R R轮,得到 R R R个弱分类器,共 R × K R\times K R×K颗树
  • shrinkage步:对每轮学习得到的分类器 h r ( x ) h_r(x) hr(x),都通过最小化损失函数的方式找到该分类器的最优权重 ρ r = arg min ⁡ ρ L ( x , y ∣ F r − 1 ( x ) + ρ h r ( x ) ) \rho_r=\argmin_{\rho}L(x,y|F_{r-1}(x)+\rho h_r(x)) ρr=ρargminL(x,yFr1(x)+ρhr(x))这轮迭代后的集成学习器为 F r ( x ) = F r − 1 ( x ) + α ρ r h r ( x ) F_r(x)=F_{r-1}(x)+\alpha\rho_r h_r(x) Fr(x)=Fr1(x)+αρrhr(x)其中 α \alpha α为学习率
  • 分类:将待分类数据输入 R R R个弱分类器中,各分类器中对应的树结果相加,共得到 K K K个回归值,对 K K K个回归值进行softmax计算得到分类结果

GBDT应用
使用GBDT构建特征:GBDT本身不能产生特征,但可以产生特征的组合。首先使用GBDT生成多颗树,将待训练样本输入到这些树中,利用输出结果在每棵树叶节点上的位置组合得到新的特征。由此构建得到的组合特征可以和原始特征一起进行训练(如使用逻辑回归),这样可以增强训练算法对非线性分布的拟合能力

2. Xgboost

2.1 算法介绍
Xgboost与GBDT原理相同,也是使用多轮弱学习器对上一轮的残差进行训练,得到最终结果。相较于GBDT,Xgboost在目标函数的定义上有不同: J t = ∑ i = 1 m L ( y ( i ) , y ^ t − 1 ( i ) + f t ( x ( i ) ) ) + Ω ( f t ) + C J_t=\sum_{i=1}^mL(y^{(i)},\hat{y}^{(i)}_{t-1}+f_t(x^{(i)}))+\Omega(f_t)+C Jt=i=1mL(y(i),y^t1(i)+ft(x(i)))+Ω(ft)+C其中 J t J_t Jt为第 t t t轮学习的代价函数; L L L为损失函数,一般回归任务中为平方差函数,分类任务中为交叉熵函数; f t f_t ft为第 t t t轮弱学习器学习到的结果; Ω \Omega Ω为正则项; C C C为常数项。

Xgboost算法中,将损失函数做泰勒展开,并保留至二次项。泰勒展开后的代价函数为: J t ≃ ∑ i = 1 m [ L ( y ( i ) , y ^ t − 1 ( i ) ) + g ( i ) f t ( x ( i ) ) + 1 2 h ( i ) f t 2 ( x ( i ) ) ] + Ω ( f t ) + C J_t\simeq\sum_{i=1}^m\bigg[L(y^{(i)},\hat{y}^{(i)}_{t-1})+g^{(i)}f_t(x^{(i)})+\frac12h^{(i)}f_t^2(x^{(i)})\bigg]+\Omega(f_t)+C Jti=1m[L(y(i),y^t1(i))+g(i)ft(x(i))+21h(i)ft2(x(i))]+Ω(ft)+C其中 g ( i ) = ∂ y ^ t − 1 L ( y ( i ) , y ^ t − 1 ( i ) ) g^{(i)}=\partial_{\hat{y}_{t-1}}L(y^{(i)},\hat{y}^{(i)}_{t-1}) g(i)=y^t1L(y(i),y^t1(i)) h ( i ) = ∂ y ^ t − 1 2 L ( y ( i ) , y ^ t − 1 ( i ) ) h^{(i)}=\partial^2_{\hat{y}_{t-1}}L(y^{(i)},\hat{y}^{(i)}_{t-1}) h(i)=y^t12L(y(i),y^t1(i))

在第 t t t步中, y ^ t − 1 ( i ) \hat{y}^{(i)}_{t-1} y^t1(i)为真实值,即 L ( y ( i ) , y ^ t − 1 ( i ) ) L(y^{(i)},\hat{y}^{(i)}_{t-1}) L(y(i),y^t1(i))为常数,代价函数中的常数项不影响优化,可以直接去掉,此时可将代价函数写为: J t ≃ ∑ i = 1 m [ g ( i ) f t ( x ( i ) ) + 1 2 h ( i ) f t 2 ( x ( i ) ) ] + Ω ( f t ) J_t\simeq\sum_{i=1}^m\bigg[g^{(i)}f_t(x^{(i)})+\frac12h^{(i)}f_t^2(x^{(i)})\bigg]+\Omega(f_t) Jti=1m[g(i)ft(x(i))+21h(i)ft2(x(i))]+Ω(ft)

2.2 正则项定义
在代价函数中,损失函数定义了训练误差,正则项 Ω ( f ) \Omega(f) Ω(f)则定义了算法的复杂度。正则项的值越小,复杂度月底,泛化能力越强。在Xgboost中,正则项的表达式为: Ω ( f ) = γ T + 1 2 λ ∑ j = 1 T ∣ ∣ ω j ∣ ∣ 2 \Omega(f)=\gamma T+\frac12 \lambda \sum_{j=1}^T||\omega_j||^2 Ω(f)=γT+21λj=1Tωj2其中, T T T表示决策树中叶节点的个数, ω j \omega_j ωj表示第 j j j个叶节点的分数。

将正则项表达式带入代价函数中,得: J t ≃ ∑ j = 1 T [ ( ∑ i ∈ I j g ( i ) ) ω j + 1 2 ( ∑ i ∈ I j h ( i ) + λ ) ω j 2 ] + γ T J_t\simeq\sum_{j=1}^T\bigg[(\sum _{i\in I_j}g^{(i)})\omega _j+\frac12(\sum _{i\in I_j}h^{(i)}+\lambda)\omega _j^2\bigg]+\gamma T Jtj=1T[(iIjg(i))ωj+21(iIjh(i)+λ)ωj2]+γT其中, I j I_j Ij为每个叶节点 j j j上样本下标的集合。令 G j = ∑ i ∈ I j g ( i ) G_j=\sum _{i\in I_j}g^{(i)} Gj=iIjg(i) H j = ∑ i ∈ I j h ( i ) H_j=\sum _{i\in I_j}h^{(i)} Hj=iIjh(i),可将公式化简为: J t ≃ ∑ j = 1 T [ G j ω j + 1 2 ( H j + λ ) ω j 2 ] + γ T J_t\simeq\sum_{j=1}^T\bigg[G_j\omega _j+\frac12(H_j+\lambda)\omega _j^2\bigg]+\gamma T Jtj=1T[Gjωj+21(Hj+λ)ωj2]+γT通过对 ω j \omega_j ωj求导等于0,可得: ω j ∗ = − G j H j + λ \omega_j^*=-\cfrac{G_j}{H_j+\lambda} ωj=Hj+λGj带入代价函数得: J t ≃ − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T J_t\simeq-\frac12\sum_{j=1}^T\cfrac{G_j^2}{H_j+\lambda}+\gamma T Jt21j=1THj+λGj2+γT代价函数越小,代表这个树的结构越好。

2.3 决策树的生成
2.3.1 贪心法
每次要进行节点分裂时,先将一个特征中的值进行排序,然后线性扫描确定该特征中最好的分割点(只进行二分),分割点的选择通过信息增益Gain来确定: G a i n = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ ] − γ Gain=\frac12\big[\cfrac{G_L^2}{H_L+\lambda}+\cfrac{G_R^2}{H_R+\lambda}-\cfrac{(G_L+G_R)^2}{H_L+H_R+\lambda}\big]-\gamma Gain=21[HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2]γ等式右侧第一项表示左子树的分数,第二项表示右子树的分数,第三项表示不进行分裂树的分数,第四项为加入新叶节点引入的复杂度代价。

对于可选择的所有特征,均通过上述方式确定分割点,然后选择Gain最大的特征的分割点进行节点分裂。为了限制树生长过深,设定一个阈值: L s p l i t = 1 2 [ ( ∑ i ∈ I L g ( i ) ) 2 ∑ i ∈ I L h ( i ) + λ + ( ∑ i ∈ I R g ( i ) ) 2 ∑ i ∈ I R h ( i ) + λ − ( ∑ i ∈ I g ( i ) ) 2 ∑ i ∈ I h ( i ) + λ ] − γ L_{split}=\frac12\big[\cfrac{(\sum_{i\in I_L}g^{(i)})^2}{\sum_{i\in I_L}h^{(i)}+\lambda}+\cfrac{(\sum_{i\in I_R}g^{(i)})^2}{\sum_{i\in I_R}h^{(i)}+\lambda}-\cfrac{(\sum_{i\in I}g^{(i)})^2}{\sum_{i\in I}h^{(i)}+\lambda}\big]-\gamma Lsplit=21[iILh(i)+λ(iILg(i))2+iIRh(i)+λ(iIRg(i))2iIh(i)+λ(iIg(i))2]γ只有当Gain大于该阈值时才进行分裂

2.3.2 近似算法
当数据量太大,不能直接计算Gain时,要采用近似算法生成决策树

2.4 GBDT和Xgboost的区别

  • GBDT采用数值优化的思维,用梯度下降求得损失函数的最优解,其中梯度下降用到的负梯度使用决策树拟合;Xgboost采用解析的思维,将损失函数泰勒展开到二阶近似,求得解析解,将解析解作为Gain来建立决策树,使得代价函数最优
  • GBDT在优化时只用到一阶导数信息,Xgboost用到了一阶导和二阶导
  • Xgboost在代价函数中加入了正则项,用于控制模型复杂度
  • Xgboost借鉴了随机森林的做法,支持列抽样,可降低过拟合、减少计算
  • 对特征值有缺失的样本,Xgboost可以自动学习出它的分裂方向
  • Xgboost支持并行,在训练前预先对数据进行排序,并存储为block结构,后面的迭代中重复使用该结构,在节点分裂时可多线程计算
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值