LightGBM提出的主要緣由是爲了解決GBDT在海量數據遇到的問題,讓GBDT能夠更好更快地用於工業實踐。html
XGboost的不足之處主要有:python
每輪迭代時,都須要遍歷整個訓練數據屢次。若是把整個訓練數據裝進內存則會限制訓練數據的大小;若是不裝進內存,反覆地讀寫訓練數據又會消耗很是大的時間。算法
優勢:能夠找到精確的劃分條件apache
缺點:數組
首先,空間消耗大。這樣的算法須要保存數據的特徵值,還保存了特徵排序的結果(例如排序後的索引,爲了後續快速的計算分割點),這裏須要消耗訓練數據兩倍的內存。其次時間上也有較大的開銷,在遍歷每個分割點的時候,都須要進行分裂增益的計算,消耗的代價大。安全
優勢:多線程
缺點:效率低下,可能產生沒必要要的葉結點機器學習
生成決策樹是level-wise級別的,也就是預先設置好樹的深度以後,每一顆樹都須要生長到設置的那個深度,這樣有些樹在某一次分裂以後效果甚至沒有提高但仍然會繼續劃分樹枝,而後再次劃分....以後就是無用功了,耗時。ide
在預排序後,特徵對梯度的訪問是一種隨機訪問,而且不一樣的特徵訪問的順序不同,沒法對cache進行優化。同時,在每一層長樹的時候,須要隨機訪問一個行索引到葉子索引的數組,而且不一樣特徵訪問的順序也不同,也會形成較大的cache miss。函數
思想:將連續的浮點特徵離散成k個離散值,具體過程是首先肯定對於每個特徵須要多少的桶bin,而後均分,將屬於該桶的樣本數據更新爲bin的值,最後用直方圖表示。在進行特徵選擇時,只須要根據直方圖的離散值,遍歷尋找最優的分割點。
使用直方圖算法有不少優勢。首先最明顯就是內存消耗的下降,直方圖算法不只不須要額外存儲預排序的結果,並且能夠只保存特徵離散化後的值,而這個值通常用8位整型存儲就足夠了,內存消耗能夠下降爲原來的1/8。
而後在計算上的代價也大幅下降,預排序算法每遍歷一個特徵值就須要計算一次分裂的增益,而直方圖算法只須要計算k次(k能夠認爲是常數),時間複雜度從O(#data*#feature)優化到O(k*#features)。
Histogram算法有幾個須要注意的地方:
Histogram算法的優缺點:
Histogram算法還能夠進一步加速:
在Histogram算法之上,LightGBM進行進一步的優化。首先它拋棄了大多數GBDT工具使用的按層生長 (level-wise)的決策樹生長策略,而使用了帶有深度限制的按葉子生長 (leaf-wise)算法。
XGBoost採用的是按層生長level(depth)-wise生長策略,可以同時分裂同一層的葉子,從而進行多線程優化,不容易過擬合;但不加區分的對待同一層的葉子,帶來了不少不必的開銷。由於實際上不少葉子的分裂增益較低,不必進行搜索和分裂。
LightGBM採用leaf-wise生長策略,每次從當前全部葉子中找到分裂增益最大(通常也是數據量最大)的一個葉子,而後分裂,如此循環。所以同Level-wise相比,在分裂次數相同的狀況下,Leaf-wise能夠下降更多的偏差,獲得更好的精度。Leaf-wise的缺點是可能會長出比較深的決策樹,產生過擬合。所以LightGBM在Leaf-wise之上增長了一個最大深度的限制,在保證高效率的同時防止過擬合。
一個葉子的直方圖能夠由它的父親節點的直方圖與它兄弟的直方圖作差獲得。一般構造直方圖,須要遍歷該葉子上的全部數據,但直方圖作差僅需遍歷直方圖的k個桶。利用這個方法,LightGBM能夠在構造一個葉子的直方圖後,能夠用很是微小的代價獲得它兄弟葉子的直方圖,在速度上能夠提高一倍。
實際上大多數機器學習工具都沒法直接支持類別特徵,通常須要把類別特徵,轉化one-hot特徵,下降了空間和時間的效率。而類別特徵的使用是在實踐中很經常使用的。基於這個考慮,LightGBM優化了對類別特徵的支持,能夠直接輸入類別特徵,不須要額外的0/1展開。並在決策樹算法上增長了類別特徵的決策規則。
one-hot編碼是處理類別特徵的一個通用方法,然而在樹模型中,這可能並不必定是一個好的方法,尤爲當類別特徵中類別個數不少的狀況下。主要的問題是:
下圖右邊葉子節點的含義是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中加入了不少對這個方法的約束和正則化。
LightGBM原生支持並行學習,目前支持特徵並行和數據並行的兩種。特徵並行的主要思想是在不一樣機器在不一樣的特徵集合上分別尋找最優的分割點,而後在機器間同步最優的分割點。數據並行則是讓不一樣的機器先在本地構造直方圖,而後進行全局的合併,最後在合併的直方圖上面尋找最優分割點。
LightGBM針對這兩種並行方法都作了優化,在特徵並行算法中,經過在本地保存所有數據避免對數據切分結果的通訊;在數據並行中使用分散規約(Reduce scatter)把直方圖合併的任務分攤到不一樣的機器,下降通訊和計算,並利用直方圖作差,進一步減小了一半的通訊量。
基於投票的數據並行則進一步優化數據並行中的通訊代價,使通訊代價變成常數級別。在數據量很大的時候,使用投票並行能夠獲得很是好的加速效果。
爲了可以在不損害準確率的條件下加快GBDT模型的訓練速度,lightGBM在傳統的GBDT算法上加了兩個技術:
GBDT雖然沒有數據權重,但每一個數據實例有不一樣的梯度,根據計算信息增益的定義,梯度大的實例對信息增益有更大的影響,所以在下采樣時,咱們應該儘可能保留梯度大的樣本(預先設定閾值,或者最高百分位間),隨機去掉梯度小的樣本。咱們證實此措施在相同的採樣率下比隨機採樣得到更準確的結果,尤爲是在信息增益範圍較大時。
捆綁互斥特徵,也就是他們不多同時取非零值(也就是用一個合成特徵代替)。一般應用中,雖然特徵量比較多,可是因爲特徵空間十分稀疏,是否能夠設計一種無損的方法來減小有效特徵呢?特別在稀疏特徵空間上,許多特徵幾乎是互斥的(例如許多特徵不會同時爲非零值,像one-hot),咱們能夠捆綁互斥的特徵。最後,咱們將捆綁問題歸約到圖着色問題,經過貪心算法求得近似解。
GOSS在進行數據採樣的時候只保留了梯度較大的數據,可是若是直接將全部梯度較小的數據都丟棄掉勢必會影響數據的整體分佈.爲了抵消對數據分佈的影響,計算信息增益的時候,GOSS對小梯度的數據引入常量乘數。GOSS首先根據數據的梯度絕對值排序,選取top a個實例。而後在剩餘的數據中隨機採樣b個實例。接着計算信息增益時爲採樣出的小梯度數據乘以(1-a)/b,這樣算法就會更關注訓練不足的實例,而不會過多改變原數據集的分佈。
EFB是經過特徵捆綁的方式減小特徵維度(實際上是降維技術)的方式,來提高計算效率。一般被捆綁的特徵都是互斥的(一個特徵值爲零,一個特徵值不爲零),這樣兩個特徵捆綁起來纔不會丟失信息。若是兩個特徵並非徹底互斥(部分狀況下兩個特徵都是非零值),能夠用一個指標對特徵不互斥程度進行衡量,稱之爲衝突比率,當這個值較小時,咱們能夠選擇把不徹底互斥的兩個特徵捆綁,而不影響最後的精度。
EBF的算法步驟以下:
高位的數據一般是稀疏的,這種稀疏性啓發咱們設計一種無損地方法來減小特徵的維度。特別的,稀疏特徵空間中,許多特徵是互斥的,例如他們從不一樣時爲非零值。咱們能夠綁定互斥的特徵爲單一特徵,經過仔細設計特徵臊面算法,咱們從特徵捆綁中構建了與單個特徵相同的特徵直方圖。這種方式的間直方圖時間複雜度從O(#data * #feature)降到O(#data * #bundle),因爲#bundle << # feature,咱們可以極大地加速GBDT的訓練過程並且損失精度。
有兩個問題:
理論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)
下面幾張表爲重要參數的含義和如何應用
接下來是調參
下表對應了Faster Spread,better accuracy,over-fitting三種目的時,能夠調整的參數
參考文獻:
【3】LightGBM——提高機器算法(圖解+理論+安裝方法+python代碼)
【4】https://www.bilibili.com/video/av47496956?from=search&seid=11905257687121452350