XGBoost介绍

XGBoost介绍

文章目录

  • XGBoost介绍
    • 一.决策树
    • 二.信息增益和信息增益比
    • 三.剪枝
    • 四.CART算法
      • 回归树
      • 分类树
      • CART 剪枝
    • 五.前向分步算法
      • 提升树模型
      • 梯度提升树模型
    • 六.XGBoost算法

一.决策树

​ If-Else规则的集合,将样本递归地划分到对应的子空间,实现样本的分类。

二.信息增益和信息增益比

  1. 熵:
    H ( X ) = − ∑ i = 1 n p i log ⁡ p i H(X)=-\sum_{i=1}^np_i\log p_i H(X)=i=1npilogpi

  2. 信息增益:
    g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)H(DA)

    H ( D ∣ A ) = ∑ i = 1 ∣ A ∣ ∣ D i ∣ ∣ D ∣ H ( D i ) H(D|A)=\sum_{i=1}^{|A|}\frac{|D_i|}{|D|}H(D_i) H(DA)=i=1ADDiH(Di)

  3. 信息增益比
    g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A)=\frac{g(D,A)}{H_A(D)} gR(D,A)=HA(D)g(D,A)

    H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ log ⁡ 2 ∣ D i ∣ ∣ D ∣ H_A(D)=-\sum_{i=1}^n\frac{|D_i|}{|D|}\log_2\frac{|D_i|}{|D|} HA(D)=i=1nDDilog2DDi

  4. ID3算法和C4.5算法

    大同小异,使用的特征选择算法不同而已

三.剪枝

剪枝是通过对损失函数或代价函数进行极小化来实现的。因此,为了实现简化树结构,必须增加对树结构的惩罚项。
C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ C_\alpha(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T| Cα(T)=t=1TNtHt(T)+αT

C α ( T ) = C ( T ) + α ∣ T ∣ C_\alpha(T)=C(T)+\alpha|T| Cα(T)=C(T)+αT

从模型复杂度与预测正确性之间做出折中。

剪枝条件: C α ( T A ) ≤ C α ( T B ) C_\alpha(T_A)\leq C_\alpha(T_B) Cα(TA)Cα(TB) (After, Before)

四.CART算法

classification and regression tree.

回归树

回归树模型可表示为:
f ( x ) = ∑ m = 1 M c m I ( x ∈ R m ) f(x)=\sum_{m=1}^Mc_mI(x\in R_m) f(x)=m=1McmI(xRm)
用平方误差作为回归树对训练数据的预测误差:
∑ x i ∈ R m ( y i − f ( x i ) ) 2 \sum_{x_i\in R_m}(y_i-f(x_i))^2 xiRm(yif(xi))2
切分点确定:

遍历切分点(j, s),最优化:
min ⁡ j , s [ min ⁡ c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + min ⁡ c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] \min_{j,s} \left[ \min_{c_1}\sum_{x_i\in R_1(j,s)}(y_i-c_1)^2+ \min_{c_2}\sum_{x_i\in R_2(j,s)}(y_i-c_2)^2 \right] j,sminc1minxiR1(j,s)(yic1)2+c2minxiR2(j,s)(yic2)2

其中j为属性,s为属性的切分点。

分类树

特征选择:基尼指数
G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2 Gini(p)=k=1Kpk(1pk)=1k=1Kpk2
仍然是每一特征切为二类,寻找最优切分点:
G i n i ( D , A ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) Gini(D,A)= \frac{|D_1|}{|D|}Gini(D_1) + \frac{|D_2|}{|D|}Gini(D_2) Gini(D,A)=DD1Gini(D1)+DD2Gini(D2)

CART 剪枝

对CART树而言,其模型代价函数仍可以用:
C α ( T ) = C ( T ) + α ∣ T ∣ C_\alpha(T)=C(T)+\alpha|T| Cα(T)=C(T)+αT
来表示。那么对于书中的某一结点t,以t为单节点树的损失函数为:
C α ( t ) = C ( t ) + α C_\alpha(t)=C(t)+\alpha Cα(t)=C(t)+α
以t为根节点的模型子树Tt的损失函数为:
C α ( T t ) = C ( T t ) + α ∣ T t ∣ C_\alpha(T_t)=C(T_t)+\alpha|T_t| Cα(Tt)=C(Tt)+αTt
α = C ( t ) − C ( T t ) ∣ T t ∣ − 1 ​ \alpha=\frac{C(t)-C(T_t)}{|T_t|-1}​ α=Tt1C(t)C(Tt),剪枝与不剪枝的损失函数相等,根据奥卡姆剃刀原理,此时倾向于剪枝。

其实,CART剪枝的核心思想就是根据树的内部节点t,计算:
g ( t ) = C ( t ) − C ( T t ) ∣ T t ∣ − 1 g(t)=\frac{C(t)-C(T_t)}{|T_t|-1} g(t)=Tt1C(t)C(Tt)
根据计算得来的各个g值,选择不同的 α \alpha α值,对树进行剪枝。最后运用交叉验证方法选择最优的子树。

五.前向分步算法

前向分步算法可用加法模型进行表示:
f ( x ) = ∑ m = 1 M β m b ( x , γ m ) f(x)=\sum_{m=1}^M\beta_mb(x,\gamma_m) f(x)=m=1Mβmb(x,γm)
在第m步,优化目标为:
( β m , γ m ) = arg ⁡ min ⁡ β , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) ) (\beta_m, \gamma_m)=\arg\min_{\beta, \gamma}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+\beta b(x_i;\gamma)) (βm,γm)=argβ,γmini=1NL(yi,fm1(xi)+βb(xi;γ))

