XGBoost的推導和說明


簡介

XGBoost是“Extreme Gradient Boosting”的縮寫,其中“Gradient Boosting”一詞在論文Greedy Function Approximation: A Gradient Boosting Machine中,由Friedman提出。XGBoost 也是基於這個原始模型改進的。

XGBoost提出后,不僅成為各大數據科學比賽的必殺武器,在實際工作中,XGBoost也在被各大公司廣泛地使用。

 

樹集成

XGBoost屬於Boosting集成學習算法的一種,它以CART為基學習器,CART是一棵二叉樹,每個葉子都有一個分數,如下圖所示

 通常,一棵樹過於簡單,所以集成學習將多棵樹進行結合,常常獲得比單棵樹優越的泛化性能。

XGBoost是加法模型,它會把多棵樹的預測加到一起,預測得分是每棵樹的預測分數之和,如下圖所示

 

可以用下面的數學公式描述我們的模型

其中,$K$是樹的數量,$f_{k}$是一棵樹,$F$是所有可能的CART樹集合。

 

樹提升

加性訓練

XGBoost的目標函數為

機器學習中的目標函數總是由兩個部分組成:訓練損失部分 和 正則化部分。

正如上式一樣,前面是損失部分,后面是正則化部分,在XGBoost中將全部K棵樹的復雜度進行求和,添加到目標函數中作為正則化項

損失函數用來描述模型與訓練數據的契合程度,正則化項用來描述模型的某些性質,比如模型的復雜度。

常見的損失函數有平方損失和log損失,表達式分別如下

我們要學習的是那些函數$f$,每個函數都包含了樹的結構和葉節點的分數。一次性地學習出所有的樹是很棘手的,在XGBoost中采用“加性策略”(additive strategy)學習模型:保持學習到的結果不變,每次添加一棵新的樹。 如果$y^{(t)}_{i}$表示第$t$步的預測值,則有:

那么我們每次都要留下哪棵樹?一個很自然的想法就是選擇可以優化我們目標函數的那棵樹。前面 $t-1$ 棵樹的模型復雜度是一個常數,我的目標函數可以寫為

 如果采用平方損失作為損失函數,可以變為下面的形式

使用平方損失函數有許多友好的地方,它具有一階項(通常稱為殘差)和二次項。對於其他形式的損失函數,並不容易獲得這么好的形式。一般情況下,我們可以用泰勒公式展開損失函數

泰勒公式的二階展開式如下

展開后的目標函數變為

其中,$g$是一階偏導,$h$是二階偏導

上面的目標函數中 $l(y,\hat{y})$是前t-1棵樹帶來的損失,是一個常數,下面把常數項去掉,第t步的目標函數就變成了

這個定義的損失函數只取決於$g$$h$,這就是XGBoost支持自定義損失函數的方式,我們可以優化包括log損失在內的每一個損失函數,對損失函數求一階和二階偏導,得到g和h,然后帶到上面的公式中就可以了。

 

模型復雜度

我們介紹了模型的訓練,但還沒定義模型復雜度$\Omega (f)$,我們先改進一棵樹的定義為:

其中$w$是葉節點上的分數向量,$q$是將輸入數據映射到某個葉節點的函數,$T$是葉節點的數量。我們定義XGBoost的復雜度為

它由兩部分組成:(1)葉結點的數量 和 (2)葉結點分數向量的L2范數;

 

結構分數

將上面得到式子帶到前面得到的目標函數中,有

其中

 它存放着被映射到第$j$個葉子節點的數據 $x_{i}$的索引集合。

上面目標函數的第二行中,式子修改了求和符號的下標,由$i$=1變為 $i\in I_{j}$,這是因為同一葉節點上的數據有相同的分數。

我們可以進一步壓縮這個目標函數:

其中

這個目標函數中,$w_{j}$彼此獨立,而

二次式,我們可以用頂點公式找出最優解

對於給定結構$q(x)$,使目標函數最小化的$w^{*}_{j}$的取值和最小化的目標函數為

最后一個公式用於衡量樹形結構的好壞,分數越小,模型的結構越好。

如果這聽起來有點復雜,那么讓我們看看下面圖片,分數是如何計算的。

總的來說,對於給定的樹結構,我們把 $g$ 和 $h$ 放到它們對應的葉節點中,對這些數據進行求和,然后使用公式計算樹有多好。

這個分數類似於決策樹中的不純度,只是它還考慮了模型的復雜性。

 

學習樹結構

現在我們有了一種方法來衡量一棵樹的質量,理想情況下,我們將枚舉所有可能的樹並選擇最佳的樹。

實際上這是棘手的,所以我們將嘗試每次優化樹的一層。具體來說,我們嘗試將一個葉節點分成葉節點,其分數增益為

公式從左到右可分解為4個部分

  • 1)新左葉上的分數
  • 2)新右葉上的分數
  • 3)原始葉上的分數
  • 4)附加葉上的正則化。

如果增益小於$\gamma$,說明添加一個節點沒有帶來模型性能的提升,容易導致過擬合,我們最好不要添加該分支。這正是基於樹的模型中的剪枝技術。

 

對於實值數據,我們通常希望找到最佳分割點。為了有效地做到這一點,我們將所有樣本排好序,如下圖所示。

然后從左到右的掃描,就足以計算所有可能的分割方案的結構得分,我們可以有效地找到最佳的拆分。

 

參考文章

https://xgboost.readthedocs.io/en/latest/tutorials/model.html

https://blog.csdn.net/weixin_30443813/article/details/96532052


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM