XGBoost原理簡介
XGBoost是GBDT的改進和重要實現,主要在於:
- 提出稀疏感知(sparsity-aware)算法。
- 加權分位數快速近似學習算法。
- 緩存訪問模式,數據壓縮和分片上的實現上的改進。
- 加入了Shrinkage和列采樣,一定程度上防止過擬合。
提升算法
XGBoost也是一個加法模型,首先其在目標函數中加入了正則化項:
泰勒級數
yi(t)是第i個實例在第t次叠代的預測值,需要加入 ft來最小化以下目標
通過泰勒二階展開近似來快速優化目標函數
其中
即l的一階和二階導數。移除常數項得到:
定義 Ij = {i|q(xi)=j}作為葉子結點j的實例集合。將上式展開為:
計算權重公式:
帶入目標函數得(一階和二階導數合並成了一項):
這一項算出的值就是第t棵樹要優化目標函數,使其盡量小。下圖展示計算過程,目標函數越小越好。
枚舉所有可能結構的樹是不可能的,通過貪心算法從葉節點開始叠代得添加分支,IL、IR分別是分割點左右分支的實例集,分割的損失下降定義為:
Weighted Quantile Sketch-加權分位
近似算法通過特征百分位點作為劃分候選。使集合代表樣本點的第k個特征值和二階導數。定義排序函數:
上式表示特征值小於z的樣本占整體的比例。目標是找到候選切分點{sk1, sk2, ···,skl}使得:
其中ε是近似因子,這意味著有1/ε個候選點,每個數據點權重是hi,下式說明為什麽用它做權重:
其中hi即為平方損失的權重,對於大數據集,找到滿足條件的候選分裂是非常重要的。以前的分位算法中沒有權重,因為加權數據集沒有分位數。
為了解決這個問題,XGBoost提出了新穎的分布式加權的分位數算法,作者理論證明它可以處理加權的數據。總的思路是提出一個支持合並和修剪操作的數據結構,每個操作都被證明保持一定的準確性水平。 證明見xgboost-supp.pdf。
Sparsity-aware Split Finding
真實數據很多都是稀疏的數據,有很多原因:1.數據中有缺失值。2.統計中頻繁出現0條目。3.人工特征工程造成,例如one-hot。為了算法稀疏感知,XGBoost每個樹節點加入了默認方向,如圖:
當數據值缺失的時候,樣本被劃分到默認方向,默認方向是通過學習數據獲得的,其算法如下圖,關鍵提升在於只看不缺失的實例進入Ik,所提出的算法將不存在作為缺失值處理,並學習處理缺失值的最佳方向。 通過將枚舉限制為恒定的解決方案,當不存在對應於用戶指定的值時,也可以應用相同的算法。
大多數現有的樹學習算法或者只是針對密集數據進行優化,或者需要特定的程序來處理有限的情況,如分類編碼。 XGBoost以統一的方式處理所有的稀疏模式。 更重要的是,作者的方法利用稀疏性使計算復雜度與輸入中非缺失條目的數量成線性關系。 下圖顯示了稀疏感知和對Allstate-10K數據集簡單實現的比較。 作者發現稀疏感知算法的運行速度比原始版本快50倍。這證實了稀疏感知算法的重要性。
參考
XGBoost原理-XGBoost A Scalable Tree Boosting System
XGBoost原理簡介