XGBOOST与GBDT区别

Boosing算法是一种加法模型,它包含一种残差逼近的思想。
F ( x ) = ∑ t = 0 T f t ( x ) F(x)=\sum_{t=0}^{T}f_t(x) F(x)=t=0Tft(x)

GBDT是一种较为经典的梯度提升树算法,包括Xgboost(Xgboost是GBDT的一个变种)。

GBDT 在函数空间中利用梯度下降法进行优化。
Xgboost在函数空间中利用牛顿法进行优化。且相比GBDT,Xgboost加入了正则项,使模型更加不容易过拟合。

简单的说,GBDT与Xgboost都是在泰勒展开式的基础上进行的。不同的是,GBDT的损失函数是一阶导数,而Xgboost是引入了海森矩阵的二阶导数,且加入了正则项。

这里首先介绍下两种优化方法。

优化方法

梯度下降法(Gradient descend method)

在机器学习任务中, 需要最小化损失函数 L ( θ ) L(\theta) L(θ),其中 θ \theta θ是要求解的模型参数。

梯度下降法常用来求解这种无约束最优化问题, 它是一种迭代方法:选取初值 θ 0 \theta^{0} θ0,不断迭代,更新 θ \theta θ的值,进行损失函数的极小化。

梯度下降法利用的一阶泰勒展开。

  1. 迭代公式: θ t = θ t − 1 + Δ θ \theta^{t} = \theta^{t-1} + \Delta\theta θt=θt1+Δθ
  2. L ( θ t ) L(\theta^{t}) L(θt) θ t − 1 \theta^{t-1} θt1处进行一阶泰勒展开
    L ( θ t ) = L ( θ t − 1 + Δ θ ) ≈ L ( θ t − 1 ) + L ′ ( θ t − 1 ) Δ θ L(\theta^{t}) = L(\theta^{t-1} + \Delta\theta) \approx L(\theta^{t-1}) + L^{'}(\theta^{t-1})\Delta\theta L(θt)=L(θt1+Δθ)L(θt1)+L(θt1)Δθ
  3. 要使得 L ( θ t ) < L ( θ t − 1 ) L(\theta^{t}) < L(\theta^{t-1}) L(θt)<L(θt1),可取: Δ θ = − α L ′ ( θ t − 1 ) \Delta\theta = -\alpha L^{'}(\theta^{t-1}) Δθ=αL(θt1),则 θ t = θ t − 1 − α L ′ ( θ t − 1 ) \theta^{t} = \theta^{t-1} - \alpha L^{'}(\theta^{t-1}) θt=θt1αL(θt1)
    这里 α \alpha α是步长,可以通过line search确定,但一般直接赋予一个小的数。
牛顿法(Newton’s method)

L ( θ t ) L(\theta^{t}) L(θt) θ t − 1 \theta^{t-1} θt1处进行二阶泰勒展开
L ( θ t ) ≈ L ( θ t − 1 ) + L ′ ( θ t − 1 ) Δ θ + L ′ ′ ( θ t − 1 ) Δ θ 2 / 2 L(\theta^{t}) \approx L(\theta^{t-1}) + L^{'}(\theta^{t-1})\Delta\theta + L^{''}(\theta^{t-1})\Delta\theta^{2}/2 L(θt)L(θt1)+L(θt1)Δθ+L(θt1)Δθ2/2

为了简化分析过程,假设参数是标量(即 θ \theta θ只有一维),则可将一阶和二阶导数分别记为 g g g h h h:
L ( θ t ) ≈ L ( θ t − 1 ) + g Δ θ + h Δ θ 2 2 L(\theta^{t}) \approx L(\theta^{t-1}) + g\Delta\theta + h\frac{\Delta\theta^{2}}{2} L(θt)L(θt1)+gΔθ+h2Δθ2
要使得 L ( θ t ) L(\theta^{t}) L(θt)极小,即让 g Δ θ + h Δ θ 2 2 g\Delta\theta + h\frac{\Delta\theta^{2}}{2} gΔθ+h2Δθ2极小,

可令 ∂ ( g Δ θ + h Δ θ 2 2 ) ∂ Δ θ = 0 \frac{\partial (g\Delta\theta + h\frac{\Delta\theta^{2}}{2})}{\partial \Delta\theta} = 0 Δθ(gΔθ+h2Δθ2)=0

求得 Δ θ = − g h \Delta\theta = -\frac{g}{h} Δθ=hg,故 θ t = θ t − 1 + Δ θ = θ t − 1 − g h \theta^{t} = \theta^{t-1} + \Delta\theta = \theta^{t-1} -\frac{g}{h} θt=θt1+Δθ=θt1hg

推广到向量形式的迭代公式: θ t = θ t − 1 − H − 1 g \theta^{t} = \theta^{t-1} -H^{-1}g θt=θt1H1g
这里的 H H H是海森矩阵。


GBDT算法原理
  • GBDT模型定位为算法模型:
    F ( x ; w ) = ∑ t = 0 T α t h t ( x ; w ) = ∑ t = 0 T f t ( x ; w t ) F(x;w) = \sum_{t=0}^{T}\alpha_th_t(x;w) = \sum_{t=0}^{T}f_t(x;w_t) F(x;w)=t=0Tαtht(x;w)=t=0Tft(x;wt)
    其中, x x x为输入样本, h h h为分类回归树, w w w分类回归树的参数, α \alpha α是每棵树的权重。
  • 通过最小化损失函数求解最优模型:
    F ∗ = arg max ⁡ F ∑ t = 0 N L ( y i , F ( x i ; w ) ) F^{*} = {\underset {F}{\operatorname {arg\,max}}} \sum_{t=0}^{N}L(y_i,F(x_i;w)) F=Fargmaxt=0NL(yi,F(xi;w))
XGBoost算法原理

给定数据集 D = { ( x i , y i ) } D = \{(x_i,y_i)\} D={(xi,yi)},XGBoost进行additive training,学习K棵树,采用以下函数对样本进行预测:
y i = Φ ( x i ) = ∑ k = 1 K f k ( x i ) , f k ∈ F y_i = \Phi(x_i) = \sum_{k = 1}^{K}f_k(x_i), f_k \in F yi=Φ(xi)=k=1Kfk(xi),fkF
这里 F F F是假设空间, f ( x ) f(x) f(x)是回归树(CART):
F = { f ( x ) = w q ( x ) } ( q : R m → T , w ∈ R T ) F = \{f(x) = w_{q(x)}\}(q : \mathbb R^{m} \rightarrow T,w \in \mathbb R^{T}) F={f(x)=wq(x)}(q:RmT,wRT)
q ( x ) q(x) q(x)表示样本分到了某个叶子节点上,w是叶子节点的分数(leaf score),所以 w q ( x ) w_{q(x)} wq(x)表示回归树对样本的预测值


目标函数
  • 参数空间中的目标函数:
    O b j ( Θ ) = L ( Θ ) + Ω ( Θ ) Obj(\Theta) = L(\Theta) + \Omega(\Theta) Obj(Θ)=L(Θ)+Ω(Θ)
    误差函数 L ( Θ ) L(\Theta) L(Θ)可以是均方误差损失,对数损失等等,正则项 Ω ( Θ ) \Omega(\Theta) Ω(Θ)可以是L1正则,L2正则等。

Ridge Regression: ∑ i = 1 n ( y i − θ T x i ) 2 + λ ∣ ∣ θ ∣ ∣ 2 \sum_{i = 1}^{n}(y_i - \theta^{T}x_i)^2 + \lambda ||\theta||^2 i=1n(yiθTxi)2+λθ2

Lasso: ∑ i = 1 n ( y i − θ T x i ) 2 + λ ∣ ∣ θ ∣ ∣ 1 \sum_{i = 1}^{n}(y_i - \theta^{T}x_i)^2 + \lambda ||\theta||_1 i=1n(yiθTxi)2+λθ1


正则项
  • XGboost的目标函数(函数空间):
    O b j ( Θ ) = ∑ i l ( y ^ i , y i ) + ∑ k Ω ( f k ) Obj(\Theta) = \sum_il(\widehat{y}_i,y_i) + \sum_k\Omega(f_k) Obj(Θ)=il(y i,yi)+kΩ(fk)

  • 相比原始的GBDT, XGBoost的目标函数多了正则项, 使得学习出来的模型更加不容易过拟合。

  • 有哪些指标可以衡量树的复杂度?
    树的深度, 内部节点个数, 叶子节点个数( T T T), 叶节点分数( w w w)…
    XGBoost采用的:
    Ω ( f ) = γ T + 1 2 λ ∣ ∣ ω ∣ ∣ 2 \Omega(f) = \gamma T + \frac{1}{2}\lambda||\omega||^{2} Ω(f)=γT+21λω2

对叶子节点个数进行惩罚,相当于在训练过程中做了剪枝。

误差函数的二阶泰勒展开
  • 第t次迭代后, 模型的预测等于前t-1次的模型预测加上第t棵树的预
    测:
    y ^ i ( t ) = y ^ i ( t − 1 ) + f t ( x i ) \widehat{y}_i^{(t)} = \widehat{y}_i^{(t-1)} + f_t(x_i) y i(t)=y i(t1)+ft(xi)

  • 此时目标函数可写作:
    L ( t ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) + Ω ( f t ) L(t) = \sum_{i = 1}^{n}l(y_i,\widehat{y}_i^{(t-1)} + f_t(x_i) + \Omega(f_t) L(t)=i=1nl(yi,y i(t1)+ft(xi)+Ω(ft)
    公式中 y i , y ^ i ( t − 1 ) y_i,\widehat{y}_i^{(t-1)} yi,y i(t1)都已知, 模型要学习的只有第t棵树 f t f_t ft

  • 将误差函数在 y ^ i t − 1 \widehat{y}_i^{t-1} y it1处进行二阶泰勒展开:
    L ( t ) ≈ ∑ i = 1 n [ l ( y i , y ^ i ( t − 1 ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) L(t) \approx \sum_{i = 1}^{n}[l(y_i,\widehat{y}_i^{(t-1)} + g_if_t(x_i)+ \frac{1}{2}h_if^2_t(x_i)] + \Omega(f_t) L(t)i=1n[l(yi,y i(t1)+gift(xi)+21hift2(xi)]+Ω(ft)
    公式中, g i = ∂ y ^ ( t − 1 ) l ( y i , y ^ ( t − 1 ) ) g_i = \partial_{\widehat{y}(t-1)}l(y_i,\widehat{y}^{(t-1)}) gi=y (t1)l(yi,y (t1)), h i = ∂ y ^ ( t − 1 ) 2 l ( y i , y ^ ( t − 1 ) ) h_i = \partial^2_{\widehat{y}(t-1)}l(y_i,\widehat{y}^{(t-1)}) hi=y (t1)2l(yi,y (t1))

  • 将公式中的常数项去掉, 得到:
    L ~ ( t ) ≈ ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) \widetilde{L}(t) \approx \sum_{i = 1}^{n}[g_if_t(x_i)+ \frac{1}{2}h_if^2_t(x_i)] + \Omega(f_t) L (t)i=1n[gift(xi)+21hift2(xi)]+Ω(ft)

  • f t , Ω ( f t ) f_t,\Omega(f_t) ft,Ω(ft) 写成树结构的形式, 即把下式代入目标函数中
    f ( x ) = w q ( x ) f(x) = w_q(x) f(x)=wq(x) , Ω ( f ) = γ T + 1 2 λ ∣ ∣ ω ∣ ∣ 2 \Omega(f) = \gamma T + \frac{1}{2}\lambda||\omega||^{2} Ω(f)=γT+21λω2

  • 得到:
    L ~ ( t ) ≈ ∑ i = 1 n [ g i w q ( x i ) + 1 2 h i w q 2 ( x i ) ] + γ T + 1 2 λ ∣ ∣ ω ∣ ∣ 2 \widetilde{L}(t) \approx \sum_{i = 1}^{n}[g_iw_q(x_i)+ \frac{1}{2}h_iw^2_q(x_i)] + \gamma T + \frac{1}{2}\lambda||\omega||^{2} L (t)i=1n[giwq(xi)+21hiwq2(xi)]+γT+21λω2
    其中 ∑ i = 1 n [ g i w q ( x i ) + 1 2 h i w q 2 ( x i ) ] \sum_{i = 1}^{n}[g_iw_q(x_i)+ \frac{1}{2}h_iw^2_q(x_i)] i=1n[giwq(xi)+21hiwq2(xi)]是对样本累加, 1 2 λ ∣ ∣ ω ∣ ∣ 2 \frac{1}{2}\lambda||\omega||^{2} 21λω2是对叶子节点的累加。

  • 怎么统一起来?
    定义每个叶节点j上的样本集合为: I j = { i ∣ q ( x i ) = j } I_j = \{ i|q(x_i) = j\} Ij={iq(xi)=j}
    则目标函数可以写成按叶节点累加的形式:
    L ~ ( t ) = ∑ j = 1 T [ ( ∑ g i ) w j + 1 2 ( ∑ h i + λ ) w j 2 ] + γ T \widetilde{L}(t) = \sum_{j = 1}^{T}[ (\sum g_i) w_j+ \frac{1}{2}(\sum h_i + \lambda )w^2_j] + \gamma T L (t)=j=1T[(gi)wj+21(hi+λ)wj2]+γT
    = ∑ j = 1 T [ G j w j + 1 2 ( ∑ H j + λ ) w j 2 ] + γ T = \sum_{j = 1}^{T}[ G_jw_j+ \frac{1}{2}(\sum H_j + \lambda )w^2_j] + \gamma T =j=1T[Gjwj+21(Hj+λ)wj2]+γT

  • 如果确定了树的结构( 即 q ( x ) q(x) q(x)确定),为了使目标函数最小, 可以令其导数为0, 解得每个叶节点的最优预测分数为:
    w j ∗ = − G j H j + λ w_j^{*} = -\frac{G_j}{H_j + \lambda} wj=Hj+λGj
    代入目标函数, 得到最小损失为:
    L ~ ∗ = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T \widetilde{L}^{*} = -\frac{1}{2}\sum_{j = 1}^{T}\frac{G^2_j}{H_j + \lambda} + \gamma T L =21j=1THj+λGj2+γT

你可能感兴趣的:(Python,机器学习)