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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LightGBM算法详解(教你一文掌握LightGBM所有知识点)

發(fā)布時間:2023/12/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LightGBM算法详解(教你一文掌握LightGBM所有知识点) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

LightGBM

(Light Gradient Boosting Machine)是一款基于決策樹算法的分布式梯度提升框架。為了滿足工業(yè)界縮短模型計算時間的需求,LightGBM的設(shè)計思路主要是兩點(diǎn):
減小數(shù)據(jù)對內(nèi)存的使用,保證單個機(jī)器在不犧牲速度的情況下,盡可能地用上更多的數(shù)據(jù);
減小通信的代價,提升多機(jī)并行時的效率,實(shí)現(xiàn)在計算上的線性加速。
由此可見,LightGBM的設(shè)計初衷就是提供一個快速高效、低內(nèi)存占用、高準(zhǔn)確度、支持并行和大規(guī)模數(shù)據(jù)處理的數(shù)據(jù)科學(xué)工具。
LightGBM是微軟旗下的Distributed Machine Learning Toolkit (DMKT)的一個項(xiàng)目,由2014年首屆阿里巴巴大數(shù)據(jù)競賽獲勝者之一柯國霖主持開發(fā)。雖然其開源時間才僅僅2個月,但是其快速高效的特點(diǎn)已經(jīng)在數(shù)據(jù)科學(xué)競賽中嶄露頭角。Allstate Claims Severity競賽中的冠軍解決方案里就使用了LightGBM,并對其大嘉贊賞。

特性

優(yōu)化速度與內(nèi)存使用。
稀疏優(yōu)化。
優(yōu)化準(zhǔn)確率。使用leaf-wise生長方式,可以處理分類變量。
優(yōu)化網(wǎng)絡(luò)通訊。
支持三種模式并行。

(1)特征并行:
a. Workers find local best split point {feature, threshold} on the local feature set.
b. Communicate local best splits with each other and get the best one.
c. Perform the best split.
(2)數(shù)據(jù)并行:
a. Instead of “Merge global histograms from all local histograms”, LightGBM use “Reduce Scatter” to merge histograms of different (non-overlapping) features for different workers. Then workers find the local best split on local merged histograms and sync up the global best split.
b. As aforementioned, LightGBM uses histogram subtraction to speed up training. Based on this, we can communicate histograms only for one leaf, and get its neighbor’s histograms by subtraction as well.
(3)投票并行:
Voting parallel further reduces the communication cost in data-parallel to constant cost. It uses two-stage voting to reduce the communication cost of feature histograms.

常見問題

LightGBM和XGBoost有什么區(qū)別?他們的loss一樣么? 算法層面有什么區(qū)別?
答:LightGBM:基于Histogram的決策樹算法;Leaf-wise的葉子生長策略;Cache命中率優(yōu)化;直接支持類別特征(categorical Feature);XGBoost:預(yù)排序;Level-wise的層級生長策略;特征對梯度的訪問是一種隨機(jī)訪問。

LightGBM有哪些實(shí)現(xiàn),各有什么區(qū)別?
答:gbdt:梯度提升決策樹,串行速度慢,容易過擬合;rf:隨機(jī)森林,并行速度快;dart:訓(xùn)練較慢;goss:容易過擬合。

LigthGBM是boosting集合模型中的新進(jìn)成員,由微軟提供,它和XGBoost一樣是對GBDT的高效實(shí)現(xiàn),原理上它和GBDT及XGBoost類似,都采用損失函數(shù)的負(fù)梯度作為當(dāng)前決策樹的殘差近似值,去擬合新的決策樹。

LightGBM樹的生長方式是垂直方向的,其他的算法都是水平方向的,也就是說Light GBM生長的是樹的葉子,其他的算法生長的是樹的層次。
LightGBM選擇具有最大誤差的樹葉進(jìn)行生長,當(dāng)生長同樣的樹葉,生長葉子的算法可以比基于層的算法減少更多的loss。

不建議在小數(shù)據(jù)集上使用LightGBM。LightGBM對過擬合很敏感,對于小數(shù)據(jù)集非常容易過擬合。對于多小屬于小數(shù)據(jù)集,并沒有什么閾值,但是從我的經(jīng)驗(yàn),我建議對于10000+以上的數(shù)據(jù)的時候,再使用LightGBM。

LightGBM在很多方面會比XGBoost表現(xiàn)的更為優(yōu)秀。它有以下優(yōu)勢:
更快的訓(xùn)練效率
低內(nèi)存使用
更高的準(zhǔn)確率
支持并行化學(xué)習(xí)
可處理大規(guī)模數(shù)據(jù)
支持直接使用category特征

從下圖實(shí)驗(yàn)數(shù)據(jù)可以看出, LightGBM比XGBoost快將近10倍,內(nèi)存占用率大約為XGBoost的1/6,并且準(zhǔn)確率也有提升。
至于LGB為什么比XGB的精度高這一點(diǎn),我的理解是選擇梯度大(殘差大)樣本來進(jìn)行特征分裂生成的樹,借鑒了Adaboost的更改樣本權(quán)重的思想。每棵樹針對某些特定訓(xùn)練樣本有著較好的劃分能力,導(dǎo)致每棵樹之間的異質(zhì)性較大,對于效果近似但異質(zhì)性大的模型加權(quán)往往會帶來更大的提升。


