從決策樹到XGBoost

XGBoost介紹

一.決策樹

​ If-Else規則的集合,將樣本遞歸地劃分到對應的子空間,實現樣本的分類。

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

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

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

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

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

    HA(D)=i=1nDiDlog2DiD H_A(D)=-\sum_{i=1}^n\frac{|D_i|}{|D|}\log_2\frac{|D_i|}{|D|}

  4. ID3算法和C4.5算法

    大同小異,使用的特徵選擇算法不同而已

三.剪枝

剪枝是通過對損失函數或代價函數進行極小化來實現的。因此,爲了實現簡化樹結構,必須增加對樹結構的懲罰項。
Cα(T)=t=1TNtHt(T)+αT C_\alpha(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T|

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

從模型複雜度與預測正確性之間做出折中。

剪枝條件:Cα(TA)Cα(TB)C_\alpha(T_A)\leq C_\alpha(T_B) (After, Before)

四.CART算法

classification and regression tree.

迴歸樹

迴歸樹模型可表示爲:
f(x)=m=1McmI(xRm) f(x)=\sum_{m=1}^Mc_mI(x\in R_m)
用平方誤差作爲迴歸樹對訓練數據的預測誤差:
xiRm(yif(xi))2 \sum_{x_i\in R_m}(y_i-f(x_i))^2
切分點確定:

遍歷切分點(j, s),最優化:
minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)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爲屬性,s爲屬性的切分點。

分類樹

特徵選擇:基尼指數
Gini(p)=k=1Kpk(1pk)=1k=1Kpk2 Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2
仍然是每一特徵切爲二類,尋找最優切分點:
Gini(D,A)=D1DGini(D1)+D2DGini(D2) Gini(D,A)= \frac{|D_1|}{|D|}Gini(D_1) + \frac{|D_2|}{|D|}Gini(D_2)

CART 剪枝

對CART樹而言,其模型代價函數仍可以用:
Cα(T)=C(T)+αT C_\alpha(T)=C(T)+\alpha|T|
來表示。那麼對於書中的某一結點t,以t爲單節點樹的損失函數爲:
Cα(t)=C(t)+α C_\alpha(t)=C(t)+\alpha
以t爲根節點的模型子樹Tt的損失函數爲:
Cα(Tt)=C(Tt)+αTt C_\alpha(T_t)=C(T_t)+\alpha|T_t|
α=C(t)C(Tt)Tt1\alpha=\frac{C(t)-C(T_t)}{|T_t|-1}​,剪枝與不剪枝的損失函數相等,根據奧卡姆剃刀原理,此時傾向於剪枝。

其實,CART剪枝的核心思想就是根據樹的內部節點t,計算:
g(t)=C(t)C(Tt)Tt1 g(t)=\frac{C(t)-C(T_t)}{|T_t|-1}
根據計算得來的各個g值,選擇不同的α\alpha值,對樹進行剪枝。最後運用交叉驗證方法選擇最優的子樹。

五.前向分步算法

前向分步算法可用加法模型進行表示:
f(x)=m=1Mβmb(x,γm) f(x)=\sum_{m=1}^M\beta_mb(x,\gamma_m)
在第m步,優化目標爲:
(βm,γm)=argminβ,γi=1NL(yi,fm1(xi)+βb(xi;γ)) (\beta_m, \gamma_m)=\arg\min_{\beta, \gamma}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+\beta b(x_i;\gamma))

提升樹模型

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

