XGBoost算法原理

簡介

XGBoost算法是以CART爲基分類器的集成學習方法之一,因爲其出色的運算效率和預測準確率在數據建模比賽中獲得普遍的應用。與隨機森林賦予每一顆決策樹相同的投票權重不一樣,XGBoost算法中下一棵決策樹的生成和前一棵決策樹的訓練和預測相關(經過對上一輪決策樹訓練準確率較低的樣本賦予更高的學習權重來提升模型準確率)。相比於其餘集成學習算法,XGBoost一方面經過引入正則項和列抽樣的方法提升了模型穩健性,另外一方面又在每棵樹選擇分裂點的時候採起並行化策略從而極大提升了模型運行的速度。html

須要提早了解的知識

關於 XGBoost自己的原理及相關知識,陳天奇的課件已經寫得很完善了,只不過我一直都喜歡將他人的知識用本身的語言闡述從而內化吸取的笨方法。

1.監督學習的相關概念

監督學習簡單理解就是研究自帶訓練標籤的數據,經過構造一個目標函數來描述自變量和因變量的映射關係。其中目標函數可抽象爲訓練偏差$L(\Theta)$和正則項$\Omega(\Theta)$之和:算法

$$ \begin{aligned} Obj(\Theta) &= L(\Theta) + \Omega(\Theta) \\ &= \sum_{i=1}^{n}l(y_i, \hat y_i) + \lambda||w||^q \end{aligned} $$app

其中$l(y_i, \hat y_i)$叫作損失函數,衡量了預測值和真實值的誤差程度;$\lambda||w||^q$叫作正則項,$q$取值通常爲$1$($L1$正則項)或者$2$($L2$正則項)。

2.分類與迴歸樹CART

CART樹自己的原理我在此前的文章已經闡述地比較清楚了,這裏再也不贅述。機器學習

決策樹引論和CART算法函數

3.泰勒展開式

當$ f(x) $在$ x=x_0 $處具備$ n $階連續導數,咱們能夠用$ x-x_0 $的$ n $次多項式逼近函數

公式:學習

