不久前微軟DMTK(分佈式機器學習工具包)團隊在GitHub上開源了性能超越其餘boosting工具的LightGBM,在三天以內GitHub上被star了1000次,fork了200次。知乎上有近千人關注「如何看待微軟開源的LightGBM?」問題,被評價爲「速度驚人」,「很是有啓發」,「支持分佈式」,「代碼清晰易懂」,「佔用內存小」等。git
LightGBM (Light Gradient Boosting Machine)(請點擊https://github.com/Microsoft/LightGBM)是一個實現GBDT算法的框架,支持高效率的並行訓練。github
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的直方圖。多線程
在遍歷數據的時候,根據離散化後的值做爲索引在直方圖中累積統計量,當遍歷一次數據後,直方圖累積了須要的統計量,而後根據直方圖的離散值,遍歷尋找最優的分割點。框架
使用直方圖算法有不少優勢。首先,最明顯就是內存消耗的下降,直方圖算法不只不須要額外存儲預排序的結果,並且能夠只保存特徵離散化後的值,而這個值通常用8位整型存儲就足夠了,內存消耗能夠下降爲原來的1/8。而後在計算上的代價也大幅下降,預排序算法每遍歷一個特徵值就須要計算一次分裂的增益,而直方圖算法只須要計算k次(k能夠認爲是常數),時間複雜度從O(#data#feature)優化到O(k#features)。機器學習
在XGBoost中,樹是按層生長的,稱爲Level-wise tree growth,同一層的全部節點都作分裂,最後剪枝,以下圖所示:分佈式
Level-wise過一次數據能夠同時分裂同一層的葉子,容易進行多線程優化,也好控制模型複雜度,不容易過擬合。但實際上Level-wise是一種低效的算法,由於它不加區分的對待同一層的葉子,帶來了不少不必的開銷,由於實際上不少葉子的分裂增益較低,不必進行搜索和分裂。工具
在Histogram算法之上,LightGBM進行進一步的優化。首先它拋棄了大多數GBDT工具使用的按層生長 (level-wise)
的決策樹生長策略,而使用了帶有深度限制的按葉子生長 (leaf-wise)算法。性能
Leaf-wise則是一種更爲高效的策略,每次從當前全部葉子中,找到分裂增益最大的一個葉子,而後分裂,如此循環。所以同Level-wise相比,在分裂次數相同的狀況下,Leaf-wise能夠下降更多的偏差,獲得更好的精度。Leaf-wise的缺點是可能會長出比較深的決策樹,產生過擬合。所以LightGBM在Leaf-wise之上增長了一個最大深度的限制,在保證高效率的同時防止過擬合。
LightGBM另外一個優化是Histogram(直方圖)作差加速。一個容易觀察到的現象:一個葉子的直方圖能夠由它的父親節點的直方圖與它兄弟的直方圖作差獲得。一般構造直方圖,須要遍歷該葉子上的全部數據,但直方圖作差僅需遍歷直方圖的k個桶。
利用這個方法,LightGBM能夠在構造一個葉子的直方圖後,能夠用很是微小的代價獲得它兄弟葉子的直方圖,在速度上能夠提高一倍。
實際上大多數機器學習工具都沒法直接支持類別特徵,通常須要把類別特徵,轉化到多維的0/1特徵,下降了空間和時間的效率。而類別特徵的使用是在實踐中很經常使用的。基於這個考慮,LightGBM優化了對類別特徵的支持,能夠直接輸入類別特徵,不須要額外的0/1展開。並在決策樹算法上增長了類別特徵的決策規則。在Expo數據集上的實驗,相比0/1展開的方法,訓練速度能夠加速8倍,而且精度一致。據咱們所知,LightGBM是第一個直接支持類別特徵的GBDT工具。
LightGBM (Light Gradient Boosting Machine)(請點擊https://github.com/Microsoft/LightGBM)是一個實現GBDT算法的框架,支持高效率的並行訓練,而且具備如下優勢:
爲了演示LightGBM在Python中的用法,本代碼以sklearn包中自帶的鳶尾花數據集爲例,用lightgbm算法實現鳶尾花種類的分類任務。
GitHub:點擊進入
做者:@mantchs