LightGBM——提升机器算法(图解+理论+安装方法+python代码)
原文地址:https://blog.csdn.net/huacha__/article/details/81057150
前言
LightGBM是個快速的,分布式的,高性能的基于決策樹算法的梯度提升框架。可用于排序,分類,回歸以及很多其他的機器學(xué)習(xí)任務(wù)中。
在競賽題中,我們知道XGBoost算法非常熱門,它是一種優(yōu)秀的拉動框架,但是在使用過程中,其訓(xùn)練耗時很長,內(nèi)存占用比較大。在2017年年1月微軟在GitHub的上開源了一個新的升壓工具--LightGBM。在不降低準(zhǔn)確率的前提下,速度提升了10倍左右,占用內(nèi)存下降了3倍左右。因為他是基于決策樹算法的,它采用最優(yōu)的葉明智策略分裂葉子節(jié)點,然而其它的提升算法分裂樹一般采用的是深度方向或者水平明智而不是葉,明智的。因此,在LightGBM算法中,當(dāng)增長到相同的葉子節(jié)點,葉明智算法比水平-wise算法減少更多的損失。因此導(dǎo)致更高的精度,而其他的任何已存在的提升算法都不能夠達(dá)。與此同時,它的速度也讓人感到震驚,這就是該算法名字? 燈 ?的原因。
-
2014年3月,XGBOOST最早作為研究項目,由陳天奇提出
? ? ?(XGBOOST的部分在我的另一篇博客里:https://blog.csdn.net/huacha__/article/details/81029680
-
2017年1月,微軟發(fā)布首個穩(wěn)定版LightGBM
在微軟亞洲研究院AI頭條分享中的「LightGBM簡介」中,機器學(xué)習(xí)組的主管研究員王太峰提到:微軟DMTK團隊在github上開源了性能超越其它推動決策樹工具LightGBM后,三天之內(nèi)星了1000+次,叉了超過200次。知乎上有近千人關(guān)注“如何看待微軟開源的LightGBM?”問題,被評價為“速度驚人”,“非常有啟發(fā)”,“支持分布式” “代碼清晰易懂”,“占用內(nèi)存小”等。以下是微軟官方提到的LightGBM的各種優(yōu)點,以及該項目的開源地址。
科普鏈接:如何玩轉(zhuǎn)LightGBM https://v.qq.com/x/page/k0362z6lqix.html
目錄
前言
一、"What We Do in?LightGBM?"
二、在不同數(shù)據(jù)集上的對比
三、LightGBM的細(xì)節(jié)技術(shù)
1、直方圖優(yōu)化
2、存儲記憶優(yōu)化
3、深度限制的節(jié)點展開方法
4、直方圖做差優(yōu)化
5、順序訪問梯度
6、支持類別特征
7、支持并行學(xué)習(xí)
四、MacOS安裝LightGBM
五、用python實現(xiàn)LightGBM算法
一、"What We Do in?LightGBM?"
下面這個表格給出了XGBoost和LightGBM之間更加細(xì)致的性能對比,包括了樹的生長方式,LightGBM是直接去選擇獲得最大收益的結(jié)點來展開,而XGBoost是通過按層增長的方式來做,這樣呢LightGBM能夠在更小的計算代價上建立我們需要的決策樹。當(dāng)然在這樣的算法中我們也需要控制樹的深度和每個葉子結(jié)點的最小數(shù)據(jù)量,從而減少過擬合。
小小翻譯一下,有問題還望指出
| ? | XGBoost | LightGBM |
| 樹木生長算法 | 按層生長的方式 <p>有利于工程優(yōu)化,但對學(xué)習(xí)模型效率不高</p></td><td style="width:306px;"><p>直接<strong>選擇最大收益的節(jié)點</strong>來展開,在更小的計算代價上去選擇我們需要的決策樹</p><p>控制樹的深度和每個葉子節(jié)點的數(shù)據(jù)量,能減少過擬合</p></td></tr><tr><td style="width:115px;">劃分點搜索算 法</td><td style="width:207px;">對特征預(yù)排序的方法</td><td style="width:306px;">直方圖算法:將特征值分成許多小筒,進而在筒上搜索分裂點,減少了計算代價和存儲代價,得到更好的性能。另外數(shù)據(jù)結(jié)構(gòu)的變化使得在細(xì)節(jié)處的變化理上效率會不同</td></tr><tr><td style="width:115px;">內(nèi)存開銷</td><td style="width:207px;">8個字節(jié)</td><td style="width:306px;">1個字節(jié)</td></tr><tr><td style="width:115px;">劃分的計算增益</td><td style="width:207px;">數(shù)據(jù)特征</td><td style="width:306px;">容器特征</td></tr><tr><td style="width:115px;">高速緩存優(yōu)化</td><td style="width:207px;">無</td><td style="width:306px;">在Higgs數(shù)據(jù)集上加速40%</td></tr><tr><td style="width:115px;">類別特征處理</td><td style="width:207px;">無</td><td style="width:306px;">在Expo數(shù)據(jù)集上速度快了8倍</td></tr></tbody></table></div><h1 id="%E5%9C%A8%E4%B8%8D%E5%90%8C%E6%95%B0%E6%8D%AE%E9%9B%86%E4%B8%8A%E7%9A%84%E5%AF%B9%E6%AF%94"><a name="t2"></a>二、在不同數(shù)據(jù)集上的對比</h1> |
higgs和expo都是分類數(shù)據(jù),yahoo ltr和msltr都是排序數(shù)據(jù),在這些數(shù)據(jù)中,LightGBM都有更好的準(zhǔn)確率和更強的內(nèi)存使用量。
準(zhǔn)確率 ?
內(nèi)存使用情況
計算速度的對比,完成相同的訓(xùn)練量XGBoost通常耗費的時間是LightGBM的數(shù)倍之上,在higgs數(shù)據(jù)集上,它們的差距更是達(dá)到了15倍以上。
三、LightGBM的細(xì)節(jié)技術(shù)
1、直方圖優(yōu)化
XGBoost中采用預(yù)排序的方法,計算過程當(dāng)中是按照value的排序,逐個數(shù)據(jù)樣本來計算劃分收益,這樣的算法能夠精確的找到最佳劃分值,但是代價比較大同時也沒有較好的推廣性。
在LightGBM中沒有使用傳統(tǒng)的預(yù)排序的思路,而是將這些精確的連續(xù)的每一個value劃分到一系列離散的域中,也就是筒子里。以浮點型數(shù)據(jù)來舉例,一個區(qū)間的值會被作為一個筒,然后以這些筒為精度單位的直方圖來做。這樣一來,數(shù)據(jù)的表達(dá)變得更加簡化,減少了內(nèi)存的使用,而且直方圖帶來了一定的正則化的效果,能夠使我們做出來的模型避免過擬合且具有更好的推廣性。
看下直方圖優(yōu)化的細(xì)節(jié)處理
可以看到,這是按照bin來索引“直方圖”,所以不用按照每個“特征”來排序,也不用一一去對比不同“特征”的值,大大的減少了運算量。
2、存儲記憶優(yōu)化
當(dāng)我們用數(shù)據(jù)的bin描述數(shù)據(jù)特征的時候帶來的變化:首先是不需要像預(yù)排序算法那樣去存儲每一個排序后數(shù)據(jù)的序列,也就是下圖灰色的表,在LightGBM中,這部分的計算代價是0;第二個,一般bin會控制在一個比較小的范圍,所以我們可以用更小的內(nèi)存來存儲
3、深度限制的節(jié)點展開方法
LightGBM使用了帶有深度限制的節(jié)點展開方法(Leaf-wise)來提高模型精度,這是比XGBoost中Level-wise更高效的方法。它可以降低訓(xùn)練誤差得到更好的精度。但是單純的使用Leaf-wise可能會生長出比較深的樹,在小數(shù)據(jù)集上可能會造成過擬合,因此在Leaf-wise之上多加一個深度限制
4、直方圖做差優(yōu)化
直方圖做差優(yōu)化可以達(dá)到兩倍的加速,可以觀察到一個葉子節(jié)點上的直方圖,可以由它的父親節(jié)點直方圖減去它兄弟節(jié)點的直方圖來得到。根據(jù)這一點我們可以構(gòu)造出來數(shù)據(jù)量比較小的葉子節(jié)點上的直方圖,然后用直方圖做差來得到數(shù)據(jù)量比較大的葉子節(jié)點上的直方圖,從而達(dá)到加速的效果。
5、順序訪問梯度
預(yù)排序算法中有兩個頻繁的操作會導(dǎo)致cache-miss,也就是緩存消失(對速度的影響很大,特別是數(shù)據(jù)量很大的時候,順序訪問比隨機訪問的速度快4倍以上 ?)。
- 對梯度的訪問:在計算增益的時候需要利用梯度,對于不同的特征,訪問梯度的順序是不一樣的,并且是隨機的
- 對于索引表的訪問:預(yù)排序算法使用了行號和葉子節(jié)點號的索引表,防止數(shù)據(jù)切分的時候?qū)λ械奶卣鬟M行切分。同訪問梯度一樣,所有的特征都要通過訪問這個索引表來索引。
這兩個操作都是隨機的訪問,會給系統(tǒng)性能帶來非常大的下降。
LightGBM使用的直方圖算法能很好的解決這類問題。首先。對梯度的訪問,因為不用對特征進行排序,同時,所有的特征都用同樣的方式來訪問,所以只需要對梯度訪問的順序進行重新排序,所有的特征都能連續(xù)的訪問梯度。并且直方圖算法不需要把數(shù)據(jù)id到葉子節(jié)點號上(不需要這個索引表,沒有這個緩存消失問題)
6、支持類別特征
傳統(tǒng)的機器學(xué)習(xí)一般不能支持直接輸入類別特征,需要先轉(zhuǎn)化成多維的0-1特征,這樣無論在空間上還是時間上效率都不高。LightGBM通過更改決策樹算法的決策規(guī)則,直接原生支持類別特征,不需要轉(zhuǎn)化,提高了近8倍的速度。
7、支持并行學(xué)習(xí)
LightGBM原生支持并行學(xué)習(xí),目前支持特征并行(Featrue Parallelization)和數(shù)據(jù)并行(Data Parallelization)兩種,還有一種是基于投票的數(shù)據(jù)并行(Voting Parallelization)
- 特征并行的主要思想是在不同機器、在不同的特征集合上分別尋找最優(yōu)的分割點,然后在機器間同步最優(yōu)的分割點。
- 數(shù)據(jù)并行則是讓不同的機器先在本地構(gòu)造直方圖,然后進行全局的合并,最后在合并的直方圖上面尋找最優(yōu)分割點。
LightGBM針對這兩種并行方法都做了優(yōu)化。
- 特征并行算法中,通過在本地保存全部數(shù)據(jù)避免對數(shù)據(jù)切分結(jié)果的通信。
- 數(shù)據(jù)并行中使用分散規(guī)約 (Reduce scatter) 把直方圖合并的任務(wù)分?jǐn)偟讲煌臋C器,降低通信和計算,并利用直方圖做差,進一步減少了一半的通信量。
- 基于投票的數(shù)據(jù)并行(Voting Parallelization)則進一步優(yōu)化數(shù)據(jù)并行中的通信代價,使通信代價變成常數(shù)級別。在數(shù)據(jù)量很大的時候,使用投票并行可以得到非常好的加速效果。
下圖更好的說明了以上這三種并行學(xué)習(xí)的整體流程:
在直方圖合并的時候,通信代價比較大,基于投票的數(shù)據(jù)并行能夠很好的解決這一點。
?
四、MacOS安裝LightGBM
來測試一下:
大功告成!
值得注意的是:pip list里面沒有l(wèi)ightgbm,以后使用lightgbm需要到特定的文件夾中運行。我的地址是:
/Users/ fengxianhe / LightGBM /python-package
?
五,用python實現(xiàn)LightGBM算法
為了演示LightGBM在蟒蛇中的用法,本代碼以sklearn包中自帶的鳶尾花數(shù)據(jù)集為例,用lightgbm算法實現(xiàn)鳶尾花種類的分類任務(wù)。
輸出結(jié)果:
可以看到預(yù)測值和真實值之間的均方根誤差為0.722972。
總結(jié)
以上是生活随笔為你收集整理的LightGBM——提升机器算法(图解+理论+安装方法+python代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TIFF图像被转换为JPEG格式的图
- 下一篇: Python 获取本机或者服务器的 IP