日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

开源|LightGBM:三天内收获GitHub 1000+ 星

發(fā)布時(shí)間:2023/11/29 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开源|LightGBM:三天内收获GitHub 1000+ 星 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?2017-01-05?LightGBM?微軟研究院AI頭條




【導(dǎo)讀】不久前微軟DMTK(分布式機(jī)器學(xué)習(xí)工具包)團(tuán)隊(duì)在GitHub上開源了性能超越其他boosting工具的LightGBM,在三天之內(nèi)GitHub上被star了1000+次,fork了200+次。知乎上有近千人關(guān)注“如何看待微軟開源的LightGBM?”問題,被評(píng)價(jià)為“速度驚人”,“非常有啟發(fā)”,“支持分布式”,“代碼清晰易懂”,“占用內(nèi)存小”等。本文邀請(qǐng)了微軟亞洲研究院DMTK團(tuán)隊(duì)的研究員們?yōu)槲覀冏慕庾x,教你玩轉(zhuǎn)LightGBM。




GBDT (Gradient Boosting Decision Tree) 是機(jī)器學(xué)習(xí)中一個(gè)長(zhǎng)盛不衰的模型,其主要思想是利用弱分類器(決策樹)迭代訓(xùn)練以得到最優(yōu)模型,該模型具有訓(xùn)練效果好、不易過擬合等優(yōu)點(diǎn)。GBDT在工業(yè)界應(yīng)用廣泛,通常被用于點(diǎn)擊率預(yù)測(cè),搜索排序等任務(wù)。GBDT也是各種數(shù)據(jù)挖掘競(jìng)賽的致命武器,據(jù)統(tǒng)計(jì)Kaggle上的比賽有一半以上的冠軍方案都是基于GBDT。


LightGBM (Light Gradient Boosting Machine)(請(qǐng)點(diǎn)擊閱讀原文或直接復(fù)制網(wǎng)址鏈接在瀏覽器中打開https://github.com/Microsoft/LightGBM)是一個(gè)實(shí)現(xiàn)GBDT算法的框架,支持高效率的并行訓(xùn)練,并且具有以下優(yōu)點(diǎn):


●?更快的訓(xùn)練速度

● ?更低的內(nèi)存消耗

●?更好的準(zhǔn)確率

●?分布式支持,可以快速處理海量數(shù)據(jù)


從LightGBM的GitHub主頁上可以直接看到實(shí)驗(yàn)結(jié)果:


從下圖實(shí)驗(yàn)數(shù)據(jù)可以看出,在Higgs數(shù)據(jù)集上LightGBM比XGBoost快將近10倍,內(nèi)存占用率大約為XGBoost的1/6,并且準(zhǔn)確率也有提升。在其他數(shù)據(jù)集上也可以觀察到相似的結(jié)論。


>>>>

訓(xùn)練速度方面




>>>>

內(nèi)存消耗方面




>>>>

準(zhǔn)確率方面




(我們只和xgboost進(jìn)行對(duì)比,因?yàn)閤gboost號(hào)稱比其他的boosting 工具都要好,從他們的實(shí)驗(yàn)結(jié)果來看也是如此。)

?

?XGBoost 與其他方法在Higgs-1M數(shù)據(jù)的比較:



XGBoost 與其他方法在Yahoo LTR數(shù)據(jù)的比較:



看完這些驚人的實(shí)驗(yàn)結(jié)果以后,對(duì)下面兩個(gè)問題產(chǎn)生了疑惑:


Xgboost已經(jīng)十分完美了,為什么還要追求速度更快、內(nèi)存使用更小的模型?


對(duì)GBDT算法進(jìn)行改進(jìn)和提升的技術(shù)細(xì)節(jié)是什么?

?

提出LightGBM的動(dòng)機(jī)


常用的機(jī)器學(xué)習(xí)算法,例如神經(jīng)網(wǎng)絡(luò)等算法,都可以以mini-batch的方式訓(xùn)練,訓(xùn)練數(shù)據(jù)的大小不會(huì)受到內(nèi)存限制。


而GBDT在每一次迭代的時(shí)候,都需要遍歷整個(gè)訓(xùn)練數(shù)據(jù)多次。如果把整個(gè)訓(xùn)練數(shù)據(jù)裝進(jìn)內(nèi)存則會(huì)限制訓(xùn)練數(shù)據(jù)的大小;如果不裝進(jìn)內(nèi)存,反復(fù)地讀寫訓(xùn)練數(shù)據(jù)又會(huì)消耗非常大的時(shí)間。尤其面對(duì)工業(yè)級(jí)海量的數(shù)據(jù),普通的GBDT算法是不能滿足其需求的。


LightGBM提出的主要原因就是為了解決GBDT在海量數(shù)據(jù)遇到的問題,讓GBDT可以更好更快地用于工業(yè)實(shí)踐。

?

改進(jìn)的細(xì)節(jié)


1.Xgboost是如何工作的?


目前已有的GBDT工具基本都是基于預(yù)排序的方法(pre-sorted)的決策樹算法(如 xgboost)。這種構(gòu)建決策樹的算法基本思想是:


