模型融合---LightGBM總結

1、LightGBM簡介:

  • 所屬:boosting迭代型、樹類算法
  • 適用範圍:迴歸/分類/排序
  • LightGBM工具包:lightGBM英文文檔 | lightGBM中文文檔
  • 論文連接
  • 優勢:
    • 基於Histogram的決策樹算法
    • 帶深度限制的Leaf-wise的葉子生長策略
    • 直方圖作差加速
    • 直接支持類別特徵(Categorical Feature)
    • Cache命中率優化
    • 基於直方圖的稀疏特徵優化
    • 多線程優化

LightGBM提出的主要緣由是爲了解決GBDT在海量數據遇到的問題,讓GBDT能夠更好更快地用於工業實踐。html

 

2、XGboost缺點

XGboost的不足之處主要有:python

1.精確貪心算法

每輪迭代時,都須要遍歷整個訓練數據屢次。若是把整個訓練數據裝進內存則會限制訓練數據的大小;若是不裝進內存,反覆地讀寫訓練數據又會消耗很是大的時間。算法

優勢:能夠找到精確的劃分條件apache

缺點:數組

  • 計算量巨大;
  • 內存佔用巨大;
  • 易產生過擬合

2.預排序方法(pre-sorted)

首先,空間消耗大。這樣的算法須要保存數據的特徵值,還保存了特徵排序的結果(例如排序後的索引,爲了後續快速的計算分割點),這裏須要消耗訓練數據兩倍的內存。其次時間上也有較大的開銷,在遍歷每個分割點的時候,都須要進行分裂增益的計算,消耗的代價大。安全

優勢:多線程

  • 可使用多線程
  • 能夠加速精確貪心算法

缺點:效率低下,可能產生沒必要要的葉結點機器學習

3.level-wise

生成決策樹是level-wise級別的,也就是預先設置好樹的深度以後,每一顆樹都須要生長到設置的那個深度,這樣有些樹在某一次分裂以後效果甚至沒有提高但仍然會繼續劃分樹枝,而後再次劃分....以後就是無用功了,耗時。ide

4.對cache優化不友好

在預排序後,特徵對梯度的訪問是一種隨機訪問,而且不一樣的特徵訪問的順序不同,沒法對cache進行優化。同時,在每一層長樹的時候,須要隨機訪問一個行索引到葉子索引的數組,而且不一樣特徵訪問的順序也不同,也會形成較大的cache miss。函數

 

3、LightGBM對Xgboost的優化

1.基於Histogram的決策樹算法

思想:將連續的浮點特徵離散成k個離散值,具體過程是首先肯定對於每個特徵須要多少的桶bin,而後均分,將屬於該桶的樣本數據更新爲bin的值,最後用直方圖表示。在進行特徵選擇時,只須要根據直方圖的離散值,遍歷尋找最優的分割點。

  使用直方圖算法有不少優勢。首先最明顯就是內存消耗的下降,直方圖算法不只不須要額外存儲預排序的結果,並且能夠只保存特徵離散化後的值,而這個值通常用8位整型存儲就足夠了,內存消耗能夠下降爲原來的1/8。

  而後在計算上的代價也大幅下降,預排序算法每遍歷一個特徵值就須要計算一次分裂的增益,而直方圖算法只須要計算k次(k能夠認爲是常數),時間複雜度從O(#data*#feature)優化到O(k*#features)。

Histogram算法有幾個須要注意的地方:

  • 使用bin替代原始數據至關於增長了正則化;
  • 使用bin意味着不少數據的細節特徵被放棄了,類似的數據可能被劃分到相同的桶中,這樣的數據之間的差別就消失了;
  • bin數量選擇決定了正則化的程度,bin越少懲罰越嚴重,欠擬合風險越高。
  • 構建直方圖時不須要對數據進行排序(比XGBoost快),由於預先設定了bin的範圍;
  • 直方圖除了保存劃分閾值和當前bin內樣本數之外還保存了當前bin內全部樣本的一階梯度和(一階梯度和的平方的均值等價於均方損失);
  • 閾值的選取是按照直方圖從小到大遍歷,使用了上面的一階梯度和,目的是獲得劃分以後△loss最大的特徵及閾值。

Histogram算法的優缺點:

  • Histogram算法並非完美的。因爲特徵被離散化後,找到的並非很精確的分割點,因此會對結果產生影響。但在實際的數據集上代表,離散化的分裂點對最終的精度影響並不大,甚至會好一些。緣由在於decision tree自己就是一個弱學習器,採用Histogram算法會起到正則化的效果,有效地防止模型的過擬合。
  • 時間上的開銷由原來的O(#data * #features)降到O(k * #features)。因爲離散化,#bin遠小於#data,所以時間上有很大的提高。

Histogram算法還能夠進一步加速:

  • 一個葉子節點的Histogram能夠直接由父節點的Histogram和兄弟節點的Histogram作差獲得。通常狀況下,構造Histogram須要遍歷該葉子上的全部數據,經過該方法,只須要遍歷Histogram的k個捅。速度提高了一倍。

 

2.帶深度限制的Leaf-wise的葉子生長策略

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

  XGBoost採用的是按層生長level(depth)-wise生長策略,可以同時分裂同一層的葉子,從而進行多線程優化,不容易過擬合;但不加區分的對待同一層的葉子,帶來了不少不必的開銷。由於實際上不少葉子的分裂增益較低,不必進行搜索和分裂。

  LightGBM採用leaf-wise生長策略,每次從當前全部葉子中找到分裂增益最大(通常也是數據量最大)的一個葉子,而後分裂,如此循環。所以同Level-wise相比,在分裂次數相同的狀況下,Leaf-wise能夠下降更多的偏差,獲得更好的精度。Leaf-wise的缺點是可能會長出比較深的決策樹,產生過擬合。所以LightGBM在Leaf-wise之上增長了一個最大深度的限制,在保證高效率的同時防止過擬合。

3.直方圖作差加速

  一個葉子的直方圖能夠由它的父親節點的直方圖與它兄弟的直方圖作差獲得。一般構造直方圖,須要遍歷該葉子上的全部數據,但直方圖作差僅需遍歷直方圖的k個桶。利用這個方法,LightGBM能夠在構造一個葉子的直方圖後,能夠用很是微小的代價獲得它兄弟葉子的直方圖,在速度上能夠提高一倍。

4.直接支持類別特徵

  實際上大多數機器學習工具都沒法直接支持類別特徵,通常須要把類別特徵,轉化one-hot特徵,下降了空間和時間的效率。而類別特徵的使用是在實踐中很經常使用的。基於這個考慮,LightGBM優化了對類別特徵的支持,能夠直接輸入類別特徵,不須要額外的0/1展開。並在決策樹算法上增長了類別特徵的決策規則。

  one-hot編碼是處理類別特徵的一個通用方法,然而在樹模型中,這可能並不必定是一個好的方法,尤爲當類別特徵中類別個數不少的狀況下。主要的問題是:

  • 可能沒法在這個類別特徵上進行切分(即浪費了這個特徵)。使用one-hot編碼的話,意味着在每個決策節點上只能使用one vs rest(例如是否是狗,是否是貓等)的切分方式。當類別值不少時,每一個類別上的數據可能會比較少,這時候切分會產生不平衡,這意味着切分增益也會很小(比較直觀的理解是,不平衡的切分和不切分沒有區別)。
  • 會影響決策樹的學習。由於就算能夠在這個類別特徵進行切分,也會把數據切分到不少零碎的小空間上,如圖1左邊所示。而決策樹學習時利用的是統計信息,在這些數據量小的空間上,統計信息不許確,學習會變差。但若是使用下圖右邊的分裂方式,數據會被切分到兩個比較大的空間,進一步的學習也會更好。

下圖右邊葉子節點的含義是X=A或者X=C放到左孩子,其他放到右孩子。

 

具體實現方法:

  爲了解決one-hot編碼處理類別特徵的不足。LightGBM採用了Many vs many的切分方式,實現了類別特徵的最優切分。用LightGBM能夠直接輸入類別特徵,併產生上圖右邊的效果。在1個k維的類別特徵中尋找最優切分,樸素的枚舉算法的複雜度是$O(2^k)$,而LightGBM採用瞭如On Grouping For Maximum Homogeneity的方法實現了$O(klogk)$的算法。

  算法流程下圖所示:在枚舉分割點以前,先把直方圖按每一個類別的均值進行排序;而後按照均值的結果依次枚舉最優分割點。從下圖能夠看到,Sum(y)/Count(y)爲類別的均值。固然,這個方法很容易過擬合,因此在LGBM中加入了不少對這個方法的約束和正則化。

  • 離散特徵創建直方圖的過程:統計該特徵下每一種離散值出現的次數,並從高到低排序,並過濾掉出現次數較少的特徵值, 而後爲每個特徵值,創建一個bin容器, 對於在bin容器內出現次數較少的特徵值直接過濾掉,不創建bin容器。
  • 計算分裂閾值的過程
    • 先看該特徵下劃分出的bin容器的個數,若是bin容器的數量小於4,直接使用one vs other方式, 逐個掃描每個bin容器,找出最佳分裂點;
    • 對於bin容器較多的狀況, 先進行過濾,只讓子集合較大的bin容器參加劃分閾值計算, 對每個符合條件的bin容器進行公式計算(公式以下: 該bin容器下全部樣本的一階梯度之和/該bin容器下全部樣本的二階梯度之和 + 正則項(參數cat_smooth),這裏爲何不是label的均值呢?其實上例中只是爲了便於理解,只針對了學習一棵樹且是迴歸問題的狀況, 這時候一階導數是Y, 二階導數是1),獲得一個值,根據該值對bin容器從小到大進行排序,而後分從左到右、從右到左進行搜索,獲得最優分裂閾值。可是有一點,沒有搜索全部的bin容器,而是設定了一個搜索bin容器數量的上限值,程序中設定是32,即參數max_num_cat。LightGBM中對離散特徵實行的是many vs many 策略,這32個bin中最優劃分的閾值的左邊或者右邊全部的bin容器就是一個many集合,而其餘的bin容器就是另外一個many集合。
    • 對於連續特徵,劃分閾值只有一個,對於離散值可能會有多個劃分閾值,每個劃分閾值對應着一個bin容器編號,當使用離散特徵進行分裂時,只要數據樣本對應的bin容器編號在這些閾值對應的bin集合之中,這條數據就加入分裂後的左子樹,不然加入分裂後的右子樹。

5.Cache命中率優化

6.基於直方圖的稀疏特徵優化

7.多線程優化

  LightGBM原生支持並行學習,目前支持特徵並行和數據並行的兩種。特徵並行的主要思想是在不一樣機器在不一樣的特徵集合上分別尋找最優的分割點,而後在機器間同步最優的分割點。數據並行則是讓不一樣的機器先在本地構造直方圖,而後進行全局的合併,最後在合併的直方圖上面尋找最優分割點。

  LightGBM針對這兩種並行方法都作了優化,在特徵並行算法中,經過在本地保存所有數據避免對數據切分結果的通訊;在數據並行中使用分散規約(Reduce scatter)把直方圖合併的任務分攤到不一樣的機器,下降通訊和計算,並利用直方圖作差,進一步減小了一半的通訊量。

  基於投票的數據並行則進一步優化數據並行中的通訊代價,使通訊代價變成常數級別。在數據量很大的時候,使用投票並行能夠獲得很是好的加速效果。

 

4、LightGBM原理

爲了可以在不損害準確率的條件下加快GBDT模型的訓練速度,lightGBM在傳統的GBDT算法上加了兩個技術:

  • 單邊梯度採樣 Gradient-based One-Side Sampling (GOSS):排除大部分小梯度的樣本,僅用剩下的樣本計算信息增益。
  • 互斥稀疏特徵綁定Exclusive Feature Bundling (EFB):從減小特徵角度

  GBDT雖然沒有數據權重,但每一個數據實例有不一樣的梯度,根據計算信息增益的定義,梯度大的實例對信息增益有更大的影響,所以在下采樣時,咱們應該儘可能保留梯度大的樣本(預先設定閾值,或者最高百分位間),隨機去掉梯度小的樣本。咱們證實此措施在相同的採樣率下比隨機採樣得到更準確的結果,尤爲是在信息增益範圍較大時。

  捆綁互斥特徵,也就是他們不多同時取非零值(也就是用一個合成特徵代替)。一般應用中,雖然特徵量比較多,可是因爲特徵空間十分稀疏,是否能夠設計一種無損的方法來減小有效特徵呢?特別在稀疏特徵空間上,許多特徵幾乎是互斥的(例如許多特徵不會同時爲非零值,像one-hot),咱們能夠捆綁互斥的特徵。最後,咱們將捆綁問題歸約到圖着色問題,經過貪心算法求得近似解。

1. Gradient-based One-Side Sampling(GOSS)

   GOSS在進行數據採樣的時候只保留了梯度較大的數據,可是若是直接將全部梯度較小的數據都丟棄掉勢必會影響數據的整體分佈.爲了抵消對數據分佈的影響,計算信息增益的時候,GOSS對小梯度的數據引入常量乘數。GOSS首先根據數據的梯度絕對值排序,選取top a個實例。而後在剩餘的數據中隨機採樣b個實例。接着計算信息增益時爲採樣出的小梯度數據乘以(1-a)/b,這樣算法就會更關注訓練不足的實例,而不會過多改變原數據集的分佈。

  • 首先根據數據的梯度將訓練降序排序。
  • 保留top a個數據實例,做爲數據子集A。
  • 對於剩下的數據的實例,隨機採樣得到大小爲b的數據子集B。
  • 最後咱們經過如下方程估計信息增益:

2. Exclusive Feature Bundling(EFB)

  EFB是經過特徵捆綁的方式減小特徵維度(實際上是降維技術)的方式,來提高計算效率。一般被捆綁的特徵都是互斥的(一個特徵值爲零,一個特徵值不爲零),這樣兩個特徵捆綁起來纔不會丟失信息。若是兩個特徵並非徹底互斥(部分狀況下兩個特徵都是非零值),能夠用一個指標對特徵不互斥程度進行衡量,稱之爲衝突比率,當這個值較小時,咱們能夠選擇把不徹底互斥的兩個特徵捆綁,而不影響最後的精度。

EBF的算法步驟以下:

  • 將特徵按照非零值的個數進行排序
  • 計算不一樣特徵之間的衝突比率
  • 遍歷每一個特徵並嘗試合併特徵,使衝突比率最小化

  高位的數據一般是稀疏的,這種稀疏性啓發咱們設計一種無損地方法來減小特徵的維度。特別的,稀疏特徵空間中,許多特徵是互斥的,例如他們從不一樣時爲非零值。咱們能夠綁定互斥的特徵爲單一特徵,經過仔細設計特徵臊面算法,咱們從特徵捆綁中構建了與單個特徵相同的特徵直方圖。這種方式的間直方圖時間複雜度從O(#data * #feature)降到O(#data * #bundle),因爲#bundle << # feature,咱們可以極大地加速GBDT的訓練過程並且損失精度。

有兩個問題:

  • 怎麼斷定那些特徵應該綁在一塊兒(build bundled)?
  • 怎麼把特徵綁爲一個(merge feature)?

理論1:將特徵分割爲較小量的互斥特徵羣是NP難的

bundle(什麼樣的特徵被綁定)算法流程:

  • 創建一個圖,每一個點表明特徵,每一個邊有權重,其權重和特徵之間整體衝突相關。
  • 按照降序排列圖中的度數來排序特徵。
  • 檢查排序以後的每一個特徵,對他進行特徵綁定或者創建新的綁定使得操做以後的整體衝突最小。

merging features(特徵合併):

  如何合併同一個bundle的特徵來下降訓練時間複雜度。關鍵在於原始特徵值能夠從bundle中區分出來。鑑於直方圖算法存儲離散值而不是連續特徵值,咱們經過將互斥特徵放在不一樣的箱中來構建bundle。這能夠經過將偏移量添加到特徵原始值中實現,例如,假設bundle中有兩個特徵,原始特徵A取值[0, 10],B取值[0, 20]。咱們添加偏移量10到B中,所以B取值[10, 30]。經過這種作法,就能夠安全地將A、B特徵合併,使用一個取值[0, 30]的特徵取代AB。

  EFB算法可以將許多互斥的特徵變爲低維稠密的特徵,就可以有效的避免沒必要要0值特徵的計算。實際,經過用表記錄數據中的非零值,來忽略零值特徵,達到優化基礎的直方圖算法。經過掃描表中的數據,建直方圖的時間複雜度將從O(#data)降到O(#non_zero_data)。固然,這種方法在構建樹過程當中須要而額外的內存和計算開銷來維持預特徵表。咱們在lightGBM中將此優化做爲基本函數,由於當bundles是稀疏的時候,這個優化與EFB不衝突(能夠用於EFB)

 

5、LightGBM參數調優

 下面幾張表爲重要參數的含義和如何應用

 

接下來是調參

 

下表對應了Faster Spread,better accuracy,over-fitting三種目的時,能夠調整的參數

 

 

參考文獻:

【1】LightGBM介紹及參數調優

【2】快的不要不要的lightGBM

【3】LightGBM——提高機器算法(圖解+理論+安裝方法+python代碼)

【4】https://www.bilibili.com/video/av47496956?from=search&seid=11905257687121452350

【5】機器學習算法之LightGBM

相關文章
相關標籤/搜索