通俗解釋:LGB的優(yōu)化方法是,在保留大梯度樣本的同時,隨機(jī)地保留一些小梯度樣本,同時放大了小梯度樣本帶來的信息增益。

這樣說起來比較抽象,我們過一遍流程: 首先把樣本按照梯度排序,選出梯度最大的a%個樣本,然后在剩下小梯度數(shù)據(jù)中隨機(jī)選取b%個樣本,在計算信息增益的時候,將選出來b%個小梯度樣本的信息增益擴(kuò)大 1 - a / b 倍。這樣就會避免對于數(shù)據(jù)分布的改變。

這給我的感覺就是一個公寓里本來住了十個人,感覺太擠了,趕走了六個人,但剩下的四個人要分?jǐn)偹麄兞鶄€人的房租。
舉個例子,對于一列特征[1,nan,1,nan,1]和一列特征[nan,1,nan,1,nan],他們正好可以合并成一列特征[1,2,1,2,1]。LGB的目標(biāo)就是在于找到這樣的特征并且將他們合并在一起。

如果把特征抽象成圖中的點(diǎn),特征之間的沖突看作是圖中的邊,那么問題就轉(zhuǎn)換為找出圖中的社團(tuán)并使圖中的社團(tuán)數(shù)量最少。LGB里提出了一個貪心的策略,按照有權(quán)度來為圖中所有的點(diǎn)排序,然后把特征合并到度小于某個閾值的社團(tuán)中或單獨(dú)創(chuàng)建一個社團(tuán)。

對于特征如何合并,一個重要的原則就是使合并的兩個特征可以被順利區(qū)分出來,LGB采取了一個更改閾值的方法。例如對于特征x∈(0, 10), 特征y∈(0, 20),就可以把特征y轉(zhuǎn)換為y∈(10,30),然后再去合并x與y。
看完這些驚人的實(shí)驗(yàn)結(jié)果以后,對下面兩個問題產(chǎn)生了疑惑:XGBoost已經(jīng)十分完美了,為什么還要追求速度更快、內(nèi)存使用更小的模型?對GBDT算法進(jìn)行改進(jìn)和提升的技術(shù)細(xì)節(jié)是什么?

提出LightGBM的動機(jī)

常用的機(jī)器學(xué)習(xí)算法,例如神經(jīng)網(wǎng)絡(luò)等算法,都可以以mini-batch的方式訓(xùn)練,訓(xùn)練數(shù)據(jù)的大小不會受到內(nèi)存限制。而GBDT在每一次迭代的時候,都需要遍歷整個訓(xùn)練數(shù)據(jù)多次。如果把整個訓(xùn)練數(shù)據(jù)裝進(jìn)內(nèi)存則會限制訓(xùn)練數(shù)據(jù)的大小;如果不裝進(jìn)內(nèi)存,反復(fù)地讀寫訓(xùn)練數(shù)據(jù)又會消耗非常大的時間。尤其面對工業(yè)級海量的數(shù)據(jù),普通的GBDT算法是不能滿足其需求的。

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

XGBoost的優(yōu)缺點(diǎn)

精確貪心算法

每輪迭代時,都需要遍歷整個訓(xùn)練數(shù)據(jù)多次。如果把整個訓(xùn)練數(shù)據(jù)裝進(jìn)內(nèi)存則會限制訓(xùn)練數(shù)據(jù)的大小;如果不裝進(jìn)內(nèi)存,反復(fù)地讀寫訓(xùn)練數(shù)據(jù)又會消耗非常大的時間。

優(yōu)點(diǎn):

可以找到精確的劃分條件
缺點(diǎn):

計算量巨大
內(nèi)存占用巨大
易產(chǎn)生過擬合
Level-wise迭代方式

預(yù)排序方法(pre-sorted):首先,空間消耗大。這樣的算法需要保存數(shù)據(jù)的特征值,還保存了特征排序的結(jié)果(例如排序后的索引,為了后續(xù)快速的計算分割點(diǎn),在這里XGBoost采用了特征粒度的并行化),這里需要消耗訓(xùn)練數(shù)據(jù)兩倍的內(nèi)存。其次時間上也有較大的開銷,在遍歷每一個分割點(diǎn)的時候,都需要進(jìn)行分裂增益的計算,消耗的代價大。

優(yōu)點(diǎn):

可以使用多線程
可以加速精確貪心算法

缺點(diǎn):

效率低下,可能產(chǎn)生不必要的葉結(jié)點(diǎn)
對cache優(yōu)化不友好

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

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

概括來說,lightGBM主要有以下特點(diǎn):
基于Histogram的決策樹算法
帶深度限制的Leaf-wise的葉子生長策略
直方圖做差加速
直接支持類別特征(Categorical Feature)
Cache命中率優(yōu)化
基于直方圖的稀疏特征優(yōu)化
多線程優(yōu)化


XGBoost使用的是pre-sorted算法,能夠更精確的找到數(shù)據(jù)分隔點(diǎn)。

