LightGBM算法的特別之處
-
LightGBM算法在模型的訓練速度和內存方面都有相應的優化。
基於樹模型的boosting算法,很多算法比如(xgboost 的默認設置)都是用預排序(pre-sorting)算法進行特征的選擇和分裂。
- 首先,對所有特征按數值進行預排序。
- 其次,在每次的樣本分割時,用O(# data)的代價找到每個特征的最優分割點。
- 最后,找到最后的特征以及分割點,將數據分裂成左右兩個子節點。
優缺點:
這種pre-sorting算法能夠准確找到分裂點,但是在空間和時間上有很大的開銷。
i. 由於需要對特征進行預排序並且需要保存排序后的索引值(為了后續快速的計算分裂點),因此內存需要訓練數據的兩倍。
ii. 在遍歷每一個分割點的時候,都需要進行分裂增益的計算,消耗的代價大。
LightGBM采用Histogram算法,其思想是將連續的浮點特征離散成k個離散值,並構造寬度為k的Histogram。然后遍歷訓練數據,統計每個離散值在直方圖中的累計統計量。在進行特征選擇時,只需要根據直方圖的離散值,遍歷尋找最優的分割點。
Histogram 算法的優缺點:
- Histogram算法並不是完美的。由於特征被離散化后,找到的並不是很精確的分割點,所以會對結果產生影響。但在實際的數據集上表明,離散化的分裂點對最終的精度影響並不大,甚至會好一些。原因在於decision tree本身就是一個弱學習器,采用Histogram算法會起到正則化的效果,有效地防止模型的過擬合。
- 時間上的開銷由原來的O(#data * #features)降到O(k * #features)。由於離散化,#bin遠小於#data,因此時間上有很大的提升。
- Histogram算法還可以進一步加速。一個葉子節點的Histogram可以直接由父節點的Histogram和兄弟節點的Histogram做差得到。一般情況下,構造Histogram需要遍歷該葉子上的所有數據,通過該方法,只需要遍歷Histogram的k個捅。速度提升了一倍。
LightGBM的leaf-wise的生長策略
它摒棄了現在大部分GBDT使用的按層生長(level-wise)的決策樹生長策略,使用帶有深度限制的按葉子生長(leaf-wise)的策略。level-wise過一次數據可以同時分裂同一層的葉子,容易進行多線程優化,也好控制模型復雜度,不容易過擬合。但實際上level-wise是一種低效的算法,因為它不加區分的對待同一層的葉子,帶來了很多沒必要的開銷,因為實際上很多葉子的分裂增益較低,沒必要進行搜索和分裂。
Leaf-wise則是一種更為高效的策略,每次從當前所有葉子中,找到分裂增益最大的一個葉子,然后分裂,如此循環。因此同Level-wise相比,在分裂次數相同的情況下,Leaf-wise可以降低更多的誤差,得到更好的精度。Leaf-wise的缺點是可能會長出比較深的決策樹,產生過擬合。因此LightGBM在Leaf-wise之上增加了一個最大深度的限制,在保證高效率的同時防止過擬合。
LightGBM支持類別特征
實際上大多數機器學習工具都無法直接支持類別特征,一般需要把類別特征,轉化one-hotting特征,降低了空間和時間的效率。而類別特征的使用是在實踐中很常用的。基於這個考慮,LightGBM優化了對類別特征的支持,可以直接輸入類別特征,不需要額外的0/1展開。並在決策樹算法上增加了類別特征的決策規則。
以上是LightGBM算法的特別之處,除此之外LightGBM還具有高校並行的特點。下一篇文章將介紹LightGBM的特征並行(Feature Parallel)和數據並行(Data Parallel),以及相較於傳統的並行方法的優點。