机器学习-集成学习-提升树-LightGBM
參考文章
深入理解LightGBM - 知乎,非常清晰詳細(xì),還有具體的案例,值得一看
ML-NLP/Machine Learning/3.4 LightGBM at master · NLP-LOVE/ML-NLP · GitHub
目錄
1. LightGBM是什么
1.1 LightGBM提出的動(dòng)機(jī)
1.2?XGBoost的缺點(diǎn)及LightGBM在哪些地方進(jìn)行了優(yōu)化
2.LightGBM原理
2.1?Histogram算法
2.2?帶深度限制的Leaf-wise的葉子生長策略
2.3?直方圖差加速
2.4?直接支持類別特征
3. LightGBM優(yōu)點(diǎn)
4. 代碼實(shí)現(xiàn)
1. LightGBM是什么
GBDT (Gradient Boosting Decision Tree) 是機(jī)器學(xué)習(xí)中一個(gè)長盛不衰的模型,其主要思想是利用弱分類器(決策樹)迭代訓(xùn)練以得到最優(yōu)模型,該模型具有訓(xùn)練效果好、不易過擬合等優(yōu)點(diǎn)。GBDT不僅在工業(yè)界應(yīng)用廣泛,通常被用于多分類、點(diǎn)擊率預(yù)測(cè)、搜索排序等任務(wù);在各種數(shù)據(jù)挖掘競(jìng)賽中也是致命武器,據(jù)統(tǒng)計(jì)Kaggle上的比賽有一半以上的冠軍方案都是基于GBDT。
而LightGBM(Light Gradient Boosting Machine)是一個(gè)實(shí)現(xiàn)GBDT算法的框架,支持高效率的并行訓(xùn)練,并且具有更快的訓(xùn)練速度、更低的內(nèi)存消耗、更好的準(zhǔn)確率、支持分布式可以快速處理海量數(shù)據(jù)等優(yōu)點(diǎn)。微軟DMTK團(tuán)隊(duì)在GitHub上開源了性能超越其他boosting工具的LightGBM,在三天之內(nèi)GitHub上被star了1000次,fork了200次。(請(qǐng)點(diǎn)擊https://github.com/Microsoft/LightGBM)
LightGBM在Higgs數(shù)據(jù)集上LightGBM比XGBoost快將近10倍,內(nèi)存占用率大約為XGBoost的1/6,并且準(zhǔn)確率也有提升。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算法是不能滿足其需求的。
1.1 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í)踐。
1.2?XGBoost的缺點(diǎn)及LightGBM在哪些地方進(jìn)行了優(yōu)化
(1)XGBoost的缺點(diǎn)
在LightGBM提出之前,最有名的GBDT工具就是XGBoost了,它是基于預(yù)排序方法的決策樹算法。這種構(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í),在每一層長樹的時(shí)候,需要隨機(jī)訪問一個(gè)行索引到葉子索引的數(shù)組,并且不同特征訪問的順序也不一樣,也會(huì)造成較大的cache miss。
(2)LightGBM的優(yōu)化
為了避免上述XGBoost的缺陷,并且能夠在不損害準(zhǔn)確率的條件下加快GBDT模型的訓(xùn)練速度,lightGBM在傳統(tǒng)的GBDT算法上進(jìn)行了如下優(yōu)化:
- 基于Histogram的決策樹算法。
- 單邊梯度采樣 Gradient-based One-Side Sampling(GOSS):使用GOSS可以減少大量只具有小梯度的數(shù)據(jù)實(shí)例,這樣在計(jì)算信息增益的時(shí)候只利用剩下的具有高梯度的數(shù)據(jù)就可以了,相比XGBoost遍歷所有特征值節(jié)省了不少時(shí)間和空間上的開銷。
- 互斥特征捆綁 Exclusive Feature Bundling(EFB):使用EFB可以將許多互斥的特征綁定為一個(gè)特征,這樣達(dá)到了降維的目的。
- 帶深度限制的Leaf-wise的葉子生長策略:大多數(shù)GBDT工具使用低效的按層生長 (level-wise) 的決策樹生長策略,因?yàn)樗患訁^(qū)分的對(duì)待同一層的葉子,帶來了很多沒必要的開銷。實(shí)際上很多葉子的分裂增益較低,沒必要進(jìn)行搜索和分裂。LightGBM使用了帶有深度限制的按葉子生長 (leaf-wise) 算法。
- 直接支持類別特征(Categorical Feature)
- 支持高效并行
- Cache命中率優(yōu)化
2.LightGBM原理
2.1?Histogram算法
直方圖算法的基本思想是先把連續(xù)的浮點(diǎn)特征值離散化成k個(gè)整數(shù)(其實(shí)又是分桶的思想,而這些桶稱為bin,比如[0,0.1)→0, [0.1,0.3)→1),同時(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。然后在計(jì)算上的代價(jià)也大幅降低,預(yù)排序算法每遍歷一個(gè)特征值就需要計(jì)算一次分裂的增益,而直方圖算法只需要計(jì)算k次(k可以認(rèn)為是常數(shù)),時(shí)間復(fù)雜度從O(#data*#feature)優(yōu)化到O(k*#features)。
2.2?帶深度限制的Leaf-wise的葉子生長策略
在XGBoost中,樹是按層生長的,稱為Level-wise tree growth,同一層的所有節(jié)點(diǎn)都做分裂,最后剪枝,如下圖所示:
Level-wise過一次數(shù)據(jù)可以同時(shí)分裂同一層的葉子,容易進(jìn)行多線程優(yōu)化,也好控制模型復(fù)雜度,不容易過擬合。但實(shí)際上Level-wise是一種低效的算法,因?yàn)樗患訁^(qū)分的對(duì)待同一層的葉子,帶來了很多沒必要的開銷,因?yàn)閷?shí)際上很多葉子的分裂增益較低,沒必要進(jìn)行搜索和分裂。
在Histogram算法之上,LightGBM進(jìn)行進(jìn)一步的優(yōu)化。首先它拋棄了大多數(shù)GBDT工具使用的按層生長 (level-wise) 的決策樹生長策略,而使用了帶有深度限制的按葉子生長 (leaf-wise)算法。
Leaf-wise則是一種更為高效的策略,每次從當(dāng)前所有葉子中,找到分裂增益最大的一個(gè)葉子,然后分裂,如此循環(huán)。因此同Level-wise相比,在分裂次數(shù)相同的情況下,Leaf-wise可以降低更多的誤差,得到更好的精度。Leaf-wise的缺點(diǎn)是可能會(huì)長出比較深的決策樹,產(chǎn)生過擬合。因此LightGBM在Leaf-wise之上增加了一個(gè)最大深度的限制,在保證高效率的同時(shí)防止過擬合。
2.3?直方圖差加速
LightGBM另一個(gè)優(yōu)化是Histogram(直方圖)做差加速。一個(gè)容易觀察到的現(xiàn)象:一個(gè)葉子的直方圖可以由它的父親節(jié)點(diǎn)的直方圖與它兄弟的直方圖做差得到。通常構(gòu)造直方圖,需要遍歷該葉子上的所有數(shù)據(jù),但直方圖做差僅需遍歷直方圖的k個(gè)桶。
利用這個(gè)方法,LightGBM可以在構(gòu)造一個(gè)葉子的直方圖后,可以用非常微小的代價(jià)得到它兄弟葉子的直方圖,在速度上可以提升一倍。
2.4?直接支持類別特征
實(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工具。
3. LightGBM優(yōu)點(diǎn)
LightGBM (Light Gradient Boosting Machine)(請(qǐng)點(diǎn)擊https://github.com/Microsoft/LightGBM)是一個(gè)實(shí)現(xiàn)GBDT算法的框架,支持高效率的并行訓(xùn)練,并且具有以下優(yōu)點(diǎn):
- 更快的訓(xùn)練速度
- 更低的內(nèi)存消耗
- 更好的準(zhǔn)確率
- 分布式支持,可以快速處理海量數(shù)據(jù)
4. 代碼實(shí)現(xiàn)
為了演示LightGBM在Python中的用法,本代碼以sklearn包中自帶的鳶尾花數(shù)據(jù)集為例,用lightgbm算法實(shí)現(xiàn)鳶尾花種類的分類任務(wù)。
GitHub:點(diǎn)擊進(jìn)入
總結(jié)
以上是生活随笔為你收集整理的机器学习-集成学习-提升树-LightGBM的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习-集成学习-提升树-Xgboos
- 下一篇: CUKTECH 5 号彩虹电池发布:紫米