一文入門:XGBoost與手推二階導

做者前言

在2020年還在整理XGB的算法,其實已經有點過期了。。不過,主要是爲了學習算法嘛。如今的大數據競賽,XGB基本上已經全面被LGB模型取代了,這裏主要是學習一下Boost算法。以前已經在其餘博文中介紹了Adaboost算法和Gradient-boost算法,這篇文章講解一下XGBoost。算法

Adaboost和XGBoost無關,可是Gradient-boost與XGBoost有必定關係。
一文搞懂:Adaboost及手推算法案例
一文讀懂:GBDT梯度提高微信

樹模型概述

XGB就是Extreme Gradient Boosting極限梯度提高模型。XGB簡單的說是一組分類和迴歸樹(CART)的組合。跟GBDT和Adaboost都有殊途同歸之處。
【CART=classification adn regression trees】網絡

這裏對於一個決策樹,如何分裂,如何選擇最優的分割點,其實就是一個搜索的過程。搜索怎麼分裂,才能讓目標函數最小。目標函數以下:
\(Obj = Loss + \Omega\)
\(Obj\)就是咱們要最小化的優化函數,\(Loss\)就是這個CART模型的預測結果和真實值得損失。\(\Omega\)就是這個CART模型的複雜度,相似神經網絡中的正則項。
【上面的公式就是一個抽象的概念。咱們要知道的是:CART樹模型即要求預測儘量準確,又要求樹模型不能過於複雜。】app

對於迴歸問題,咱們能夠用均方差來做爲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\)。】spa

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篇精選文章。

微信搜索公衆號:你好世界煉丹師。期待您的關注。

相關文章
相關標籤/搜索