一文掌握XGBoost核心原理
XGBoost是經典的提升樹學習框架,其配套論文和PPT分享也相當經典,本文簡單梳理其思路,原文見XGBoost原理簡介。
整體思路
和一般提升模型一樣,提升樹模型也遵循相同的正規化
- 採用加法模型「forward stage-wise manner」
- 每輪引入一weak learner「此處是一棵CART樹」
- 學習之前weak learners的不足「用梯度表徵」
同時要考慮過擬合等問題「overfitting is everywhere」。
Tree Ensemble
遵循李航老師統計學習三要素公式
假設空間「模型」
Tree Ensemble基本思想是將多棵樹的結果融合作為最終輸出,示意圖如下

paper-xgboost-tree-ensemble
不難看出,模型的 假設空間 是一系列CART樹的整合,輸出為
其模型引數為 顆樹
目標函式「策略」
模型假設有了,另一個核心元素就是目標函式,和一般監督模型一樣
目標函式分兩部分「 Bias-variance tradeoff is everywhere 」
- Training Loss measures how well model fit on training data
- Regularization measures complexity of model
具體到Tree Ensemble,其目標函式為
優化求解「演算法」
模型引數的最終求解。引數 為
顆樹,無法用SGD類似方法優化求解,因為不是
空間上的數值向量。一般採用Additive Training(Boosting)的思想求解。
Gradient Boosting
Tree Ensemble章節回答了what we are learning的問題,Gradient Boosting章節要回答how do we learn的問題。
Additive Traing正規化
採用Additive Training(Boosting)的模式,即每一輪學習一顆新樹

paper-xgboost-boosting
學習一顆新樹
問題是每一輪 中,
如何學習?
Define objective(loss, regularization) and optimize it.
在第 輪,樹的每一次生長,確定 選那個特徵分裂 / 分裂點取在哪裡 即可。其依據是使Objective最小,這裡涉及兩點,即
取何值Objective最小,以及Objective最小值表示式是什麼。
定義Objective及其近似
Objective是 的一般函式,其最小值一般表示式並不完全確定「not general」。XGBoost對其進行 二階泰勒展開 近似,推導變換後Objective可形式化為
個獨立的 二項式 ,表示式可統一「只需Objective一階二階可導即可」。
以下簡單梳理推導核心步驟。

paper-xgboost-taylor-expansion
其中每次迭代 視為
泰勒近似展開,用一階二階導表示。對應到Square Loss後理解會更直觀一些,一階導正比於殘差,二階導為常數。
經過簡化,現在Objective為
此時學習只依賴loss function一階二階導,理論理解和工程實現都簡潔不少。
The learning of function only depend on the objective via and
.
確定Objective最小值
為方便推導,需要一些符號表示上的輔助
- 變換樹的表達方式,見下文「 如何表徵一棵樹 」章節
-
表示落在第
個葉子節點所有樣本集合
- 詳細符號含義見下文「 符號約定 」章節
- 「 正則項 」考慮葉子節點數以及葉子分的L2範數,見下圖

paper-xgboost-regularization
不難推導如下式子
對上述四個式子幾點解釋
- 式子1是經過泰勒展開近似的目標函式
- 式子2考慮樹新表達方式,公式加入正則項
- 式子3將
個樣本,按劃分的葉子節點重新group,整合train loss和regularization
- 式子4引入
和
簡化表達
- 式子4是
個獨立的二項式
對二項式 ,在
取極值
。不難得出
取值為
時,Obj有以下最小值
最小值中包含兩項,第一項表示樹擬合好壞,第二項表示樹的複雜度。如此,即可根據gain選擇分裂特徵和分裂點了。
一點驗證
當模型為GBDT,Loss選為Square Loss,不加正則項,其結論應該跟上述推導完全一致。Square Loss
求一階導
即其一階導是 負殘差 。求二階導,其值為常數
Square Loss情況下,取 集合的均值「殘差均值」作為該節點預測值「optimal weight」,應該跟
保持一致。
不難看出
-
此處無正則
-
為
樣本個數
-
殘差之和
綜上,其optimal weight即為殘差均值,其實是XGBoost裡 的特例。
如何表徵一棵樹
決策樹可看做一系列If-Then規則的集合,但這樣表示起來比較麻煩。為了方便公式的推導,XGBoost將其表示為一向量。
Think regression tree as a function that maps the attributes to the score. We define tree by a vector of scores in leafs , and a leaf index mapping function that maps an instance to a leaf.
即用長度為 「葉子節點數」的 向量
和將樣本例項對映到葉子索引的 對映函式
表示。

paper-xgboost-tree
這樣樹的預測輸出可直接用 表示,跟正則項
保持一致,公式表示推導上比較方便。
如何防止過擬合
XGBoost中有很多防止過擬合手段,比如
正則化
每一輪樹的目標函式Objective中可以包含正則項,是防止過擬合經典手段
Shrinkage
每一輪樹都不完全擬合殘差或梯度,給後續學習器學習的空間
is called step-size or shrinkage, usually set around 0.1. This means we do not do full optimization in each step and reserve chance for future rounds, it helps prevent overfitting
Column Subsampling
隨機森林裡使用的經典方法,也叫做feature subsampling,每次只用一部分特徵學習,也可防止過擬合。
Candidate Proposal
在選擇連續特徵分裂點時,不遍歷所有可能值「exact greedy algorithm」,而是由資料分位點生成一系列候選「candidate proposal」,從中選擇分裂點。這樣不僅降低了計算量,同時還有一定防止過擬合效果。
特徵重要性
樹模型一個優點就是可以確定特徵重要性,具體如何做呢?XGBoost裡提供這幾個衡量標準
- 該特徵作為分裂特徵在所有樹中出現的次數
- 該特徵作為分裂特徵的增益「avg&total」
- 該特徵作為分裂特徵的對樣本的覆蓋「avg&total」
詳細可參考文件Python API Reference。
當然還有更一般化確定特徵重要性的方法,比如 Permutation Test ,林軒田老師在機器學習技法中隨機森林章節中有介紹。其基本思想是某一維特徵做permutation,依據模型performance的下降程度判定特徵重要性。
符號約定
-
表示樣本輸入
-
表示模型在
上的輸出
-
表示第
論學習的樹
-
表示Training Loss
-
表示樹
的複雜度,正則項
-
表示
對應的葉子節點索引
-
表示樹葉子節點對應的得分向量
-
表示樹葉子節點數
-
表示落到
節點上樣本集
-
表示
集合一階導之和
-
表示
集合二階導之和