首先,對所有特征按數(shù)值進(jìn)行預(yù)排序。
其次,在每次的樣本分割時,用O(# data)的代價找到每個特征的最優(yōu)分割點(diǎn)。
最后,找到最后的特征以及分割點(diǎn),將數(shù)據(jù)分裂成左右兩個子節(jié)點(diǎn)。
這種pre-sorting算法能夠準(zhǔn)確找到分裂點(diǎn),但是在空間和時間上有很大的開銷。

由于需要對特征進(jìn)行預(yù)排序并且需要保存排序后的索引值(為了后續(xù)快速的計算分裂點(diǎn)),因此內(nèi)存需要訓(xùn)練數(shù)據(jù)的兩倍。
在遍歷每一個分割點(diǎn)的時候,都需要進(jìn)行分裂增益的計算,消耗的代價大。
LightGBM使用的是histogram算法,占用的內(nèi)存更低,數(shù)據(jù)分隔的復(fù)雜度更低。其思想是將連續(xù)的浮點(diǎn)特征離散成k個離散值,并構(gòu)造寬度為k的Histogram。然后遍歷訓(xùn)練數(shù)據(jù),統(tǒng)計每個離散值在直方圖中的累計統(tǒng)計量。在進(jìn)行特征選擇時,只需要根據(jù)直方圖的離散值,遍歷尋找最優(yōu)的分割點(diǎn)。

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

Histogram algorithm

Histogram algorithm應(yīng)該翻譯為直方圖算法,直方圖算法的思想也很簡單,首先將連續(xù)的浮點(diǎn)數(shù)據(jù)轉(zhuǎn)換為bin數(shù)據(jù),具體過程是首先確定對于每一個特征需要多少的桶bin,然后均分,將屬于該桶的樣本數(shù)據(jù)更新為bin的值,最后用直方圖表示。(看起來很高大上,其實(shí)就是直方圖統(tǒng)計,最后我們將大規(guī)模的數(shù)據(jù)放在了直方圖中)

直方圖算法有幾個需要注意的地方:

使用bin替代原始數(shù)據(jù)相當(dāng)于增加了正則化;
使用bin意味著很多數(shù)據(jù)的細(xì)節(jié)特征被放棄了,相似的數(shù)據(jù)可能被劃分到相同的桶中,這樣的數(shù)據(jù)之間的差異就消失了;
bin數(shù)量選擇決定了正則化的程度,bin越少懲罰越嚴(yán)重,欠擬合風(fēng)險越高。

直方圖算法需要注意的地方:

構(gòu)建直方圖時不需要對數(shù)據(jù)進(jìn)行排序(比XGBoost快),因?yàn)轭A(yù)先設(shè)定了bin的范圍;
直方圖除了保存劃分閾值和當(dāng)前bin內(nèi)樣本數(shù)以外還保存了當(dāng)前bin內(nèi)所有樣本的一階梯度和(一階梯度和的平方的均值等價于均方損失);
閾值的選取是按照直方圖從小到大遍歷,使用了上面的一階梯度和,目的是得到劃分之后△loss最大的特征及閾值。

Histogram 算法的優(yōu)缺點(diǎn):

Histogram算法并不是完美的。由于特征被離散化后,找到的并不是很精確的分割點(diǎn),所以會對結(jié)果產(chǎn)生影響。但在實(shí)際的數(shù)據(jù)集上表明,離散化的分裂點(diǎn)對最終的精度影響并不大,甚至?xí)靡恍T蛟谟赿ecision tree本身就是一個弱學(xué)習(xí)器,采用Histogram算法會起到正則化的效果,有效地防止模型的過擬合。
時間上的開銷由原來的O(#data * #features)降到O(k * #features)。由于離散化,#bin遠(yuǎn)小于#data,因此時間上有很大的提升。
Histogram算法還可以進(jìn)一步加速。一個葉子節(jié)點(diǎn)的Histogram可以直接由父節(jié)點(diǎn)的Histogram和兄弟節(jié)點(diǎn)的Histogram做差得到。一般情況下,構(gòu)造Histogram需要遍歷該葉子上的所有數(shù)據(jù),通過該方法,只需要遍歷Histogram的k個捅。速度提升了一倍。

決策樹生長策略

在Histogram算法之上,LightGBM進(jìn)行進(jìn)一步的優(yōu)化。首先它拋棄了大多數(shù)GBDT工具使用的按層生長 (level-wise)的決策樹生長策略,而使用了帶有深度限制的按葉子生長 (leaf-wise)算法。

XGBoost采用的是按層生長level(depth)-wise生長策略,能夠同時分裂同一層的葉子,從而進(jìn)行多線程優(yōu)化,不容易過擬合;但不加區(qū)分的對待同一層的葉子,帶來了很多沒必要的開銷。因?yàn)閷?shí)際上很多葉子的分裂增益較低,沒必要進(jìn)行搜索和分裂。

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

直方圖差加速

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

直接支持類別特征

實(shí)際上大多數(shù)機(jī)器學(xué)習(xí)工具都無法直接支持類別特征,一般需要把類別特征,轉(zhuǎn)化one-hotting特征,降低了空間和時間的效率。而類別特征的使用是在實(shí)踐中很常用的?;谶@個考慮,LightGBM優(yōu)化了對類別特征的支持,可以直接輸入類別特征,不需要額外的0/1展開。并在決策樹算法上增加了類別特征的決策規(guī)則。

one-hot編碼是處理類別特征的一個通用方法,然而在樹模型中,這可能并不一定是一個好的方法,尤其當(dāng)類別特征中類別個數(shù)很多的情況下。主要的問題是:

可能無法在這個類別特征上進(jìn)行切分(即浪費(fèi)了這個特征)。使用one-hot編碼的話,意味著在每一個決策節(jié)點(diǎn)上只能使用one vs rest(例如是不是狗,是不是貓等)的切分方式。當(dāng)類別值很多時,每個類別上的數(shù)據(jù)可能會比較少,這時候切分會產(chǎn)生不平衡,這意味著切分增益也會很小(比較直觀的理解是,不平衡的切分和不切分沒有區(qū)別)。
會影響決策樹的學(xué)習(xí)。因?yàn)榫退憧梢栽谶@個類別特征進(jìn)行切分,也會把數(shù)據(jù)切分到很多零碎的小空間上,如圖1左邊所示。而決策樹學(xué)習(xí)時利用的是統(tǒng)計信息,在這些數(shù)據(jù)量小的空間上,統(tǒng)計信息不準(zhǔn)確,學(xué)習(xí)會變差。但如果使用下圖右邊的分裂方式,數(shù)據(jù)會被切分到兩個比較大的空間,進(jìn)一步的學(xué)習(xí)也會更好。
下圖右邊葉子節(jié)點(diǎn)的含義是X=A或者X=C放到左孩子,其余放到右孩子。

LightGBM處理分類特征大致流程

為了解決one-hot編碼處理類別特征的不足。LightGBM采用了Many vs many的切分方式,實(shí)現(xiàn)了類別特征的最優(yōu)切分。用LightGBM可以直接輸入類別特征,并產(chǎn)生上圖右邊的效果。在1個k維的類別特征中尋找最優(yōu)切分,樸素的枚舉算法的復(fù)雜度是O(2k),而LightGBM采用了如On Grouping For Maximum Homogeneity的方法實(shí)現(xiàn)了O(klogk)的算法。

算法流程下圖所示:在枚舉分割點(diǎn)之前,先把直方圖按每個類別的均值進(jìn)行排序;然后按照均值的結(jié)果依次枚舉最優(yōu)分割點(diǎn)。從下圖可以看到,Sum(y)/Count(y)為類別的均值。當(dāng)然,這個方法很容易過擬合,所以在LGBM中加入了很多對這個方法的約束和正則化。
下圖是一個簡單的對比實(shí)驗(yàn),可以看到該最優(yōu)方法在AUC上提升了1.5個點(diǎn),并且時間只多了20%。
下面具體來講下在代碼中如何求解類別特征的最優(yōu)切分的流程:

離散特征建立直方圖的過程:統(tǒng)計該特征下每一種離散值出現(xiàn)的次數(shù),并從高到低排序,并過濾掉出現(xiàn)次數(shù)較少的特征值, 然后為每一個特征值,建立一個bin容器, 對于在bin容器內(nèi)出現(xiàn)次數(shù)較少的特征值直接過濾掉,不建立bin容器。
計算分裂閾值的過程:
先看該特征下劃分出的bin容器的個數(shù),如果bin容器的數(shù)量小于4,直接使用one vs other方式, 逐個掃描每一個bin容器,找出最佳分裂點(diǎn);
對于bin容器較多的情況, 先進(jìn)行過濾,只讓子集合較大的bin容器參加劃分閾值計算, 對每一個符合條件的bin容器進(jìn)行公式計算:

公式如下: 該bin容器下所有樣本的一階梯度之和/該bin容器下所有樣本的二階梯度之和 + 正則項(xiàng)(參數(shù)cat_smooth)

這里為什么不是label的均值呢?其實(shí)上例中只是為了便于理解,只針對了學(xué)習(xí)一棵樹且是回歸問題的情況, 這時候一階導(dǎo)數(shù)是Y, 二階導(dǎo)數(shù)是1),得到一個值,根據(jù)該值對bin容器從小到大進(jìn)行排序,然后分從左到右、從右到左進(jìn)行搜索,得到最優(yōu)分裂閾值。但是有一點(diǎn),沒有搜索所有的bin容器,而是設(shè)定了一個搜索bin容器數(shù)量的上限值,程序中設(shè)定是32,即參數(shù)max_num_cat。LightGBM中對離散特征實(shí)行的是many vs many 策略,這32個bin中最優(yōu)劃分的閾值的左邊或者右邊所有的bin容器就是一個many集合,而其他的bin容器就是另一個many集合。
對于連續(xù)特征,劃分閾值只有一個,對于離散值可能會有多個劃分閾值,每一個劃分閾值對應(yīng)著一個bin容器編號,當(dāng)使用離散特征進(jìn)行分裂時,只要數(shù)據(jù)樣本對應(yīng)的bin容器編號在這些閾值對應(yīng)的bin集合之中,這條數(shù)據(jù)就加入分裂后的左子樹,否則加入分裂后的右子樹。

直接支持高效并行

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針對這兩種并行方法都做了優(yōu)化,在特征并行算法中,通過在本地保存全部數(shù)據(jù)避免對數(shù)據(jù)切分結(jié)果的通信;在數(shù)據(jù)并行中使用分散規(guī)約(Reduce scatter)把直方圖合并的任務(wù)分?jǐn)偟讲煌臋C(jī)器,降低通信和計算,并利用直方圖做差,進(jìn)一步減少了一半的通信量。
基于投票的數(shù)據(jù)并行則進(jìn)一步優(yōu)化數(shù)據(jù)并行中的通信代價,使通信代價變成常數(shù)級別。在數(shù)據(jù)量很大的時候,使用投票并行可以得到非常好的加速效果。

