梯度提升決策樹(GBDT)與XGBoost、LightGBM


一、Boosting

GBDT屬於集成學習(Ensemble Learning)中的boosting算法。

Boosting算法過程如下:

(1) 分步去學習weak classifier,最終的strong claissifier是由分步產生的classifier’組合‘而成的 
(2) 根據每步學習到的classifier去reweight樣本(分錯的樣本權重加大,反之減小)

Boosting實際采用加法模型(classifier的線性組合)+前向分布,如果每次在Boosting中的基函數(classifier)使用決策樹的算法就是Boosting Tree. 

Boosting更像是一種思想, gradient boosting是一種boosting的方法. 它主要的思想是,每一次建立模型是在之前建立模型損失函數的梯度下降方向,假設分步模型下當前模型是f(x),利用損失函數L的負梯度在f(x)下的值作為boosting tree算法中的殘差(residual)去擬合一個回歸樹。

GBDT的全稱是Gradient Boosting Decision Tree,Gradient Boosting和Decision Tree是兩個獨立的概念。因此我們先說說Boosting。Boosting的概念很好理解,意思是用一些弱分類器的組合來構造一個強分類器。因此,它不是某個具體的算法,它說的是一種理念。和這個理念相對應的是一次性構造一個強分類器。像支持向量機,邏輯回歸等都屬於后者。通常,我們通過相加來組合分類器,形式如下:

GBDT和xgboost和lightGBM在競賽和工業界使用都非常頻繁,能有效的應用到分類、回歸、排序問題,GBDT 中的決策樹是回歸樹,預測結果是一個數值,在點擊率預測方面常用 GBDT,例如用戶點擊某個內容的概率。雖然使用起來不難,但是要能完整的理解還是有一點麻煩的。本文嘗試一步一步梳理GB、GBDT並簡要介紹xgboost、lightgbm,它們之間有非常緊密的聯系,GBDT是以決策樹(CART)為基學習器的GB算法,xgboost擴展和改進了GBDT,xgboost算法更快,准確率也相對高一些,lightgbm則是在xgboost的基礎上,根據xgboost存在的缺點,進一步改進優化。。

  

二、 Gradient Boosting(GB)

機器學習中的學習算法的目標是為了優化或者說最小化loss Function, Gradient boosting的思想是迭代生多個(M個)弱的模型,然后將每個弱模型的預測結果相加,后面的模型Fm+1(x)基於前面學習模型的Fm(x)的效果生成的,關系如下:

1 \le m \le M     F_{m+1}(x) = F_m(x) + h(x)

GB算法的思想很簡單,關鍵是怎么生成h(x)?

如果損失函數是回歸問題的平方誤差,很容易想到最理想的h(x)應該是能夠完全擬合y - F_m(x) ,這就是常說基於殘差的學習,也就是Boosting Tree算法(《統計學習方法》中的算法8.3:回歸樹算法)。殘差學習在回歸問題中可以很好的使用,但是為了一般性(分類,排序問題),實際中往往是基於loss Function 在函數空間的的負梯度學習,對於回歸問題的損失函數為\frac{1}{2}(y - F(x))^2時,殘差和負梯度也是相同的。L(y, f)中的f,不要理解為傳統意義上的函數,而是一個函數向量\! f(x_1), \ldots, f(x_n),向量中元素的個數與訓練樣本的個數相同,因此基於Loss Function函數空間的負梯度的學習也稱為“偽殘差”,由於此時基於損失函數空間的負梯度學習,因此就是Gradient Boosting Tree算法。

Boosting Tree算法是Gradient Boosting Tree算法的損失函數采用平方損失函數時的特殊情況,此時2(a)中損失函數的負梯度方向rmi= y - fm-1(xi),即我們所說的殘差,此時2(c)中的cmj即為該區域Rmj中y的平均值。

所以GB算法的大致步驟如下圖(《統計學習方法》中的算法8.4:梯度提升算法):

步驟(2)即為迭代生成M個基學習器的步驟

2(a)表示計算損失函數的負梯度在當前模型的值,將其作為殘差的估計值(擬殘差); 

2(b)表示估計回歸樹葉子節點的區域,以擬合殘差的近似值; 其實也就是把擬殘差單做目標變量,划分目標區域,然后結合(c)進一步生成回歸樹。

,以損失函數為平方損失函數時尋找切分點的公式為例,損失函數為其他函數時,替換。

 

 