提升树模型

f M ( x ) = ∑ m = 1 M T ( x , Θ m ) f_M(x)=\sum_{m=1}^MT(x,\Theta_m) fM(x)=m=1MT(x,Θm)

当使用平方损失函数时,在第m步:
L ( y , f m ( x ) ) = L ( y , f m − 1 ( x ) + T ( x ; Θ m ) ) = [ y − f m − 1 ( x ) − T ( x ; Θ m ) ] 2 let  r = y − f m − 1 ( x ) = [ r − T ( x ; Θ m ) ] 2 \begin{matrix}\\ L(y,f_m(x))&=&L(y,f_{m-1}(x)+T(x;\Theta_m))\\ &=&[y-f_{m-1}(x)-T(x;\Theta_m)]^2\\ \text{let }r=y-f_{m-1}(x)\\ &=&[r-T(x;\Theta_m)]^2 \end{matrix} L(y,fm(x))let r=yfm1(x)===L(y,fm1(x)+T(x;Θm))[yfm1(x)T(x;Θm)]2[rT(x;Θm)]2

可以看出,第m步其实仅对前m-1个弱分类器预测给出的残差做了拟合。

梯度提升树模型

但是,当损失函数不为平方损失时, T ( x ; Θ m ) ​ T(x;\Theta_m)​ T(x;Θm)就不能简单地对残差进行拟合。为此,Freidman提出梯度提升树算法:
r m = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_m=- \left[ \frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right]_{f(x)=f_{m-1}(x)} rm=[f(xi)L(yi,f(xi))]f(x)=fm1(x)
用第m个CART树对残差进行拟合。

六.XGBoost算法

对于一个给定的数据集(n rows, m features) D = { ( x i , y i ) } ( ∣ D ∣ = n , x i ∈ R m , y i ∈ R ) \mathcal D=\{(x_i,y_i)\}(|\mathcal D|=n, x_i\in \mathcal R^m, y_i\in R) D={(xi,yi)}(D=n,xiRm,yiR), 集成树模型使用K个加法模型预测最终的输出:
y ^ i = ϕ ( X i ) = ∑ k = 1 K f k ( X i ) , f k ∈ F \hat y_i = \phi(X_i)=\sum_{k=1}^Kf_k(X_i), f_k\in\mathcal F y^i=ϕ(Xi)=k=1Kfk(Xi),fkF
在这里, F = { f ( X ) = ω q ( X ) } ( q : R m → T , ω ∈ R T ) \mathcal F=\{f(X)=\omega_q(X)\}(q:\mathcal R^m\rightarrow T,\omega\in \mathcal R^T ) F={f(X)=ωq(X)}(q:RmT,ωRT)代表回归树的空间。 q \mathcal q q即代表着将样本划分到对应叶子节点的树结构;T为树的叶子节点数目。每一 f k f_k fk代表着独立的一颗树的结构以及权重。与决策树不同的是,回归树的每一叶子节点上包含一个连续的打分,即第 i i i个叶子结点的打分为 ω i \omega_i ωi

因此在Xgboost中,通过将样本在对应叶子节点上的权值累加起来,最终给出分类结果。

