一文入門:XGBoost與手推二階導
阿新 • • 發佈:2020-06-23
# 作者前言
在2020年還在整理XGB的演算法,其實已經有點過時了。。不過,主要是為了學習演算法嘛。現在的大資料競賽,XGB基本上已經全面被LGB模型取代了,這裡主要是學習一下Boost演算法。之前已經在其他博文中介紹了Adaboost演算法和Gradient-boost演算法,這篇文章講解一下XGBoost。
Adaboost和XGBoost無關,但是Gradient-boost與XGBoost有一定關係。
[一文搞懂:Adaboost及手推演算法案例](http://helloworld2020.net/482/)
[一文讀懂:GBDT梯度提升](http://helloworld2020.net/491/)
# 樹模型概述
XGB就是Extreme Gradient Boosting極限梯度提升模型。XGB簡單的說是**一組分類和迴歸樹(CART)**的組合。跟GBDT和Adaboost都有異曲同工之處。
【CART=classification adn regression trees】
這裡對於一個決策樹,如何分裂,如何選擇最優的分割點,其實就是一個搜尋的過程。搜尋怎麼分裂,才能讓目標函式最小。目標函式如下:
$Obj = Loss + \Omega$
$Obj$就是我們要最小化的優化函式,$Loss$就是這個CART模型的預測結果和真實值得損失。$\Omega$就是這個CART模型的複雜度,類似神經網路中的正則項。
**【上面的公式就是一個抽象的概念。我們要知道的是:CART樹模型即要求預測儘可能準確,又要求樹模型不能過於複雜。】**
對於迴歸問題,我們可以用均方差來作為Loss:
$Loss=\sum_i{(y_i-\hat{y_i})^2}$
對於分類問題,用交叉熵是非常常見的,這裡用二值交叉熵作為例子:
$Loss = \sum_i{(y_ilog(\hat{y_i})+(1-y_i)log(\hat{y_i}))}$
總之,這個Loss就是衡量模型預測準確度的損失。
****
下面看一下如何計算這個模型複雜度$\Omega$吧。
$\Omega = \gamma T+\frac{1}{2} \lambda \sum^T_j{w_j}^2$
$T$表示葉子節點的數量,$w_j$表示每個葉子節點上的權重(與葉子節點的樣本數量成正比)。
【這裡有點麻煩的在於,$w_j$是與每個葉子節點的樣本數量成正比,但是並非是樣本數量。這個$w_j$的求取,要依靠與對整個目標函式求導數,然後找到每個葉子節點的權重值$w_j$。】
# XGB vs GBDT
其實說了這麼多,感覺XGB和GDBT好像區別不大啊?下面整理一下網上有的說法,再加上自己的理解。有錯誤請指出評論,謝謝!
## 區別1:自帶正則項
GDBT中,只是讓新的弱分類器來擬合負梯度,那擬合多少棵樹才算好呢?不知道。XGB的優化函式中,有一個$\Omega$複雜度。這個複雜度不是某一課CART的複雜度,而是XGB中所有CART的總複雜度。可想而知,每多一顆CART,這個複雜度就會增加他的懲罰力度,當損失下降小於複雜度上升的時候,XGB就停止了。
## 區別2:有二階導數資訊
GBDT中新的CART擬合的是負梯度,也就是一階導數。而在XGB會考慮二階導數的資訊。
這裡簡單推導一下XGB如何用上二階導數的資訊的:
1. 之前我們得到了XGB的優化函式:
$Obj = Loss + \Omega$
2. 然後我們把Loss和Omega寫的更具體一點:
$Obj = \sum_i^n{Loss(y_i,\hat{y}_i^t)}+\sum_j^t{\Omega(cart_j)}$
- $\hat{y_i^t}$表示總共有t個CART弱分類器,然後t個弱分類器給出樣本i的估計值就。
- $y_i$第i個樣本的真實值;
- $\Omega(cart_j)$第j個CART模型的複雜度。
3. 我們現在要求取第t個CART模型的優化函式,所以目前我們只是知道前面t-1的模型。所以我們得到:
$\hat{y}_i^t = \hat{y}_i^{t-1}+f_t(x_i)$
t個CART模型的預測,等於前面t-1個CART模型的預測加上第t個模型的預測。
4. 所以可以得到:
$\sum_i^n{Loss(y_i,\hat{y}_i^t)}=\sum_i^n{Loss(y_i,\hat{y}_i^{t-1}+f_t(x_i))}$
這裡考慮一下特勒展開:
$f(x+\Delta x)\approx f(x)+f'(x)\Delta x + \frac{1}{2} f''(x)\Delta x^2$
5. 如何把泰勒公式帶入呢?
${Loss(y_i,\hat{y}_i^t)}$中的$y_i$其實就是常數,不是變數
所以其實這個是可以看成$Loss(\hat{y}_i^t)$,也就是:
$Loss(\hat{y}_i^{t-1}+f_t(x_i))$
6. 帶入泰勒公式,把$f_t(x_i)$看成$\Delta x$:
$Loss(\hat{y}_i^{t-1}+f_t(x_i))=Loss(\hat{y}_i^{t-1})+Loss'(\hat{y}_i^{t-1})f_t(x_i)+\frac{1}{2}Loss''(\hat{y}_i^{t-1})(f_t(x_i))^2$
- 在很多的文章中,會用$g_i=Loss'(\hat{y}_i^{t-1})$,以及$h_i=Loss''(\hat{y}_i^{t-1})$來表示函式的一階導數和二階導數。
7. 把泰勒展開的東西帶回到最開始的優化函式中,刪除掉常數項$Loss(\hat{y}_i^{t-1})$(這個與第t個CART模型無關呀)以及前面t-1個模型的複雜度,可以得到第t個CART的優化函式:
$Obj^t \approx \sum_i^n{[g_i f_t(x_i)+\frac{1}{2}h_i(f_t(x_i))^2}]+{\Omega(cart_t)}$
**【所以XGB用到了二階導數的資訊,而GBDT只用了一階的梯度】**
## 區別3:列抽樣
XGB借鑑了隨機森林的做法,不僅僅支援樣本抽樣,還支援特徵抽樣(列抽樣),不僅可以降低過擬合,還可以減少計算。
## 區別4:缺失值
XGB可以自適應的處理樣本中的缺失值。如何處理的這裡就不再講述。
****
喜歡的話請關注我們的微信公眾號~【你好世界煉丹師】。
- 公眾號主要講統計學,資料科學,機器學習,深度學習,以及一些參加Kaggle競賽的經驗。
- 公眾號內容建議作為課後的一些相關知識的補充,飯後甜點。
- 此外,為了不過多打擾,公眾號每週推送一次,每次4~6篇精選文章。
微信搜尋公眾號:你好世界煉丹師。期待您的關注。
![](http://helloworld2020.net/wp-content/uploads/2020/06/預設標題_橫版二維碼_2020-06-21-