2(c)表示利用線性搜索估計葉子節點區域的值,使得損失函數最小化; 

2(d)更新回歸樹;

 

三、Gradient Boosting Decision Tree

理解GBDT重點首先是Gradient Boosting,其次才是 Decision Tree。GBDT 是 Gradient Boosting 的一種具體實例,只不過這里的弱分類器是決策樹。如果你改用其他弱分類器 XYZ(選擇的前提是低方差和高偏差。框架服從boosting 框架即可。),你也可以稱之為 Gradient Boosting XYZ。只不過 Decision Tree 很好用,GBDT 才如此引人注目。 

GB算法中最典型的基學習器是決策樹,尤其是CART,正如名字的含義,GBDT是GB和DT的結合。要注意的是這里的決策樹是回歸樹,GBDT中的決策樹是個弱模型(由於boosting模型會在每一輪的基礎上更加擬合數據,可以保證bias,因此每個基學習器需要保證低variance,這與bagging模型的RF正好相反),深度較小一般不會超過5,葉子節點的數量也不會超過10,對於生成的每棵決策樹乘上比較小的縮減系數(學習率<0.1),有些GBDT的實現加入了隨機抽樣(subsample 0.5<=f <=0.8)提高模型的泛化能力。通過交叉驗證的方法選擇最優的參數。因此GBDT實際的核心問題在於2(b),基學習器的生成,也就是CART回歸樹的生成。在我之前的博客中已經詳述了CART回歸樹的生成,在這就不再介紹了。

 

四、GBDT用於分類

GBDT中的DT是回歸樹,但GBDT也可以解決分類問題,解決辦法是用softmax來產生原本離散型label的概率,進而可以用解決回歸問題的思路來解決分類問題。

以下內容摘自博客https://www.cnblogs.com/ModifyRong/p/7744987.html,感謝博主的分享,具體GBDT用於分類的例子在博客中有詳細介紹。

 

五、XGBoost

Xgboost是GB算法的高效實現,xgboost中的基學習器除了可以是CART(gbtree)也可以是線性分類器(gblinear)。下面所有的內容來自原始paper,包括公式。

(1). xgboost在目標函數中顯示的加上了正則化項,基學習為CART時,正則化項與樹的葉子節點的數量T和葉子節點的值有關。

(2). GB中使用Loss Function對f(x)的一階導數計算出偽殘差用於學習生成fm(x),xgboost不僅使用到了一階導數,還使用二階導數。

  第t次的loss:

  對上式做二階泰勒展開:g為一階導數,h為二階導數

(3). 上面提到CART回歸樹中尋找最佳分割點的衡量標准是最小化均方差,xgboost尋找分割點的標准是最大化,lamda,gama與正則化項相關

xgboost算法的步驟和GB基本相同,都是首先初始化為一個常數,gb是根據一階導數ri,xgboost是根據一階導數gi和二階導數hi,迭代生成基學習器,相加更新學習器。

xgboost與gdbt除了上述三點的不同,xgboost在實現時還做了許多優化

    • 在尋找最佳分割點時,考慮傳統的枚舉每個特征的所有可能分割點的貪心法效率太低,xgboost實現了一種近似的算法。大致的思想是根據百分位法列舉幾個可能成為分割點的候選者,然后從候選者中根據上面求分割點的公式計算找出最佳的分割點。
    • xgboost考慮了訓練數據為稀疏值的情況,可以為缺失值或者指定的值指定分支的默認方向,這能大大提升算法的效率,paper提到50倍。
    • 特征列排序后以塊的形式存儲在內存中,在迭代中可以重復使用;雖然boosting算法迭代必須串行,但是在處理每個特征列時可以做到並行。
    • 按照特征列方式存儲能優化尋找最佳的分割點,但是當以行計算梯度數據時會導致內存的不連續訪問,嚴重時會導致cache miss,降低算法效率。paper中提到,可先將數據收集到線程內部的buffer,然后再計算,提高算法的效率。
    • xgboost 還考慮了當數據量比較大,內存不夠時怎么有效的使用磁盤,主要是結合多線程、數據壓縮、分片的方法,盡可能的提高算法的效率。

 

六、LightGBM

概括來說,lightGBM主要有以下特點:

    • 基於Histogram的決策樹算法

    • 帶深度限制的Leaf-wise的葉子生長策略

    • 直方圖做差加速

    • 直接支持類別特征(Categorical Feature)

    • Cache命中率優化

    • 基於直方圖的稀疏特征優化

    • 多線程優化