網(wǎng)絡(luò)通信優(yōu)化

XGBoost由于采用pre-sorted算法,通信代價非常大,所以在并行的時候也是采用histogram算法;LightGBM采用的histogram算法通信代價小,通過使用集合通信算法,能夠?qū)崿F(xiàn)并行計算的線性加速。

LightGBM原理

提升樹是利用加模型與前向分布算法實(shí)現(xiàn)學(xué)習(xí)的優(yōu)化過程,它有一些高效實(shí)現(xiàn),如XGBoost, pGBRT,GBDT(Gradient Boosting Decision Tree)等。其中GBDT采用負(fù)梯度作為劃分的指標(biāo)(信息增益),XGBoost則利用到二階導(dǎo)數(shù)。他們共同的不足是,計算信息增益需要掃描所有樣本,從而找到最優(yōu)劃分點(diǎn)。在面對大量數(shù)據(jù)或者特征維度很高時,它們的效率和擴(kuò)展性很難使人滿意。解決這個問題的直接方法就是減少特征量和數(shù)據(jù)量而且不影響精確度,有部分工作根據(jù)數(shù)據(jù)權(quán)重采樣來加速booisting的過程,但由于GBDT沒有樣本權(quán)重不能應(yīng)用。

結(jié)合使用 GOSS 和 EFB 的 GBDT 算法就是 LightGBM。微軟開源的LightGBM(基于GBDT的)則很好的解決這些問題,它主要包含兩個算法:

單邊梯度采樣,Gradient-based One-Side Sampling(GOSS)

GOSS(從減少樣本角度):排除大部分小梯度的樣本,僅用剩下的樣本計算信息增益。GBDT雖然沒有數(shù)據(jù)權(quán)重,但每個數(shù)據(jù)實(shí)例有不同的梯度,根據(jù)計算信息增益的定義,梯度大的實(shí)例對信息增益有更大的影響,因此在下采樣時,我們應(yīng)該盡量保留梯度大的樣本(預(yù)先設(shè)定閾值,或者最高百分位間),隨機(jī)去掉梯度小的樣本。我們證明此措施在相同的采樣率下比隨機(jī)采樣獲得更準(zhǔn)確的結(jié)果,尤其是在信息增益范圍較大時。

GBDT使用決策樹,來學(xué)習(xí)獲得一個將輸入空間映射到梯度空間的函數(shù)。假設(shè)訓(xùn)練集有n個實(shí)例x1,…,xn,特征維度為s。每次梯度迭時,模型數(shù)據(jù)變量的損失函數(shù)的負(fù)梯度方向表示為g1,…,gn,決策樹通過最優(yōu)切分點(diǎn)(最大信息增益點(diǎn))將數(shù)據(jù)分到各個節(jié)點(diǎn)。GBDT通過分割后的方差衡量信息增益。

GOSS是一種在減少數(shù)據(jù)量和保證精度上平衡的算法。GOSS是通過區(qū)分不同梯度的實(shí)例,保留較大梯度實(shí)例同時對較小梯度隨機(jī)采樣的方式減少計算量,從而達(dá)到提升效率的目的。

EFB是通過特征捆綁的方式減少特征維度(其實(shí)是降維技術(shù))的方式,來提升計算效率。通常被捆綁的特征都是互斥的(一個特征值為零,一個特征值不為零),這樣兩個特征捆綁起來才不會丟失信息。如果兩個特征并不是完全互斥(部分情況下兩個特征都是非零值),可以用一個指標(biāo)對特征不互斥程度進(jìn)行衡量,稱之為沖突比率,當(dāng)這個值較小時,我們可以選擇把不完全互斥的兩個特征捆綁,而不影響最后的精度。

AdaBoost中,樣本權(quán)重是數(shù)據(jù)實(shí)例重要性的指標(biāo)。然而在GBDT中沒有原始樣本權(quán)重,不能應(yīng)用權(quán)重采樣。幸運(yùn)的事,我們觀察到GBDT中每個數(shù)據(jù)都有不同的梯度值,對采樣十分有用,即實(shí)例的梯度小,實(shí)例訓(xùn)練誤差也就較小,已經(jīng)被學(xué)習(xí)得很好了,直接想法就是丟掉這部分梯度小的數(shù)據(jù)。然而這樣做會改變數(shù)據(jù)的分布,將會影響訓(xùn)練的模型的精確度,為了避免此問題,我們提出了GOSS。

GOSS保留所有的梯度較大的實(shí)例,在梯度小的實(shí)例上使用隨機(jī)采樣。為了抵消對數(shù)據(jù)分布的影響,計算信息增益的時候,GOSS對小梯度的數(shù)據(jù)引入常量乘數(shù)。GOSS首先根據(jù)數(shù)據(jù)的梯度絕對值排序,選取top a個實(shí)例。然后在剩余的數(shù)據(jù)中隨機(jī)采樣b個實(shí)例。接著計算信息增益時為采樣出的小梯度數(shù)據(jù)乘以(1-a)/b,這樣算法就會更關(guān)注訓(xùn)練不足的實(shí)例,而不會過多改變原數(shù)據(jù)集的分布。

