XGBoost--切分點查找算法

1:前言:

本篇博客省去了從樹模型到GBDT,再到XGBoost的漸進演變邏輯過程和數學推導,主要講述XGBoost在每輪訓練生成新的樹模型時,採取的切分點選擇算法和相關數學證明。

2:背景

XGBoost在每輪訓練生成新的樹模型時,首先計算所有特徵在所有切分點分裂前後的Obj_split,然後選取Obj_split最大特徵及其切分點作爲最優特徵和最優切分點。XGBoost提供了多種最優特徵和最優切分點的查找算法,統稱爲切分點查找算法。

2.1:精確貪心算法

XGBoost在生成新樹的過程中國,最基本的操作是節點分裂,節點分裂中最重要的緩解是找到最優特徵及最優切分點,然後將葉子節點按照最優特徵和最優切分點進行分裂。

選取最優特徵和最優分裂點的思路如下:

首先找到所有的候選特徵及所有的候選切分點,依次求得Obj_split,後選取Obj_split最大特徵及其切分點作爲最優特徵和最優切分點作爲最優特徵和最優切分點,因此將其稱爲精確貪心算法。該算法是一種啓發式算法,因爲節點在分裂時只選擇當前最優的分裂策略,而非全局最優的分裂策略。

精確貪心算法的計算過程:


此算法會對所有的特徵進行遍歷。在遍歷過程中,對於每個特徵,都會我將該及節點包含的樣本按該特徵值進行排序,排序後按照:。這種方式對左子節點和右子節點求梯度統計,因爲G、H由該節點的所有樣本的g、h求和所得,因此當節點分裂條件有k< j,變成k< j+1時,左子節點的統計特徵變爲,右子節點的統計特徵變爲,其中是更新後的值,即在原來的基礎上減去。最後找到收益醉的的特徵和分裂點進行分裂。

此算法的複雜度爲O(nlogn),需要處理d個特徵,進行K輪,因此算法的複雜度爲O(ndKnlogn)。


2.2:基於直方圖的近似算法

精確貪心算法在選擇最有特徵和最優切分點時是一種十分有效的算法,它計算了所有特徵和所有切分點的收益,並從中選擇了最優的,從而保證模型能比較好的擬合訓練數據。但是當數據不能完全加載到內存時,精確貪心算法變得十分低效,算法在計算過程中需要不斷在內存和磁盤之間進行數據交換,這是一個非常耗時的過程,並且在分佈式環境中面臨同樣的問題。

爲了能夠更高效的選擇最優特徵及切分點,XGBoost提出一種急死算法來解決該問題。

基於直方圖的近似算法的主要思想:對某種特徵尋找最優切分點時,首先對該特徵的所有切分點按分位數(如百分位數)分桶,得到一個候選切分點集,特徵的每一個切分點都可以分到對應的分桶,然後對每個分桶計算特徵統計G和H,得到直方圖,G爲該桶內所有樣本一階特徵g之和,H爲該桶內所有樣本二階特徵統計h之和,最後選擇所有候選特徵及候選切分點中對應桶的特徵統計收益最大的作爲最優特徵及最優切分點。基於直方圖的近似算法的計算過程如下:

 


近似算法也可以用在分佈式樹學習的環境中。其基本思想如下:首先將數據劃分到多個worker節點上,在每輪訓練中,worker計算本幾點上數據梯度統計生成直方圖,並將數據直方圖傳遞給主節點,主節點依據各個節點梯度統計數據對節點進行分裂生成新的一層,主節點將下一層信息發送給worker節點,worker節點再在新一層的基礎上生成數據直方圖,重複上述過程,直至決策樹達到預定的深度後停止。

近似算法實現了兩種候選切分點的構建策略:全局策略和本地策略。全局策略是在樹構建的初始階段對每一個特徵確定一個候選切分點的集合,並在該樹的每一層的節點分裂中均採用刺激和計算收益,整個過程候選切分點集合不改變。本地策略則是在每一次節點分裂時重新確定候選切分點。全局策略需要更細的分桶才能達到本地的精確度,但全局策略在選取候選切分點集合時比本地策略更簡單。


2.3:快速直方圖算法

快速直方圖算法實質上是在近似算法的基礎上的優化,通過前面的內容,基於直方圖的近似算法將每個切分點劃分到對應的分桶中,構建直方圖數據,然後根據直方圖數據近似求解最優特徵和最優切分點,從而減少內存和磁盤之間的數據交互,提高計算效率。

雖然近似算法相比精確貪心算法在計算性能上提升很多,但直方圖聚合仍是構建樹的過程中一個主要的計算瓶頸,因此XGBoost參考FastBDT和LightGBM 實現了快速直方圖算法。

快速直方圖算法在多次迭代中重用之前的分桶,並以此爲基礎進行了一些優化。

(1)數據預處理:連續性特徵一般用浮點型數據表示,但在樹分裂過程中一般僅會用到梯度統計信息,而算法僅僅對值進行相互比較,並不會用到值本身,因此可以將浮點數據均映射爲整型數據,一般以直方圖的索引爲映射值,因爲CPU對整型運算的效率要比浮點型效率計算高很多,因此算法的性能可以提升很多。

(2)桶緩存:將上述數據結構進行緩存,在模型擬合過程中進行復用,提升計算效率。

(3)直方圖減法技巧:簡化節點直方圖的計算,直接取父節點和兄弟節點的差。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章