首先,對(duì)所有特征都按照特征的數(shù)值進(jìn)行預(yù)排序。


其次,在遍歷分割點(diǎn)的時(shí)候用O(#data)的代價(jià)找到一個(gè)特征上的最好分割點(diǎn)。


最后,找到一個(gè)特征的分割點(diǎn)后,將數(shù)據(jù)分裂成左右子節(jié)點(diǎn)。


這樣的預(yù)排序算法的優(yōu)點(diǎn)是能精確地找到分割點(diǎn)。


缺點(diǎn)也很明顯:


首先,空間消耗大。這樣的算法需要保存數(shù)據(jù)的特征值,還保存了特征排序的結(jié)果(例如排序后的索引,為了后續(xù)快速的計(jì)算分割點(diǎn)),這里需要消耗訓(xùn)練數(shù)據(jù)兩倍的內(nèi)存。


其次,時(shí)間上也有較大的開銷,在遍歷每一個(gè)分割點(diǎn)的時(shí)候,都需要進(jìn)行分裂增益的計(jì)算,消耗的代價(jià)大。


最后,對(duì)cache優(yōu)化不友好。在預(yù)排序后,特征對(duì)梯度的訪問是一種隨機(jī)訪問,并且不同的特征訪問的順序不一樣,無法對(duì)cache進(jìn)行優(yōu)化。同時(shí),在每一層長(zhǎng)樹的時(shí)候,需要隨機(jī)訪問一個(gè)行索引到葉子索引的數(shù)組,并且不同特征訪問的順序也不一樣,也會(huì)造成較大的cache miss。


2.LightGBM在哪些地方進(jìn)行了優(yōu)化?


  • 基于Histogram的決策樹算法

  • 帶深度限制的Leaf-wise的葉子生長(zhǎng)策略

  • 直方圖做差加速

  • 直接支持類別特征(Categorical Feature)

  • Cache命中率優(yōu)化

  • 基于直方圖的稀疏特征優(yōu)化

  • 多線程優(yōu)化

  • 下面主要介紹Histogram算法、帶深度限制的Leaf-wise的葉子生長(zhǎng)策略和直方圖做差加速。


>>>>

Histogram算法


直方圖算法的基本思想是先把連續(xù)的浮點(diǎn)特征值離散化成k個(gè)整數(shù),同時(shí)構(gòu)造一個(gè)寬度為k的直方圖。在遍歷數(shù)據(jù)的時(shí)候,根據(jù)離散化后的值作為索引在直方圖中累積統(tǒng)計(jì)量,當(dāng)遍歷一次數(shù)據(jù)后,直方圖累積了需要的統(tǒng)計(jì)量,然后根據(jù)直方圖的離散值,遍歷尋找最優(yōu)的分割點(diǎn)。


圖:直方圖算法


使用直方圖算法有很多優(yōu)點(diǎn)。首先,最明顯就是內(nèi)存消耗的降低,直方圖算法不僅不需要額外存儲(chǔ)預(yù)排序的結(jié)果,而且可以只保存特征離散化后的值,而這個(gè)值一般用8位整型存儲(chǔ)就足夠了,內(nèi)存消耗可以降低為原來的1/8。

?
圖:內(nèi)存占用優(yōu)化為預(yù)排序算法的1/8


然后在計(jì)算上的代價(jià)也大幅降低,預(yù)排序算法每遍歷一個(gè)特征值就需要計(jì)算一次分裂的增益,而直方圖算法只需要計(jì)算k次(k可以認(rèn)為是常數(shù)),時(shí)間復(fù)雜度從O(#data*#feature)優(yōu)化到O(k*#features)。


當(dāng)然,Histogram算法并不是完美的。由于特征被離散化后,找到的并不是很精確的分割點(diǎn),所以會(huì)對(duì)結(jié)果產(chǎn)生影響。但在不同的數(shù)據(jù)集上的結(jié)果表明,離散化的分割點(diǎn)對(duì)最終的精度影響并不是很大,甚至有時(shí)候會(huì)更好一點(diǎn)。原因是決策樹本來就是弱模型,分割點(diǎn)是不是精確并不是太重要;較粗的分割點(diǎn)也有正則化的效果,可以有效地防止過擬合;即使單棵樹的訓(xùn)練誤差比精確分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下沒有太大的影響。


>>>>

帶深度限制的Leaf-wise的葉子生長(zhǎng)策略


在Histogram算法之上,LightGBM進(jìn)行進(jìn)一步的優(yōu)化。首先它拋棄了大多數(shù)GBDT工具使用的按層生長(zhǎng) (level-wise) 的決策樹生長(zhǎng)策略,而使用了帶有深度限制的按葉子生長(zhǎng) (leaf-wise) 算法。Level-wise過一次數(shù)據(jù)可以同時(shí)分裂同一層的葉子,容易進(jìn)行多線程優(yōu)化,也好控制模型復(fù)雜度,不容易過擬合。但實(shí)際上Level-wise是一種低效的算法,因?yàn)樗患訁^(qū)分的對(duì)待同一層的葉子,帶來了很多沒必要的開銷,因?yàn)閷?shí)際上很多葉子的分裂增益較低,沒必要進(jìn)行搜索和分裂。




