LightGBM原理之論文詳解

2021-02-23 機器學習算法那些事

作者:立刻有

連結:

https://blog.csdn.net/shine19930820/article/details/79123216

編輯:石頭

原文:LightGBM : A Highly Efficient Gradient Boosting Decision Tree

原文下載:後臺回復「LightGBM"

【Abstract】

Gradient Boosting Decision Tree (GBDT)非常流行卻鮮有實現,只有像XGBoost和pGBRT。當特徵維度較高和數據量巨大的時候,其實現中仍然存在效率和可擴展性的問題。一個主要原因就是對於每一個特徵的每一個分裂點,都需要遍歷全部數據計算信息增益,這一過程非常耗時。針對這一問題,本文提出兩種新方法:Gradient-based One-Side Sampling (GOSS) 和Exclusive Feature Bundling (EFB)(基於梯度的one-side採樣和互斥的特徵捆綁)。在GOSS中,我們排除了重要的比例-具有小梯度的實例,只用剩下的來估計信息增益,我們證明,這些梯度大的實例在計算信息增益中扮演重要角色,GOSS可以用更小的數據量對信息增益進行相當準確的估計。對於EFB,我們捆綁互斥的特徵(什麼是互斥特徵:例如特徵間很少同時非零。),來降低特徵的個數。我們證明完美地捆綁互斥特徵是NP難的,但貪心算法能夠實現相當好的逼近率,因此我們能夠在不損害分割點準確率許多,有效減少特徵的數量。(犧牲一點分割準確率降低特徵數量),這一算法命名為LightGBM。在多個公共數據集實驗證明,LightGBM加速了傳統GBDT訓練過程20倍以上,同時達到了幾乎相同的精度 。

GBDT因為其的有效性、準確性、可解釋性,成為了廣泛使用的機器學習算法。GBDT在許多機器學習任務上取得了最好的效果( state-of-the-art),例如多分類,點擊預測,排序。但最近幾年隨著大數據的爆發(特徵量和數據量),GBDT面臨平衡準確率和效率的調整。

GBDT缺點:對於每一個特徵的每一個分裂點,都需要遍歷全部數據來計算信息增益。因此,其計算複雜度將受到特徵數量和數據量雙重影響,造成處理大數據時十分耗時。

解決這個問題的直接方法就是減少特徵量和數據量而且不影響精確度,有部分工作根據數據權重採樣來加速boosting的過程,但由於gbdt沒有樣本權重不能應用。而本文提出兩種新方法實現此目標。

Gradient-based One-Side Sampling (GOSS):GBDT雖然沒有數據權重,但每個數據實例有不同的梯度,根據計算信息增益的定義,梯度大的實例對信息增益有更大的影響,因此在下採樣時,我們應該儘量保留梯度大的樣本(預先設定閾值,或者最高百分位間),隨機去掉梯度小的樣本。我們證明此措施在相同的採樣率下比隨機採樣獲得更準確的結果,尤其是在信息增益範圍較大時。

Exclusive Feature Bundling (EFB):通常在真實應用中,雖然特徵量比較多,但是由於特徵空間十分稀疏,是否可以設計一種無損的方法來減少有效特徵呢?特別在稀疏特徵空間上,許多特徵幾乎是互斥的(例如許多特徵不會同時為非零值,像one-hot),我們可以捆綁互斥的特徵。最後,我們將捆綁問題歸約到圖著色問題,通過貪心算法求得近似解。

2.1 GBDT and Its Complexity Analysis

GBDT是一種集成模型的決策樹,順序訓練決策樹。每次迭代中,GBDT通過擬合負梯度(殘差)來學到決策樹。

學習決策樹是GBDT主要的時間花銷,而學習決策樹中找到最優切分點最消耗時間。廣泛採用的預排序算法來找到最優切分點,這種方法會列舉預排序中所有可能的切分點。這種算法雖然能夠找到最優的切分點,但對於訓練速度和內存消耗上都效率低。另一種流行算法是直方圖算法(histogram-based algorithm)。直方圖算法並不通過特徵排序找到最優的切分點,而是將連續的特徵值抽象成離散的分箱,並使用這些分箱在訓練過程中構建特徵直方圖,這種算法更加訓練速度和內存消耗上都更加高效,lightGBM使用此種算法。

