LightGBM

自從微軟推出了LightGBM,其在工業界表現的越來越好,很多比賽的Top選手也掏出LightGBM上分。所以,本文介紹下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採用Histogram算法進行特徵選擇以及採用Leaf-wise的決策樹生長策略,使其在一批以樹模型爲基模型的boosting算法中脫穎而出。在時間和空間上都更勝一籌,準確率也比其他模型表現得更好。這些模型在處理一般規模的數據時,單機即可以解決,然而當數據規模更大時,即需要進行分佈式計算,分擔每臺機器(worker)的壓力。這篇文章介紹LightGBM的兩種並行學習算法(Feature Parallel & Data Parallel),以及他們較傳統並行算法的特別之處。

- Feature Parallel
特徵並行算法目的是在決策樹生成過程中的每次迭代,高效地找到最優特徵分裂點。特徵並行的主要思想是在不同機器在不同的特徵集合上分別尋找最優的分割點,然後在機器間同步最優的分割點。

傳統的特徵並行算法

根據不同的特徵子集,將數據集進行垂直切分。(不同機器worker有不同的特徵子集)
每個worker尋找局部的最優分裂特徵以及分裂點。
不同worker之間進行網絡傳輸,交換最優分裂信息,最終得到最優的分裂信息。
具有最優分裂特徵的worker,局部進行分裂,並將分裂結果廣播到其他worker。
其他worker根據接收到的數據進行切分數據。
該方法不能有效地加速特徵選擇的效率,當數據量#data很大時,該並行方法不能加快效率。並且,最優的分裂結果需要在worker之間進行傳輸,需要消耗很多的傳輸資源以及傳輸時間。

LightGBM的特徵並行算法 
LightGBM並沒有垂直的切分數據集,而是每個worker都有全量的訓練數據,因此最優的特徵分裂結果不需要傳輸到其他worker中,只需要將最優特徵以及分裂點告訴其他worker,worker隨後本地自己進行處理。處理過程如下:

每個worker在基於局部的特徵集合找到最優分裂特徵。
workder間傳輸最優分裂信息,並得到全局最優分裂信息。
每個worker基於全局最優分裂信息,在本地進行數據分裂,生成決策樹。
然而,當數據量很大時,特徵並行算法還是受限於特徵分裂效率。因此,當數據量大時,推薦使用數據並行算法。

- Data Parallel
傳統的數據並行算法

水平切分數據集。
每個worker基於數據集構建局部特徵直方圖(Histogram)。
歸併所有局部的特徵直方圖,得到全局直方圖。
找到最優分裂信息,進行數據分裂。
缺點:網絡傳輸代價比較大,如果使用point-to-point的傳輸算法,每個worker的傳輸代價爲O(#machine * #feature * #bin). 如果使用All Reduce並行算子,傳輸代價爲O(2* #feature * #bin).

LightGBM的數據並行算法 
LightGBM算法使用Reduce Scatter並行算子歸併來自不同worker的不同特徵子集的直方圖,然後在局部歸併的直方圖中找到最優局部分裂信息,最終同步找到最優的分裂信息。
除此之外,LightGBM使用直方圖減法加快訓練速度。我們只需要對其中一個子節點進行數據傳輸,另一個子節點可以通過histogram subtraction得到。
LightGBM可以將傳輸代價降低爲O(0.5 * #feature * #bin)。
基於投票的並行算法 
基於投票機制的並行算法,是在每個worker中選出top k個分裂特徵,然後將每個worker選出的k個特徵進行彙總,並選出全局分裂特徵,進行數據分裂。有理論證明,這種voting parallel以很大的概率選出實際最優的特徵,因此不用擔心top k的問題。
--------------------- 

原文:https://blog.csdn.net/ictcxq/article/details/78736442 
 

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