Leaf-wise則是一種更為高效的策略,每次從當(dāng)前所有葉子中,找到分裂增益最大的一個(gè)葉子,然后分裂,如此循環(huán)。因此同Level-wise相比,在分裂次數(shù)相同的情況下,Leaf-wise可以降低更多的誤差,得到更好的精度。Leaf-wise的缺點(diǎn)是可能會(huì)長(zhǎng)出比較深的決策樹,產(chǎn)生過擬合。因此LightGBM在Leaf-wise之上增加了一個(gè)最大深度的限制,在保證高效率的同時(shí)防止過擬合。




>>>>

直方圖差加速


LightGBM另一個(gè)優(yōu)化是Histogram(直方圖)做差加速。一個(gè)容易觀察到的現(xiàn)象:一個(gè)葉子的直方圖可以由它的父親節(jié)點(diǎn)的直方圖與它兄弟的直方圖做差得到。通常構(gòu)造直方圖,需要遍歷該葉子上的所有數(shù)據(jù),但直方圖做差僅需遍歷直方圖的k個(gè)桶。利用這個(gè)方法,LightGBM可以在構(gòu)造一個(gè)葉子的直方圖后,可以用非常微小的代價(jià)得到它兄弟葉子的直方圖,在速度上可以提升一倍。




>>>>

直接支持類別特征


實(shí)際上大多數(shù)機(jī)器學(xué)習(xí)工具都無法直接支持類別特征,一般需要把類別特征,轉(zhuǎn)化到多維的0/1特征,降低了空間和時(shí)間的效率。而類別特征的使用是在實(shí)踐中很常用的。基于這個(gè)考慮,LightGBM優(yōu)化了對(duì)類別特征的支持,可以直接輸入類別特征,不需要額外的0/1展開。并在決策樹算法上增加了類別特征的決策規(guī)則。在Expo數(shù)據(jù)集上的實(shí)驗(yàn),相比0/1展開的方法,訓(xùn)練速度可以加速8倍,并且精度一致。據(jù)我們所知,LightGBM是第一個(gè)直接支持類別特征的GBDT工具。


LightGBM的單機(jī)版本還有很多其他細(xì)節(jié)上的優(yōu)化,比如cache訪問優(yōu)化,多線程優(yōu)化,稀疏特征優(yōu)化等等,更多的細(xì)節(jié)可以查閱Github Wiki(https://github.com/Microsoft/LightGBM/wiki?)上的文檔說明。

?

優(yōu)化匯總對(duì)比表:



?

在探尋了LightGBM的優(yōu)化之后,發(fā)現(xiàn)LightGBM還具有支持高效并行的優(yōu)點(diǎn)。LightGBM原生支持并行學(xué)習(xí),目前支持特征并行和數(shù)據(jù)并行的兩種。特征并行的主要思想是在不同機(jī)器在不同的特征集合上分別尋找最優(yōu)的分割點(diǎn),然后在機(jī)器間同步最優(yōu)的分割點(diǎn)。數(shù)據(jù)并行則是讓不同的機(jī)器先在本地構(gòu)造直方圖,然后進(jìn)行全局的合并,最后在合并的直方圖上面尋找最優(yōu)分割點(diǎn)。LightGBM針對(duì)這兩種并行方法都做了優(yōu)化,在特征并行算法中,通過在本地保存全部數(shù)據(jù)避免對(duì)數(shù)據(jù)切分結(jié)果的通信;在數(shù)據(jù)并行中使用分散規(guī)約 (Reduce scatter) 把直方圖合并的任務(wù)分?jǐn)偟讲煌臋C(jī)器,降低通信和計(jì)算,并利用直方圖做差,進(jìn)一步減少了一半的通信量。基于投票的數(shù)據(jù)并行則進(jìn)一步優(yōu)化數(shù)據(jù)并行中的通信代價(jià),使通信代價(jià)變成常數(shù)級(jí)別。在數(shù)據(jù)量很大的時(shí)候,使用投票并行可以得到非常好的加速效果。更具體的內(nèi)容可以看我們?cè)贜IPS2016的文章[1]







? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

LightGBM的工作還在持續(xù)進(jìn)行,近期將會(huì)增加更多的新功能,如:


  • R, Julia 等語言支持(目前已原生支持python,R語言正在開發(fā)中)

  • 更多平臺(tái)(如Hadoop和Spark)的支持

  • GPU加速

?

此外,LightGBM開發(fā)人員呼吁大家在Github上對(duì)LightGBM貢獻(xiàn)自己的代碼和建議,一起讓LightGBM變得更好。DMTK也會(huì)繼續(xù)開源更多優(yōu)秀的機(jī)器學(xué)習(xí)工具,敬請(qǐng)期待。

轉(zhuǎn)載于:https://www.cnblogs.com/mtcnn/p/9410040.html

總結(jié)

以上是生活随笔為你收集整理的开源|LightGBM:三天内收获GitHub 1000+ 星的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。