histogram-based算法通過直方圖尋找最優切分點,其建直方圖消耗O(#data * #feature),尋找最優切分點消耗O(#bin * # feature),而#bin的數量遠小於#data,所以建直方圖為主要時間消耗。如果能夠減少數據量或特徵量,那麼還能夠夠加速GBDT的訓練。

2.2 Related Work

GBDT有許多實現,如XGBoost,PGBRT,Scikit-learn,gbm in R。Scikit-learn和gbm in R實現都用了預排序,pGBRT使用了直方圖算法,XGBoost支持預排序和直方圖算法,由於XGBoost勝過其他算法,我們用它作為baseline。

為了減小訓練數據集,通常做法是下採樣。例如過濾掉權重小於閾值的數據。SGB每次迭代中用隨機子集訓練弱學習器。或者採樣率基於訓練過程動態調整。除了基於AdaBoost的SGB不能直接應用於GBDT,因為GBDT中沒有原始的權重。雖然SGB也能間接應用於GBDT,但往往會影響精度。

同樣,過濾掉弱特徵(什麼是弱特徵)來減少特徵量。通常用主成分分析或者投影法。當然,這些方法依賴於一個假設-特徵包含高度的冗餘,但實際中往往不是。(設計特徵來自於其獨特的貢獻,移除任一維度都可以某種程度上影響精度)。

實際中大規模的數據集通常都是非常稀疏的,使用預排序算法的GBDT能夠通過無視為0的特徵來降低訓練時間消耗。然後直方圖算法沒有優化稀疏的方案。因為直方圖算法無論特徵值是否為0,都需要為每個數據檢索特徵區間值。如果基於直方圖的GBDT能夠有效利用稀疏特徵將是最優。

下圖是兩個算法的對比:

3. Gradient-based One-Side Sampling

GOSS是一種在減少數據量和保證精度上平衡的算法。

3.1 Algorithm Description

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

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

3.2 Theoretical Analysis

GBDT使用決策樹,來學習獲得一個將輸入空間映射到梯度空間的函數。假設訓練集有n個實例x1,...,xn,特徵維度為s。每次梯度迭代時,模型數據變量的損失函數的負梯度方向為g1,...,gn,決策樹通過最優切分點(最大信息增益點)將數據分到各個節點。GBDT通過分割後的方差衡量信息增益。

定義3.1:O表示某個固定節點的訓練集,分割特徵 j 的分割點d定義為:

其中,

遍歷每個特徵分裂點 j,找到

對應最大的分裂節點,並計算最大的信息增益。然後,將數據根據特徵的分裂點將數據分到左右節點。

在GOSS中,

1. 首先根據數據的梯度將訓練降序排序。

2. 保留top a個數據實例,作為數據子集A。

3. 對於剩下的數據的實例,隨機採樣獲得大小為b的數據子集B。

4. 最後我們通過以下方程估計信息增益:

此處GOSS通過較小的數據集估計信息增益,將大大地減小計算量。更重要的是,我們接下來理論表明GOSS不會丟失許多訓練精度,勝過(outperform)隨機採樣。理論的證明再附加材料。

Theorem 3.2  我們定義GOSS近似誤差為:,且

概率至少是1−δ,有:

其中:

根據理論3.2,我們得出以下結論:

1. GOSS的漸進逼近比率是:

如果數據分割不是極不平衡,比如:

近似誤差主要由第二項主導,當n趨於無窮(數據量很大)時,

趨於0。即數據量越大,誤差越小,精度越高。

2. 隨機採樣是GOSS在a=0的一種情況。多數情況下,GOSS性能優於隨機採樣,即以下情況:

即:

其中,

下面分析GOSS的泛化性。考慮GOSS泛化誤差:

這是GOSS抽樣的的實例計算出的方差增益與實際樣本方差增益之間的差距。

變換為:

因此,在GOSS準確的情況下,GOSS泛化誤差近似於全數據量的真實數據。另一方面,採樣將增加基學習器的多樣性(因為每次採樣獲得的數據可能會不同),這將提高泛化性。

4. Exclusive Feature Bundling 

這一章介紹如何有效減少特徵的數量

高維的數據通常是稀疏的,這種稀疏性啟發我們設計一種無損地方法來減少特徵的維度。特別的,稀疏特徵空間中,許多特徵是互斥的,例如他們從不同時為非零值。我們可以綁定互斥的特徵為單一特徵,通過仔細設計特徵搜尋算法,我們從特徵捆綁中構建了與單個特徵相同的特徵直方圖。這種方式的間直方圖時間複雜度從O(#data * #feature)降到O(#data * #bundle),由於#bundle << # feature,我們能夠極大地加速GBDT的訓練過程而且損失精度。

有兩個問題:

1. 怎麼判定那些特徵應該綁在一起(build bundled)?

2. 怎麼把特徵綁為一個(merge feature)?

4.1 bundle(什麼樣的特徵被綁定)?

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

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

給定圖著色實例G=(V, E)。以G的關聯矩陣的每一行為特徵,得到我們問題的一個實例有|V|個特徵。 很容易看到,在我們的問題中,一個獨特的特徵包與一組具有相同顏色的頂點相對應,反之亦然。

理論4.1說明多項式時間中求解這個NP難問題不可行。為了尋找好的近似算法,我們將最優捆綁問題歸結為圖著色問題,如果兩個特徵之間不是相互排斥,那麼我們用一個邊將他們連接,然後用合理的貪婪算法(具有恆定的近似比)用於圖著色來做特徵捆綁。 此外,我們注意到通常有很多特徵,儘管不是100%相互排斥的,也很少同時取非零值。 如果我們的算法可以允許一小部分的衝突,我們可以得到更少的特徵包,進一步提高計算效率。經過簡單的計算,隨機汙染小部分特徵值將影響精度最多為:

γ是每個綁定中的最大衝突比率,當其相對較小時,能夠完成精度和效率之間的平衡。

**算法3:**基於上面的討論,我們設計了算法3,偽代碼見下圖,具體算法:

1.建立一個圖,每個點代表特徵,每個邊有權重,其權重和特徵之間總體衝突相關。

2. 按照降序排列圖中的度數來排序特徵。

3. 檢查排序之後的每個特徵,對他進行特徵綁定或者建立新的綁定使得操作之後的總體衝突最小。

算法3的時間複雜度是O(#feature^2),訓練之前只處理一次,其時間複雜度在特徵不是特別多的情況下是可以接受的,但難以應對百萬維的特徵。為了繼續提高效率,我們提出了一個更加高效的無圖的排序策略:將特徵按照非零值個數排序,這和使用圖節點的度排序相似,因為更多的非零值通常會導致衝突,新算法在算法3基礎上改變了排序策略。

4.2 merging features(特徵合併)

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

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

這部分主要寫了lightGBM的實驗結果,主要用了五個公開數據集,如下

微軟的排序數據集(LETOR)包括30K的網頁搜索,數據集幾乎都是稠密的數值特徵。

Allstate是保險和航空延誤數據都包含了大量的one-hot特徵。

後兩個是KDD CUP2010和KDD CPU2012數據集,使用了冠軍解決方案中的特徵,其中包含了稀疏和稠密的特徵,並且這兩個數據集特別大。

這些數據集都比較大,而且包含了稀疏和稠密的特徵,涵蓋了很多真實的業務,因此它們能夠完全地測試lightGBM的性能。

5.1 Overall Comparison

XGBoost和lightGBM without GOSS 和EFB(lgb baseline),作為比較的基準。XGBoost使用了兩個版本:xgb_exa(預排序)和xgb_his(直方圖算法)。對於xgb_exa做了參數調整,使XGBoost長成和其他算法相似的樹。並且調整參數在速度和準確率間平衡。對於Allstate、KDD10 和 KDD2012,設置a = 0.05 , b = 0.05 ,對於航空延誤和LETOR,我們設置a = 0.1 , b = 0.1 ,數據集EFB我們設置γ = 0 。所有的算法有固定迭代次數。在一定迭代次數內,我們取最高的分數。

下表是訓練時間對比(時間是每次迭代的平均時間)

下表是精確度對比,分類使用AUC評價,排序使用NDCG評價。

下圖是飛行延時和LETOR的訓練曲線。

5.2 Analysis on GOSS

**速度上:**GOSS具有加速訓練的能力,表2中可以看出GOSS幾乎加速了兩倍。雖然GOSS用了10%-20%的數據訓練,但是由於有一些額外的計算,所以加速並不和數據量成反比,但是GOSS仍然極大加速了訓練。

**精度上:**從表4中可以看出,同樣採樣率,GOSS精度總比SGB好。

5.3 Analysis on EFB

表2表明,EFB在大數據集上能夠極大加速訓練。因為EFB合併大量的稀疏特徵到低維稠密的特徵,並且由於之前的孤立的特徵被bundle到一起,能能夠極大提高緩存的命中率,因此,它全部的效率提高是動態的。

綜上這些分析,EFB是改進直方圖算法稀疏性的非常高效的算法,能夠極大地加速GBDT訓練。

本文提出了新穎的GBDT算法–LightGBM,它包含了連個新穎的技術:Gradient-based One-Side Sampling (GOSS) 和Exclusive Feature Bundling (EFB)(基於梯度的one-side採樣和互斥的特徵捆綁)來處理大數據量和高維特徵的場景。我們在理論分析和實驗研究表明,GOSS和EFB使得LightGBM在計算速度和內存消耗上明顯優於XGBoost和SGB。

未來,我們將研究優化如何在GOSS中選擇a,b。繼續提高EFB在高維特徵上的性能,無論其是否是稀疏的。

推薦閱讀

LightGBM算法原理小結

相關焦點

  • 深入理解LightGBM
    我們還得先從xgboost說起談起Lightgbm, 我們已經知道了是xgboost的強化版本, 關於xgboost,從其工作原理到數學推導再到優化策略最後到實戰應用,【白話機器學習】算法理論+實戰之Xgboost算法都已經描述過了,這裡只進行簡單的回憶和梳理,在這次回憶中我們看看xgboost在某些策略上是不是依然存在一些問題?
  • 聊聊lightgbm
    (gbm1,method="OOB")print(best.iter)  best.iter <- gbm.perf(gbm1,method="test")print(best.iter)best.iter <- gbm.perf(gbm1,method="cv")print(best.iter)summary(gbm1,n.trees=1)
  • lightGBM用於排序(Learning to Rank )
    但是,Pairwise使用的這種基於兩兩文檔之間相對相關度的損失函數,和真正衡量排序效果的一些指標之間,可能存在很大的不同,有時甚至是負相關,如下圖所示(pairwise的損失函數和NDCG之呈現出負相關性):
  • 數學推導+純Python實現機器學習算法:LightGBM
    我們重點梳理上述三個優化角度的基本原理即可。Histogram算法    為了減少特徵分裂點的數量和更加高效尋找最佳特徵分裂點,LightGBM區別於XGBoost的預排序算法,採用Histogram直方圖的算法尋找最佳特徵分裂點。
  • 數學推導+純Python實現機器學習算法18:LightGBM
    我們重點梳理上述三個優化角度的基本原理即可。Histogram算法    為了減少特徵分裂點的數量和更加高效尋找最佳特徵分裂點,LightGBM區別於XGBoost的預排序算法,採用Histogram直方圖的算法尋找最佳特徵分裂點。
  • 劍指LightGBM和XGboost!斯坦福發表NGBoost算法
    James Pond 在 Unsplash 雜誌上的照片Stanford ML Group 最近在他們的論文中發表了一個新算法,其實現被稱為 NGBoost。註:Stanford ML Group 發表的論文網址為:https://arxiv.org/abs/1910.03225,有興趣的同學可以下載學習~本文的主要內容包括以下三個部分:什麼是自然梯度增強?
  • lightgbm應用示例及網格調參
    查詢lightgbm的官方文檔有兩種接口可以使用:sklearn接口和原生接口,本文以sklearn為例。
  • 集成學習原理小結(AdaBoost & lightGBM demo)
    ,求贊求星求鼓勵~~~集成學習系列文章:集成學習原理小結(AdaBoost & lightGBM demo) https://blog.csdn.net/u010366748/article5.2 lightGBM demo數據說明:某城市各企業用電數據,從2015-1-1至2016-8-31,任務是預測未來一個月(即2016-9月)的用電情況方法:特徵工程+lightGBMlightGBM
  • 發動機原理及詳解之二
    【延伸閱讀】* 汽車的心臟——發動機* 發動機原理及詳解之一* 發動機原理及詳解之二* 發動機原理及詳解之三* 發動機原理及詳解之四  本文地址:https
  • 詳解本科論文查重原理
    大家是可以根據論文查重原理,降低論文查重率的。在撰寫論文的時候我們要特別注意這點,只有把論文的大部分內容修改調整好,才可以真正通過論文查重檢測。那麼論文到底是如何進行查重檢測的呢?上傳論文後的分割。導師最終是會要求我們上傳word文檔的,要是學校要求你把開題報告和這些部分也都複製在論文中,那你上傳的所有內容都是會進行查重檢測的。本科論文查重原理並不難理解的,主要是查重系統會根據論文進行分割,也許一篇論文是會劃分成幾十部分的,然後查重系統才會根據不同部分在文獻庫中進行對比的。文獻庫的全面核查。  論文查重系統把論文劃分後,就會進行文獻庫的全面查重檢測。
  • 如何用R建模GBM?
    1 2set.seed(123) 3bike_fit_1 <- gbm::gbm(cnt ~.,  4              5              6             data = BikeTrain,  7              8             verbose = TRUE,
  • 大數據大白話系列:淺析LightGBM
    lightGBM一直是各類競賽中的大殺器,今天我們就來講講這個大殺器吧。lightGBM是GBDT家族的一員。而GBDT在每一次運算的時候,都會把整個訓練數據都裝入內存,很浪費空間,並且限制了訓練數據的大小。
  • light單詞釋義詳解
    light n. 光明,光線,光亮 Language is the light of life. 語言是生命之光。– 光亮的:It’s not light enough to take a photograph. – 輕的:An iPod is light, pmuch lighter than an iPhone. – 淺色的:It’s a light blue flower.
  • 大戰三回合:XGBoost、LightGBM和Catboost一決高低
    (4)處理缺失的值;(5)XGBoost 比傳統的梯度增強方法(如 AdaBoost)要快得多;如果想深入研究這些算法,可以閱讀下面相關文章的連結:LightGBM: 一種高效的梯度增強決策樹 https://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree.pdf
  • 2小時入門Spark之MLlib
    如果有遇到需要對50G以上的數據進行Tf-idf特徵提取,缺失值填充,特徵篩選,最鄰近查找等特徵工程任務時,使用Pandas的同學可能要望洋興嘆了,這時候會使用Spark MLlib的同學就會露出迷之微笑。第二是提供機器學習模型的候選baseline。
  • 入門 | 從結構到性能,一文概述XGBoost、Light GBM和CatBoost的同與不同
    從那時開始,我就對這些算法的內在工作原理非常好奇,包括調參及其優劣勢,所以有了這篇文章。儘管最近幾年神經網絡復興,並變得流行起來,但我還是更加關注 boosting 算法,因為在訓練樣本量有限、所需訓練時間較短、缺乏調參知識的場景中,它們依然擁有絕對優勢。
  • 無油真空泵之-無油活塞泵工作原理詳解
    無油真空泵主要包括旋片式、爪型、螺杆式、渦旋式、活塞式泵等等,臺冠真空泵技術團隊工程師們今天為大家詳細介紹無油真空泵之-無油活塞泵工作原理詳解。無油活真空塞泵原理圖無油活真空塞泵工作時借活塞在氣缸內的往復作用使缸內容積反覆變化,以吸入和排出流體。
  • 光電傳感器三角測量原理詳解(BGS原理)
    我們在使用光電開關的時候,通常在使用手冊上會看到傳感器的工作原理為BGS,那麼BGS是什麼呢?它是依賴於什麼工作的呢?今天小編就帶大家一起學習學習。即BGS原理的傳感器可以有效地抑制黑白色差(黑白漂移)。光電傳感器三角測量原理詳解BGS內部圖那麼什麼是黑白色差呢?
  • 【GAN】四、CGAN論文詳解與代碼詳解
    若有興趣請分別移步如下連結:【GAN】一、利用keras實現DCGAN生成手寫數字圖像【GAN】二、原始GAN論文詳解【GAN】三、DCGAN論文詳解本篇博客我們將介紹CGAN(條件GAN)論文的相關細節。CGAN的論文網址請移步:https://arxiv.org/pdf/1411.1784.pdf。
  • 畢業論文查重原理及工具
    有一句俗語叫「天下文章一大抄,看你會抄不會抄」,雖然這句俗語可能難登大雅之堂,但的確也有其道理所在。古時候詩人寫詩喜歡化用前人詩句,我們不管它叫抄,我們叫做用典,叫做借鑑。並且還要順便稱讚一下他,說雖然化用前人詩句,卻創造出了新的意境。