前2個特點使我們尤為關注的。

Histogram算法

直方圖算法的基本思想:先把連續的浮點特征值離散化成k個整數,同時構造一個寬度為k的直方圖。遍歷數據時,根據離散化后的值作為索引在直方圖中累積統計量,當遍歷一次數據后,直方圖累積了需要的統計量,然后根據直方圖的離散值,遍歷尋找最優的分割點。

帶深度限制的Leaf-wise的葉子生長策略

Level-wise過一次數據可以同時分裂同一層的葉子,容易進行多線程優化,也好控制模型復雜度,不容易過擬合。但實際上Level-wise是一種低效算法,因為它不加區分的對待同一層的葉子,帶來了很多沒必要的開銷,因為實際上很多葉子的分裂增益較低,沒必要進行搜索和分裂。

Leaf-wise則是一種更為高效的策略:每次從當前所有葉子中,找到分裂增益最大的一個葉子,然后分裂,如此循環。因此同Level-wise相比,在分裂次數相同的情況下,Leaf-wise可以降低更多的誤差,得到更好的精度。

Leaf-wise的缺點:可能會長出比較深的決策樹,產生過擬合。因此LightGBM在Leaf-wise之上增加了一個最大深度限制,在保證高效率的同時防止過擬合。

 

七、總結

本文詳細介紹了集成模型中的Boosting思想,以及gradient Boosting、GBDT的算法流程,XGBoost以及lightGBM都是在GB以及GBDT基礎上的優化和改進,本文並沒有詳細分析原理,僅簡單的對比了優缺點。

總結GBDT的部分優點:

GBDT 它的非線性變換比較多,表達能力強,而且不需要做復雜的特征工程和特征變換。

GBDT是拿Decision Tree作為GBM里的弱分類器,GBDT的優勢 首先得益於 Decision Tree 本身的一些良好特性,具體可以列舉如下:

  1. Decision Tree 可以很好的處理 missing feature,這是他的天然特性,因為決策樹的每個節點只依賴一個 feature,如果某個 feature 不存在,這顆樹依然可以拿來做決策,只是少一些路徑。像邏輯回歸,SVM 就沒這個好處。
  2. Decision Tree 可以很好的處理各種類型的 feature,也是天然特性,很好理解,同樣邏輯回歸和 SVM 沒這樣的天然特性。

  3. 對特征空間的 outlier 有魯棒性,因為每個節點都是 x < 𝑇 的形式,至於大多少,小多少沒有區別,outlier 不會有什么大的影響,同樣邏輯回歸和 SVM 沒有這樣的天然特性。

  4. 如果有不相關的 feature,沒什么干擾,如果數據中有不相關的 feature,頂多這個 feature 不出現在樹的節點里。邏輯回歸和 SVM 沒有這樣的天然特性(但是有相應的補救措施,比如邏輯回歸里的 L1 正則化)。

  5. 數據規模影響不大,因為我們對弱分類器的要求不高,作為弱分類器的決策樹的深 度一般設的比較小,即使是大數據量,也可以方便處理。像 SVM 這種數據規模大的時候訓練會比較麻煩。 

當然 Decision Tree 也不是毫無缺陷,通常在給定的不帶噪音的問題上,他能達到的最佳分類效果還是不如 SVM,邏輯回歸之類的。但是,我們實際面對的問題中,往往有很大的噪音,使得 Decision Tree 這個弱勢就不那么明顯了。而且,GBDT 通過不斷的疊加組合多個小的 Decision Tree,他在不帶噪音的問題上也能達到很好的分類效果。換句話說,通過GBDT訓練組合多個小的 Decision Tree 往往要比一次性訓練一個很大的 Decision Tree 的效果好很多。因此不能把 GBDT 理解為一顆大的決策樹,幾顆小樹經過疊加后就不再是顆大樹了,它比一顆大樹更強。  

 

參考鏈接:

https://cloud.tencent.com/developer/article/1005611

http://blog.csdn.net/gavin__zhou/article/details/71156715

https://www.cnblogs.com/wxquare/p/5541414.html

https://www.cnblogs.com/bentuwuying/p/6667267.html

https://www.cnblogs.com/ModifyRong/p/7744987.html

http://blog.csdn.net/niaolianjiulin/article/details/76584785


免責聲明!

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



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