1. 程式人生 > 實用技巧 >GBDT,XGBoost和LightBoost對比

GBDT,XGBoost和LightBoost對比

GBDT

GBDT是整合學習的一種方式,它使用決策樹作為基分類器,通過線性加和的模式將各個及分類器組合起來,形成一個比較強的分類模型。

XGBoost

XGBoost在精度和效能方便都對GBDT做了改進。

  1. XGBoost將損失函式通過泰勒展開式展開,從而引入了二階函式資訊,能夠加快模型的收斂,提高模型的精度。
  2. 在損失函式中加入了正則化,從而控制了模型的複雜度,減輕模型過擬合的風險。正則項中考慮到了樹的葉子結點數量和葉子結點值的平方和,葉子結點的數量同時也限制了樹的高度。引入正則項後,能夠提高模型的泛化能力。
  3. XGBoost支援並行訓練。需要注意的是,這裡的並行並不是樹層次的並行,因為提升演算法本身來講就是個序列結構,所以在樹層次是無法做到並行的。這裡的並行是指特徵粒度的並行,在樹節點分裂的過程中,需要針對多個特徵進行驗證,並選擇資訊增益最大的特徵和分裂點進行分裂,所以並行是在這個方面上進行的。

LightGBM

GBDT和XGBoost在訓練過程中每次迭代樹模型時,都會多次遍歷整個資料集,這個操作比較耗時,同時如果將資料集全部放入記憶體,又會佔用過多的記憶體資源,特別是工業界的訓練資料量。
所以基於以上的考慮,微軟提出了LightGBM演算法,演算法原理方面和GBDT和XGBoost是一致的,都是對負梯度方向殘差的擬合。
在這裡插入圖片描述

樹的生長方式

XGBoost中樹的生長採用了level-wise的方式,然而LightGBM使用的是帶有深度 限制的leaf-wise的方式。
在這裡插入圖片描述
level-wise在分裂節點過程中,會一層一層的分裂葉子節點,同層的葉子節點不加區分地對待,所以某些葉子節點有可能對其分裂增益並不大,從而造成了一些資源和效能浪費。

leaf-wise在分裂節點過程中,會有有限選擇增益比較大的葉子節點對其進行分裂,所以leaf-wise相比level-wise會有更高的精度。但同時相對level-wise,其過擬合風險也會更高,所以需要用樹的深度加以限制。

分裂節點演算法

XGBoost採用了pre-sort預排序演算法,LightGBM採用了histogram直方圖演算法。

pre-sort演算法會將每個特徵的所有數值進行排序,然後對每個分裂點計算資訊增益,最終找到資訊增益最大的特徵和對應的分裂點,進行分裂該葉子節點。
雖然這種做法能夠獲得比較精確的分裂點,但是,需要儲存排序好的每個特徵的資料,所以記憶體佔用是原始資料的兩倍。並且在計算時需要對每個分裂點計算資訊增益,所以計算量也比較大。

histogram演算法會將每個特徵進行量化,使得連續相近的值落入不同的桶中,在分裂節點的時候,我們只需要針對每個桶中的離散值作為分裂節點計算資訊增益,然後選擇資訊增益最大的特徵和分裂點,進行分裂該葉子節點。
histogram演算法只需要儲存每個特徵的離散值,不需要儲存pre-sort的預排序結果,所以記憶體使用會減少很多。另一方面,其每個分裂點的選擇從pre-sort的全體特徵資料減少為桶的數量,因為桶的數量會遠遠少於特徵數量,所以會大幅提升訓練效率。最後使用桶量化的概念相當於正則化,所以會有更高的泛化準確率。
然後再說不足,histogram演算法進行了資料量化,所以在每次分裂時,無法保證獲取最準確的特徵和相應分裂點。如果桶的數量比較少,有可能會造成欠擬合。

在這裡插入圖片描述
另外使用histogram演算法,在對一個葉子節點統計完直方圖後,可以父節點的直方圖和該葉子節點直方圖做差,獲得兄弟節點的直方圖。
在這裡插入圖片描述