$$ f(x) = \frac{f(x_0)}{0!}+\frac{f'(x_0)}{1!}(x-x_0)+\frac{f''(x_0)}{2!}(x-x_0)^2+...+\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n+R^n(x) $$優化

其中$ R^n(x) $表示泰勒餘項,它是$ (x-x_0)^n $的高階無窮小。spa

模型創建與目標函數

XGBoost自己屬於監督學習,假設XGBoost模型自己由$K$棵CART構成,那麼模型可表示以下,其中$f_k$表示第$k$棵樹,$f_k(x_i)$表示第$i$個樣本在第$k$棵樹的得分:3d

$$ \hat y_i = \sum_{i=1}^{K} f_k(x_i) $$code

須要注意的是,XGBoost中基分類樹每一個葉子節點都會給出對應的得分,經過加總多棵樹的得分實現集成學習。下圖以「一我的是否喜歡玩電腦遊戲」展現了多棵樹如何進行預測(預測分值越高表示越喜歡玩遊戲):

同大部分機器學習模型同樣,XGBoost的目標函數也能表示爲損失函數和正則項之和,分別控制模型的準確度和複雜度(這二者每每難以同時最優化,須要進行權衡):

$$ \begin{aligned} Obj(\Theta) &= L(\Theta) + \Omega(\Theta) \\ &= \sum_{i=1}^{n}l(y_i, \hat y_i) + \sum_{k=1}^{K} \Omega(f_k) \end{aligned} $$

參數優化思路

按照機器學習的思路,給出具體的目標函數以後就是參數求解的過程(經過求解參數表達式使損失函數最小化)。因爲$\hat y_i=f_k(x_i)$,XGBoost模型的參數$\Theta$即$K$棵CART樹組成的向量:

$$ \Theta = \{f_1, f_2,...,f_K\} $$

模型的損失函數值$L(\Theta)$越小代表模型的擬合效果越佳,正則項$\Omega(\Theta)$越小代表模型的複雜度越低,所以咱們的目的就是最小化目標函數$Obj(\Theta)$從而求解出參數向量$\Theta$。
接下來就是如何描述一棵樹$f_k$的問題,要肯定一棵樹須要以下兩方面的內容:

  • 樹的結構,即將樣本映射到不一樣葉子節點的函數
  • 各個葉子節點的分數

在不清楚每棵樹的具體結構狀況下,直接最優化目標函數是不可能的,XGBoost利用加法模型簡化模型目標函數,在前一棵CART基礎上訓練下一棵決策樹:

$$ \hat y_i^{(0)} = 0 \\ \hat y_i^{(1)} = \hat y_i^{(0)} + f_1(x_i) \\ \hat y_i^{(2)} = f_1(x_i) + f_2(x_i) = \hat y_i^{(1)} + f_2(x_i) \\ ...\\ \hat y_i^{(K)} = \sum_{k=1}^{K} = \hat y_i^{(K-1)} + f_K(x_i) $$

參數估計

將目標函數最優化的過程經過貪心算法的思想轉化爲$K$輪迭代,其中第$t$輪迭代時的目標函數可表示爲:

$$ \begin{aligned} Obj^{(t)}(\Theta) &= \sum_{i=1}^{n}l(y_i,\hat y_i^{(t)}) + \sum_{k=1}^{t} \Omega(f_k) \\ &= \sum_{i=1}^{n}l(y_i,\hat y_i^{(t-1)}+f_t(x_i)) + \Omega(f_t) + \sum_{k=1}^{t-1}\Omega(f_k) \\ &= \sum_{i=1}^{n}l(y_i,\hat y_i^{(t-1)}+f_t(x_i)) + \Omega(f_t) + constant \end{aligned} $$

考慮以均方偏差做爲損失函數,咱們能夠將目標函數表示爲:

$$ \begin{aligned} Obj^{(t)}(\Theta) &= \sum_{i=1}^{n}\Big (y_i - (\hat y_i^{(t-1)} + f_t(x_i))\Big )^2 + \Omega(f_t) + constant \\ &= \sum_{i=1}^{n}\Big[ 2(\hat y_i^{(t-1)} - y_i) f_t(x_i) + f_t(x_i)^2 \Big] + \Omega(f_t) + constant \end{aligned} $$

仔細觀察上述這個式子,因爲求解$Obj^{(t)}(\Theta)$時前一棵樹$f_{t-1}$是已知的,所以$\hat y_i^{(t-1)}$也就是常量。所以$Obj^{(t)}(\Theta)$就是關於$f_t(x_i)$的二次表達式,爲後續的參數求解提供便利。

$f_t(·)$就是第$t$棵樹由樣本集到葉子節點的映射函數,$f_t(x_i)$就是樣本對應的某個葉子節點的分數值。

在機器學習競賽中用過XGBoost的小夥伴確定還知道該算法能夠自定義損失函數,對於通常的損失函數,咱們人爲定義損失函數一階微分和二階微分:

$$ g_i = \partial_{\hat y^{(t-1)}}l(y_i, \hat y^{(t-1)}) \\ h_i = \partial^2_{\hat y^{(t-1)}} l(y_i, \hat y^{(t-1)}) $$

利用泰勒展開式咱們能夠把目標函數近似化簡爲:

$$ \begin{aligned} Obj^{(t)}(\Theta) &\approx \sum_{i=1}^{n} \Big[ l(y_i, \hat y_i^{(t-1)}) + g_if_t(x_i) + \frac{1}{2} h_if_t^2(x_i)\Big] + \Omega(f_t) + constant \\ &= \sum_{i=1}^{n} \Big[ g_if_t(x_i) + \frac{1}{2}h_if_t^2(x_i) \Big] + \Omega(f_t) + constant \end{aligned} $$

以前咱們提到一棵樹$f_t(·)$可由它的結構(即樣本到葉子節點的映射函數)和每一個葉子節點上的分數惟一肯定,如今咱們給出第$t(1\leq t \leq K)$棵樹的描述函數:

$$ f_t(x) = w_{q(x)}, w\in R^T, q:R^d \rightarrow\{1,2,...,T\} $$

其中$q(·)$表示樹的結構,$w$表示每一個葉子節點的分數的$T$維向量,$d$和$T$分別表示訓練數據集特徵維度和葉子節點數。

咱們再定義樹的複雜度$\Omega(f_t)$爲:

$$ \Omega(f_t) = \gamma T + \frac{1}{2} \lambda \sum_{j=1}^{T} w_j^2 $$

上式出現的$\gamma$和$\lambda$都是自定義懲罰係數,前者用於控制葉子節點的個數,後者用於控制參數向量的模,二者都是在約束 CART的複雜度。

代入$f_t(x)$的定義到目標函數中,再定義映射到葉子節點$j(1\leq j \leq T)$的樣本集合爲$I_j = \{ i| q(x)=j \}$:

$$ \begin{aligned} Obj^{(t)} &\approx \sum_{i=1}^{n} \Big[ g_if_t(x_i) + \frac{1}{2}h_if_t^2(x_i) \Big] + \Omega(f_t) \\ &= \sum_{i=1}^{n} \Big[ g_iw_{q(x)} + \frac{1}{2} h_iw^2_{q(x_i)} \Big] + \gamma T +\lambda \frac{1}{2}\sum_{j=1}^{T}w_j^2 \\ &= \sum_{j=1}^{T} \Big[ (\sum_{i\in I_j}g_i)w_j + \frac{1}{2}(\sum_{i\in I_j} h_i + \lambda)w_j^2 \Big] + \gamma T \end{aligned} $$

每一輪迭代中$g_i(1\leq i \leq n)$和$h_i(1\leq i \leq n)$在給定損失函數下都至關因而常量,其中$n$表示訓練集樣本量,咱們人爲定義$G_j = \sum_{i\in I_j}g_i$和$H_j = \sum_{i\in I_j}h_i$再一次精簡一下目標函數:

$$ \begin{aligned} Obj^{(t)} &= \sum_{j=1}^T \Big[ (\sum_{i\in I_j}g_i)w_j + \frac{1}{2}(\sum_{i \in I_j} h_i + \lambda) w_j^2 \Big] + \gamma T \\ &= \sum_{j=1}^T \Big[ G_jw_j + \frac{1}{2}(H_j + \lambda)w_j^2 \Big] + \gamma T \end{aligned} $$

基於二次函數最優化,咱們能夠求解出參數和目標函數的最優值:

$$ w_j^* = -\frac{G_j}{H_j + \lambda} \\ Obj = -\frac{1}{2} \sum_{j=1}^{T} \frac{G_j^2}{H_j + \lambda} + \gamma T $$

如何肯定樹的複雜度

在上一步參數估計中,咱們構造了映射到第$j$個葉子節點的樣本集合$I_j = \{i | q(x_i) = j\}$,這至關於咱們在已知每棵樹結構的基礎上進行參數估計。
當特徵維度較大時,樹的結構難以窮盡,所以XGBoost藉助普通決策樹的貪心算法思路求解「最優」的結構,即從深度爲$0$開始,每次split對目標函數的影響爲:

$$ Gain = \frac{1}{2} \Big[ \frac{G_L^2}{H_L + \lambda} + \frac{G_R^2}{H_R + \lambda} - \frac{(G_L+G_R)^2}{H_L+H_R + \lambda} \Big] - \gamma $$

中括號內第一部分表示split後左葉子節點的得分,第二部分表示右葉子節點的得分,第三部分表示不進行split的得分。$\gamma$是咱們引入的複雜度懲罰因子,衡量了額外葉子節點帶來的複雜度損失。
自此求解最優樹結構的思想和CART幾乎一致,這裏便再也不贅述。求解完樹結構後,根據前面參數估計的內容咱們能夠很方便地給出來每一個葉子節點的權重。

Reference

[1] https://xgboost.readthedocs.i...

相關文章
相關標籤/搜索