定義:O表示某個固定節(jié)點(diǎn)的訓(xùn)練集,分割特征j的分割點(diǎn)d定義為:

其中,

在GOSS中,
首先根據(jù)數(shù)據(jù)的梯度將訓(xùn)練降序排序。
保留top a個數(shù)據(jù)實(shí)例,作為數(shù)據(jù)子集A。
對于剩下的數(shù)據(jù)的實(shí)例,隨機(jī)采樣獲得大小為b的數(shù)據(jù)子集B。
最后我們通過以下方程估計信息增益:

此處GOSS通過較小的數(shù)據(jù)集估計信息增益V~j(d)將大大地減小計算量。更重要的,我們接下來理論表明GOSS不會丟失許多訓(xùn)練精度,勝過隨機(jī)采樣,理論的證明在附加材料。

我們定義GOSS近似誤差為:
根據(jù)上述理論,我們得出以下結(jié)論:

GOSS流程

輸入:訓(xùn)練數(shù)據(jù),迭代步數(shù)d,大梯度數(shù)據(jù)的采樣率a,小梯度數(shù)據(jù)的采樣率b,損失函數(shù)和若學(xué)習(xí)器的類型(一般為決策樹);

輸出:訓(xùn)練好的強(qiáng)學(xué)習(xí)器;

(1)根據(jù)樣本點(diǎn)的梯度的絕對值對它們進(jìn)行降序排序;

(2)對排序后的結(jié)果選取前a*100%的樣本生成一個大梯度樣本點(diǎn)的子集;

(3)對剩下的樣本集合(1-a)100%的樣本,隨機(jī)的選取b(1-a)*100%個樣本點(diǎn),生成一個小梯度樣本點(diǎn)的集合;

(4)將大梯度樣本和采樣的小梯度樣本合并;

(5)將小梯度樣本乘上一個權(quán)重系數(shù);

(6)使用上述的采樣的樣本,學(xué)習(xí)一個新的弱學(xué)習(xí)器;

(7)不斷地重復(fù)(1)~(6)步驟直到達(dá)到規(guī)定的迭代次數(shù)或者收斂為止。

通過上面的算法可以在不改變數(shù)據(jù)分布的前提下不損失學(xué)習(xí)器精度的同時大大的減少模型學(xué)習(xí)的速率。

從上面的描述可知,當(dāng)a=0時,GOSS算法退化為隨機(jī)采樣算法;當(dāng)a=1時,GOSS算法變?yōu)椴扇≌麄€樣本的算法。在許多情況下,GOSS算法訓(xùn)練出的模型精確度要高于隨機(jī)采樣算法。另一方面,采樣也將會增加若學(xué)習(xí)器的多樣性,從而潛在的提升了訓(xùn)練出的模型泛化能力。

互斥特征綁定,Exclusive Feature Bundling(EFB)

EFB(從減少特征角度):捆綁互斥特征,也就是他們很少同時取非零值(也就是用一個合成特征代替)。通常真是應(yīng)用中,雖然特征量比較多,但是由于特征空間十分稀疏,是否可以設(shè)計一種無損的方法來減少有效特征呢?特別在稀疏特征空間上,許多特征幾乎是互斥的(例如許多特征不會同時為非零值,像one-hot),我們可以捆綁互斥的特征。最后,我們將捆綁問題歸約到圖著色問題,通過貪心算法求得近似解。
結(jié)合使用 GOSS 和 EFB 的 GBDT 算法就是 LightGBM。

EBF的算法步驟如下:

將特征按照非零值的個數(shù)進(jìn)行排序
計算不同特征之間的沖突比率
遍歷每個特征并嘗試合并特征,使沖突比率最小化
高位的數(shù)據(jù)通常是稀疏的,這種稀疏性啟發(fā)我們設(shè)計一種無損地方法來減少特征的維度。特別的,稀疏特征空間中,許多特征是互斥的,例如他們從不同時為非零值。我們可以綁定互斥的特征為單一特征,通過仔細(xì)設(shè)計特征臊面算法,我們從特征捆綁中構(gòu)建了與單個特征相同的特征直方圖。這種方式的間直方圖時間復(fù)雜度從O(#data * #feature)降到O(#data * #bundle),由于#bundle << # feature,我們能夠極大地加速GBDT的訓(xùn)練過程而且損失精度。

有兩個問題:

怎么判定那些特征應(yīng)該綁在一起(build bundled)?
怎么把特征綁為一個(merge feature)?
bundle(什么樣的特征被綁定)?

**理論1:**將特征分割為較小量的互斥特征群是NP難的。

證明:將圖著色問題歸約為此問題,而圖著色是NP難的,所以此問題就是NP難的。

給定圖著色實(shí)例G=(V, E)。以G的關(guān)聯(lián)矩陣的每一行為特征,得到我們問題的一個實(shí)例有|V|個特征。 很容易看到,在我們的問題中,一個獨(dú)特的特征包與一組具有相同顏色的頂點(diǎn)相對應(yīng),反之亦然。

理論1說明多項(xiàng)式時間中求解這個NP難問題不可行。為了尋找好的近似算法,我們將最優(yōu)捆綁問題歸結(jié)為圖著色問題,如果兩個特征之間不是相互排斥,那么我們用一個邊將他們連接,然后用合理的貪婪算法(具有恒定的近似比)用于圖著色來做特征捆綁。 此外,我們注意到通常有很多特征,盡管不是100%相互排斥的,也很少同時取非零值。 如果我們的算法可以允許一小部分的沖突,我們可以得到更少的特征包,進(jìn)一步提高計算效率。經(jīng)過簡單的計算,隨機(jī)污染小部分特征值將影響精度最多O([(1–γ)n]?2/3),γ是每個綁定中的最大沖突比率,當(dāng)其相對較小時,能夠完成精度和效率之間的平衡。

基于上面的討論,我們設(shè)計了算法3,偽代碼見下圖,具體算法:

建立一個圖,每個點(diǎn)代表特征,每個邊有權(quán)重,其權(quán)重和特征之間總體沖突相關(guān)。
按照降序排列圖中的度數(shù)來排序特征。
檢查排序之后的每個特征,對他進(jìn)行特征綁定或者建立新的綁定使得操作之后的總體沖突最小。
算法3的時間復(fù)雜度是O(feature2),訓(xùn)練之前只處理一次,其時間復(fù)雜度在特征不是特別多的情況下是可以接受的,但難以應(yīng)對百萬維的特征。為了繼續(xù)提高效率,我們提出了一個更加高效的無圖的排序策略:將特征按照非零值個數(shù)排序,這和使用圖節(jié)點(diǎn)的度排序相似,因?yàn)楦嗟姆橇阒低ǔ?dǎo)致沖突,新算法在算法3基礎(chǔ)上改變了排序策略。


merging features(特征合并)

如何合并同一個bundle的特征來降低訓(xùn)練時間復(fù)雜度。關(guān)鍵在于原始特征值可以從bundle中區(qū)分出來。鑒于直方圖算法存儲離散值而不是連續(xù)特征值,我們通過將互斥特征放在不同的箱中來構(gòu)建bundle。這可以通過將偏移量添加到特征原始值中實(shí)現(xiàn),例如,假設(shè)bundle中有兩個特征,原始特征A取值[0, 10],B取值[0, 20]。我們添加偏移量10到B中,因此B取值[10, 30]。通過這種做法,就可以安全地將A、B特征合并,使用一個取值[0, 30]的特征取代AB。算法見算法4,

EFB算法能夠?qū)⒃S多互斥的特征變?yōu)榈途S稠密的特征,就能夠有效的避免不必要0值特征的計算。實(shí)際,通過用表記錄數(shù)據(jù)中的非零值,來忽略零值特征,達(dá)到優(yōu)化基礎(chǔ)的直方圖算法。通過掃描表中的數(shù)據(jù),建直方圖的時間復(fù)雜度將從O(#data)降到O(#non_zero_data)。當(dāng)然,這種方法在構(gòu)建樹過程中需要而額外的內(nèi)存和計算開銷來維持預(yù)特征表。我們在lightGBM中將此優(yōu)化作為基本函數(shù),因?yàn)楫?dāng)bundles是稀疏的時候,這個優(yōu)化與EFB不沖突(可以用于EFB)。
參考鏈接:https://blog.csdn.net/shine19930820/article/details/79123216

針對 Leaf-wise(Best-first)樹的參數(shù)優(yōu)化

(1)num_leaves這是控制樹模型復(fù)雜度的主要參數(shù)。理論上, 借鑒 depth-wise 樹, 我們可以設(shè)置 num_leaves= 但是, 這種簡單的轉(zhuǎn)化在實(shí)際應(yīng)用中表現(xiàn)不佳. 這是因?yàn)? 當(dāng)葉子數(shù)目相同時, leaf-wise 樹要比 depth-wise 樹深得多, 這就有可能導(dǎo)致過擬合. 因此, 當(dāng)我們試著調(diào)整 num_leaves 的取值時, 應(yīng)該讓其小于 . 舉個例子, 當(dāng) max_depth=7時,depth-wise 樹可以達(dá)到較高的準(zhǔn)確率.但是如果設(shè)置 num_leaves 為 128 時, 有可能會導(dǎo)致過擬合, 而將其設(shè)置為 70 或 80 時可能會得到比 depth-wise 樹更高的準(zhǔn)確率. 其實(shí), depth 的概念在 leaf-wise 樹中并沒有多大作用, 因?yàn)椴⒉淮嬖谝粋€從 leaves 到 depth 的合理映射。

(2)min_data_in_leaf. 這是處理 leaf-wise 樹的過擬合問題中一個非常重要的參數(shù). 它的值取決于訓(xùn)練數(shù)據(jù)的樣本個樹和 num_leaves. 將其設(shè)置的較大可以避免生成一個過深的樹, 但有可能導(dǎo)致欠擬合. 實(shí)際應(yīng)用中, 對于大數(shù)據(jù)集, 設(shè)置其為幾百或幾千就足夠了。

(3)max_depth(默認(rèn)不限制,一般設(shè)置該值為5—10即可) 你也可以利用 max_depth 來顯式地限制樹的深度。

5.2 針對更快的訓(xùn)練速度