XGBoost的算法过程其实就是前向分布算法的过程,不过XGBoost提出了新的损失函数:
L ( ϕ ) = ∑ i l ( y ^ i , y i ) + ∑ k Ω ( f k ) w h e r e   Ω ( f ) = γ T + 1 2 λ ∣ ∣ ω ∣ ∣ 2 L(\phi)=\sum_il(\hat y_i, y_i)+\sum_k\Omega(f_k)\\ where\ \Omega(f)=\gamma T+\frac12\lambda||\omega||^2 L(ϕ)=il(y^i,yi)+kΩ(fk)where Ω(f)=γT+21λω2
将损失函数展开:
L t = ∑ i = 1 n l ( y i , y ^ i t − 1 + f t ( X i ) ) + Ω ( f t ) \mathcal L^{t}=\sum_{i=1}^nl(y_i,\hat y_i^{t-1}+f_t(X_i))+\Omega(f_t) Lt=i=1nl(yi,y^it1+ft(Xi))+Ω(ft)
根据泰勒展开:
f ( x + Δ x ) = f ( x ) + f ′ ( x ) 1 ! Δ x + f ′ ′ ( x ) 2 ! Δ x 2 + O ( Δ x 3 ) f(x+\Delta x)=f(x)+\frac{f'(x)}{1!}\Delta x+\frac{f''(x)}{2!}\Delta x^2+O(\Delta x^3) f(x+Δx)=f(x)+1!f(x)Δx+2!f(x)Δx2+O(Δx3)
Δ x = f t ( X i ) \Delta x=f_t(X_i) Δx=ft(Xi),利用二阶展开,利用前t-1步得到的模型给出的损失对第t步的损失进行逼近,得到:
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 ) \mathcal L^{t}\approx\sum_{i=1}^n[l(y_i,\hat y_i^{t-1})+g_if_t(X_i)+\frac12h_if_t^2(X_i)]+\Omega(f_t) Lti=1n[l(yi,y^it1)+gift(Xi)+21hift2(Xi)]+Ω(ft)
舍弃常数项,展开正则项:
L ~ t = ∑ i = 1 n [ g i f t ( X i ) + 1 2 h i f t 2 ( X i ) ] + γ T + 1 2 λ ∑ j = 1 T ω j 2 \tilde{\mathcal L}^t=\sum_{i=1}^n [ g_if_t(X_i)+ \frac12h_if_t^2(X_i) ]+ \gamma T+\frac12\lambda\sum_{j=1}^T\omega_j^2\\ L~t=i=1n[gift(Xi)+21hift2(Xi)]+γT+21λj=1Tωj2
将损失函数展开到叶子节点上,令 I j = { i ∣ q ( X i ) = j } I_j=\{i|q(X_i)=j\} Ij={iq(Xi)=j}
L ~ t = ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T \tilde{\mathcal L}^t=\sum_{j=1}^T [ (\sum_{i\in I_j}g_i)w_j+ \frac12(\sum_{i\in I_j}h_i+\lambda)w_j^2 ]+\gamma T L~t=j=1T[(iIjgi)wj+21(iIjhi+λ)wj2]+γT
G j = ∑ i ∈ I j g i , H j = ∑ i ∈ I j h i G_j=\sum_{i\in I_j}g_i, H_j=\sum_{i\in I_j}h_i Gj=iIjgi,Hj=iIjhi,对以上损失函数进行求导,在导数为零时得到损失函数极小值,求得最优权值为:
ω j ∗ = − G j H j + λ \omega_j^*=-\frac{G_j}{H_j+\lambda} ωj=Hj+λGj
将求得的权值代入损失函数:
L ~ t ( q ) = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T \tilde{\mathcal L}^t(q)=-\frac12\sum_{j=1}^T\frac{G_j^2}{H_j+\lambda}+\gamma T L~t(q)=21j=1THj+λGj2+γT
所以XGBoost的切分点是通过求使得损失函数下降最大的位置得来的:
L s p l i t = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − G I 2 H I + λ ] − γ \mathcal L_{split}=\frac12 \left[ \frac{G_L^2}{H_L+\lambda}+ \frac{G_R^2}{H_R+\lambda}- \frac{G_I^2}{H_I+\lambda} \right]-\gamma Lsplit=21[HL+λGL2+HR+λGR2HI+λGI2]γ

你可能感兴趣的:(机器学习基础知识)