當使用平方損失函數時,在第m步:
L(y,fm(x))=L(y,fm1(x)+T(x;Θm))=[yfm1(x)T(x;Θm)]2let r=yfm1(x)=[rT(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}

可以看出,第m步其實僅對前m-1個弱分類器預測給出的殘差做了擬合。

梯度提升樹模型

但是,當損失函數不爲平方損失時,T(x;Θm)T(x;\Theta_m)​就不能簡單地對殘差進行擬合。爲此,Freidman提出梯度提升樹算法:
rm=[L(yi,f(xi))f(xi)]f(x)=fm1(x) r_m=- \left[ \frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right]_{f(x)=f_{m-1}(x)}
用第m個CART樹對殘差進行擬合。

六.XGBoost算法

對於一個給定的數據集(n rows, m features) D={(xi,yi)}(D=n,xiRm,yiR)\mathcal D=\{(x_i,y_i)\}(|\mathcal D|=n, x_i\in \mathcal R^m, y_i\in R), 集成樹模型使用K個加法模型預測最終的輸出:
y^i=ϕ(Xi)=k=1Kfk(Xi),fkF \hat y_i = \phi(X_i)=\sum_{k=1}^Kf_k(X_i), f_k\in\mathcal F
在這裏,F={f(X)=ωq(X)}(q:RmT,ωRT)\mathcal F=\{f(X)=\omega_q(X)\}(q:\mathcal R^m\rightarrow T,\omega\in \mathcal R^T )代表迴歸樹的空間。q\mathcal q即代表着將樣本劃分到對應葉子節點的樹結構;T爲樹的葉子節點數目。每一fkf_k代表着獨立的一顆樹的結構以及權重。與決策樹不同的是,迴歸樹的每一葉子節點上包含一個連續的打分,即第ii個葉子結點的打分爲ωi\omega_i

因此在Xgboost中,通過將樣本在對應葉子節點上的權值累加起來,最終給出分類結果。

XGBoost的算法過程其實就是前向分佈算法的過程,不過XGBoost提出了新的損失函數:
L(ϕ)=il(y^i,yi)+kΩ(fk)where Ω(f)=γT+12λω2 L(\phi)=\sum_il(\hat y_i, y_i)+\sum_k\Omega(f_k)\\ where\ \Omega(f)=\gamma T+\frac12\lambda||\omega||^2
將損失函數展開:
Lt=i=1nl(yi,y^it1+ft(Xi))+Ω(ft) \mathcal L^{t}=\sum_{i=1}^nl(y_i,\hat y_i^{t-1}+f_t(X_i))+\Omega(f_t)
根據泰勒展開:
f(x+Δx)=f(x)+f(x)1!Δx+f(x)2!Δx2+O(Δx3) f(x+\Delta x)=f(x)+\frac{f'(x)}{1!}\Delta x+\frac{f''(x)}{2!}\Delta x^2+O(\Delta x^3)
Δx=ft(Xi)\Delta x=f_t(X_i),利用二階展開,利用前t-1步得到的模型給出的損失對第t步的損失進行逼近,得到:
Lti=1n[l(yi,y^it1)+gift(Xi)+12hift2(Xi)]+Ω(ft) \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)
捨棄常數項,展開正則項:
L~t=i=1n[gift(Xi)+12hift2(Xi)]+γT+12λj=1Tωj2 \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\\
將損失函數展開到葉子節點上,令Ij={iq(Xi)=j}I_j=\{i|q(X_i)=j\}
L~t=j=1T[(iIjgi)wj+12(iIjhi+λ)wj2]+γ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
Gj=iIjgi,Hj=iIjhiG_j=\sum_{i\in I_j}g_i, H_j=\sum_{i\in I_j}h_i,對以上損失函數進行求導,在導數爲零時得到損失函數極小值,求得最優權值爲:
ωj=GjHj+λ \omega_j^*=-\frac{G_j}{H_j+\lambda}
將求得的權值代入損失函數:
L~t(q)=12j=1TGj2Hj+λ+γT \tilde{\mathcal L}^t(q)=-\frac12\sum_{j=1}^T\frac{G_j^2}{H_j+\lambda}+\gamma T
所以XGBoost的切分點是通過求使得損失函數下降最大的位置得來的:
Lsplit=12[GL2HL+λ+GR2HR+λGI2HI+λ]γ \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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章