1)通過設(shè)置 bagging_fraction 和 bagging_freq 參數(shù)來使用 bagging 方法;(2)通過設(shè)置 feature_fraction 參數(shù)來使用特征的子抽樣;(3)使用較小的 max_bin;(4)使用 save_binary 在以后的學(xué)習(xí)過程對數(shù)據(jù)進(jìn)行加速加載。

5.3 針對更好的準(zhǔn)確率

1)使用較大的 max_bin (學(xué)習(xí)速度可能變慢);(2)使用較小的 learning_rate 和較大的 num_iterations;(3)使用較大的 num_leaves (可能導(dǎo)致過擬合);(4)使用更大的訓(xùn)練數(shù)據(jù);(5)嘗試 dart(一種在多元Additive回歸樹種使用dropouts的算法).

5.4 處理過擬合

1)使用較小的 max_bin(默認(rèn)為255)(2)使用較小的 num_leaves(默認(rèn)為31)(3)使用 min_data_in_leaf(默認(rèn)為20) 和 min_sum_hessian_in_leaf(默認(rèn)為)(4)通過設(shè)置 bagging_fraction (默認(rèn)為1.0)和 bagging_freq (默認(rèn)為0,意味著禁用bagging,k表示每k次迭代執(zhí)行一個bagging)來使用 bagging(5)通過設(shè)置 feature_fraction(默認(rèn)為1.0) 來使用特征子抽樣(6)使用更大的訓(xùn)練數(shù)據(jù)(7)使用 lambda_l1(默認(rèn)為0, lambda_l2 (默認(rèn)為0)和 min_split_gain(默認(rèn)為0,表示執(zhí)行切分的最小增益) 來使用正則(8)嘗試 max_depth 來避免生成過深的樹

具體想要了解更多內(nèi)容請參考:
https://blog.csdn.net/qq_24519677/article/details/82811215

附上python3代碼

#數(shù)據(jù)預(yù)處理 import numpy as np import matplotlib.pyplot as plt import pandas as pd # Importing the dataset dataset = pd.read_csv('...input\\Social_Network_Ads.csv') X = dataset.iloc[:, [2, 3]].values y = dataset.iloc[:, 4].values # Splitting the dataset into the Training set and Test set from sklearn.cross_validation import train_test_split x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0) # Feature Scaling from sklearn.preprocessing import StandardScaler sc = StandardScaler() x_train = sc.fit_transform(x_train) x_test = sc.transform(x_test) #模型構(gòu)建和訓(xùn)練 import lightgbm as lgb d_train = lgb.Dataset(x_train, label=y_train) params = {} params['learning_rate'] = 0.003 params['boosting_type'] = 'gbdt' params['objective'] = 'binary' params['metric'] = 'binary_logloss' params['sub_feature'] = 0.5 params['num_leaves'] = 10 params['min_data'] = 50 params['max_depth'] = 10 clf = lgb.train(params, d_train, 100) #模型預(yù)測 #Prediction y_pred=clf.predict(x_test) #convert into binary values for i in range(0,99): if y_pred[i]>=.5: # setting threshold to .5 y_pred[i]=1 else: y_pred[i]=0 #準(zhǔn)確率計算 #Confusion matrix from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred) #Accuracy from sklearn.metrics import accuracy_score accuracy=accuracy_score(y_pred,y_test)

結(jié)果:

調(diào)參:

數(shù)據(jù)科學(xué)家在使用參數(shù)的時候,總是很掙扎。理想的參數(shù)應(yīng)該長什么樣呢?下面的一組練習(xí)可以用來提升你的模型效率。

num_leaves: 這個是控制樹的復(fù)雜度的主要的參數(shù)。理想情況下,葉子的數(shù)量的值應(yīng)該小于等于 $2^{max_depth}$,大于這個值會導(dǎo)致過擬合。 mindatain_leaf: 設(shè)置成一個比較大的值可以避免樹生長太深,但是可能會導(dǎo)致過擬合。實(shí)際使用中,對于大數(shù)據(jù)集設(shè)置成幾百到幾千就足夠了。maxdepth: 你可以使用maxdepth來顯式的限制深度。

追求速度:

通過設(shè)置 bagging_fraction 和 bagging_freq來使用bagging通過設(shè)置 feature_fraction來使用特征下采樣使用小的 max_bin使用 save_binary 來加速加載數(shù)據(jù)使用并行學(xué)習(xí),參考parallel learning guide

追求更高的準(zhǔn)確率:

使用大的 max_bin (可能速度會慢)使用小 learning_rate 大的 num_iterations使用大的 num_leaves(可能會過擬合)使用大訓(xùn)練數(shù)據(jù)集試試 dart嘗試直接使用類別特征處理過擬合:使用小的 max_bin使用小的 num_leaves使用 min_data_in_leaf 和 min_sum_hessian_in_leaf通過設(shè)置 bagging_fraction 和 bagging_freq來使用bagging通過設(shè)置 feature_fraction來使用特征下采樣`使用大訓(xùn)練數(shù)據(jù)集嘗試使用 lambda_l1, lambda_l2 和 min_gain_to_split 來進(jìn)行正則化嘗試使用 max_depth 來避免生成的樹太深

總結(jié)

以上是生活随笔為你收集整理的LightGBM算法详解(教你一文掌握LightGBM所有知识点)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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