不久前微軟DMTK(分佈式機器學習工具包)團隊在GitHub上開源了性能超越其他boosting工具的LightGBM,在三天之內GitHub上被star了1000次,fork了200次。知乎上有近千人關注「如何看待微軟開源的LightGBM?」問題,被評價爲「速度驚人」,「非常有啓發」,「支持分佈式」,「代碼清晰易懂」,「佔用內存小」等。
LightGBM (Light Gradient Boosting Machine)(請點擊https://github.com/Microsoft/LightGBM)是一個實現GBDT算法的框架,支持高效率的並行訓練。
LightGBM在Higgs數據集上LightGBM比XGBoost快將近10倍,內存佔用率大約爲XGBoost的1/6,並且準確率也有提升。GBDT在每一次迭代的時候,都需要遍歷整個訓練數據多次。如果把整個訓練數據裝進內存則會限制訓練數據的大小;如果不裝進內存,反覆地讀寫訓練數據又會消耗非常大的時間。尤其面對工業級海量的數據,普通的GBDT算法是不能滿足其需求的。
LightGBM提出的主要原因就是爲了解決GBDT在海量數據遇到的問題,讓GBDT可以更好更快地用於工業實踐。
直方圖算法的基本思想是先把連續的浮點特徵值離散化成k個整數(其實又是分桶的思想,而這些桶稱爲bin,比如[0,0.1)→0, [0.1,0.3)→1),同時構造一個寬度爲k的直方圖。
在遍歷數據的時候,根據離散化後的值作爲索引在直方圖中累積統計量,當遍歷一次數據後,直方圖累積了需要的統計量,然後根據直方圖的離散值,遍歷尋找最優的分割點。
在XGBoost中,樹是按層生長的,稱爲Level-wise tree growth,同一層的所有節點都做分裂,最後剪枝,如下圖所示:
Level-wise過一次數據可以同時分裂同一層的葉子,容易進行多線程優化,也好控制模型複雜度,不容易過擬合。但實際上Level-wise是一種低效的算法,因爲它不加區分的對待同一層的葉子,帶來了很多沒必要的開銷,因爲實際上很多葉子的分裂增益較低,沒必要進行搜索和分裂。
在Histogram算法之上,LightGBM進行進一步的優化。首先它拋棄了大多數GBDT工具使用的按層生長 (level-wise) 的決策樹生長策略,而使用了帶有深度限制的按葉子生長 (leaf-wise)算法。
LightGBM另一個優化是Histogram(直方圖)做差加速。一個容易觀察到的現象:一個葉子的直方圖可以由它的父親節點的直方圖與它兄弟的直方圖做差得到。通常構造直方圖,需要遍歷該葉子上的所有數據,但直方圖做差僅需遍歷直方圖的k個桶。
利用這個方法,LightGBM可以在構造一個葉子的直方圖後,可以用非常微小的代價得到它兄弟葉子的直方圖,在速度上可以提升一倍。
LightGBM具有以下優點:
你知道的越多,你不知道的越多。 有道無術,術尚可求,有術無道,止於術。 如有其它問題,歡迎大家留言,我們一起討論,一起學習,一起進步