簡介
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