先上官網鏈接:https://lightgbm.readthedocs.io/en/latest/
接着帶着問題去學習LGB:
1.LGB算法原理是什么
2.LGB應用場景是什么?或者說要求數據類型是什么
3.參數,調參之類的?
一、LGB原理
LightGBM (Light Gradient Boosting Machine)是一個實現 GBDT 算法的框架,支持高效率的並行訓練,並且具有以下優點:
- 更快的訓練速度
- 更低的內存消耗
- 更好的准確率
- 分布式支持,可以快速處理海量數據
既然都提到了GBDT,那么還是先回去復習一下GBDT再來看看
1.1 Xgboost 原理
目前已有的 GBDT 工具基本都是基於預排序的方法(pre-sorted)的決策樹算法(如 xgboost)。這種構建決策樹的算法基本思想是:
-
首先,對所有特征都按照特征的數值進行預排序。
-
其次,在遍歷分割點的時候用
O(#data)
的代價找到一個特征上的最好分割點。 -
最后,找到一個特征的分割點后,將數據分裂成左右子節點。
這樣的預排序算法的優點是:能精確地找到分割點。
缺點也很明顯:
-
首先,空間消耗大。這樣的算法需要保存數據的特征值,還保存了特征排序的結果(例如排序后的索引,為了后續快速的計算分割點),這里需要消耗訓練數據兩倍的內存。
-
其次,時間上也有較大的開銷,在遍歷每一個分割點的時候,都需要進行分裂增益的計算,消耗的代價大。
-
最后,對 cache 優化不友好。在預排序后,特征對梯度的訪問是一種隨機訪問,並且不同的特征訪問的順序不一樣,無法對 cache 進行優化。同時,在每一層長樹的時候,需要隨機訪問一個行索引到葉子索引的數組,並且不同特征訪問的順序也不一樣,也會造成較大的 cache miss。
1.2 LightGBM 優化
LightGBM 優化部分包含以下:
- 基於 Histogram 的決策樹算法
- 帶深度限制的 Leaf-wise 的葉子生長策略
- 直方圖做差加速
- 直接支持類別特征(Categorical Feature)
- Cache 命中率優化
- 基於直方圖的稀疏特征優化
- 多線程優化。
不懂Histogram 的決策樹算法?
1.2.1 Histogram 算法
直方圖算法的基本思想是先把連續的浮點特征值離散化成k個整數,同時構造一個寬度為k的直方圖。在遍歷數據的時候,根據離散化后的值作為索引在直方圖中累積統計量,當遍歷一次數據后,直方圖累積了需要的統計量,然后根據直方圖的離散值,遍歷尋找最優的分割點。
使用直方圖算法有很多優點。首先,最明顯就是內存消耗的降低,直方圖算法不僅不需要額外存儲預排序的結果,而且可以只保存特征離散化后的值,而這個值一般用 8 位整型存儲就足夠了,內存消耗可以降低為原來的1/8。
然后在計算上的代價也大幅降低,預排序算法每遍歷一個特征值就需要計算一次分裂的增益,而直方圖算法只需要計算k次(k可以認為是常數),時間復雜度從O(#data*#feature)
優化到O(k*#features)
。
當然,Histogram 算法並不是完美的。由於特征被離散化后,找到的並不是很精確的分割點,所以會對結果產生影響。但在不同的數據集上的結果表明,離散化的分割點對最終的精度影響並不是很大,甚至有時候會更好一點。
原因是決策樹本來就是弱模型,分割點是不是精確並不是太重要;較粗的分割點也有正則化的效果,可以有效地防止過擬合;即使單棵樹的訓練誤差比精確分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下沒有太大的影響。
這個直方圖算法還是很容易理解的,但是帶深度限制的 Leaf-wise 的葉子生長策略又是什么?
1.2.2 帶深度限制的 Leaf-wise 的葉子生長策略
在 Histogram 算法之上,LightGBM 進行進一步的優化。首先它拋棄了大多數 GBDT 工具使用的按層生長 (level-wise) 的決策樹生長策略,而使用了帶有深度限制的按葉子生長 (leaf-wise) 算法。Level-wise 過一次數據可以同時分裂同一層的葉子,容易進行多線程優化,也好控制模型復雜度,不容易過擬合。但實際上 Level-wise 是一種低效的算法,因為它不加區分的對待同一層的葉子,帶來了很多沒必要的開銷,因為實際上很多葉子的分裂增益較低,沒必要進行搜索和分裂。
Leaf-wise 則是一種更為高效的策略,每次從當前所有葉子中,找到分裂增益最大的一個葉子,然后分裂,如此循環。因此同 Level-wise 相比,在分裂次數相同的情況下,Leaf-wise 可以降低更多的誤差,得到更好的精度。Leaf-wise 的缺點是可能會長出比較深的決策樹,產生過擬合。因此 LightGBM 在 Leaf-wise 之上增加了一個最大深度的限制,在保證高效率的同時防止過擬合。
這個圖片看着還是好理解
1.2.3 直方圖加速
LightGBM 另一個優化是 Histogram(直方圖)做差加速。一個容易觀察到的現象:一個葉子的直方圖可以由它的父親節點的直方圖與它兄弟的直方圖做差得到。通常構造直方圖,需要遍歷該葉子上的所有數據,但直方圖做差僅需遍歷直方圖的k個桶。利用這個方法,LightGBM 可以在構造一個葉子的直方圖后,可以用非常微小的代價得到它兄弟葉子的直方圖,在速度上可以提升一倍。
看完還是懵逼
1.2.4 直接支持類別特征
實際上大多數機器學習工具都無法直接支持類別特征,一般需要把類別特征,轉化到多維的0/1 特征,降低了空間和時間的效率。而類別特征的使用是在實踐中很常用的。基於這個考慮,LightGBM 優化了對類別特征的支持,可以直接輸入類別特征,不需要額外的0/1 展開。並在決策樹算法上增加了類別特征的決策規則。在 Expo 數據集上的實驗,相比0/1 展開的方法,訓練速度可以加速 8 倍,並且精度一致。據我們所知,LightGBM 是第一個直接支持類別特征的 GBDT 工具。
LightGBM 的單機版本還有很多其他細節上的優化,比如 cache 訪問優化,多線程優化,稀疏特征優化等等。優化匯總如下:
反正我只看到支持類別型變量,那么就回答了我說的應用場景是什么,也就是數值類別型的都可以支持
1.2.5 LightGBM並行優化
LightGBM 還具有支持高效並行的優點。LightGBM 原生支持並行學習,目前支持特征並行和數據並行的兩種。
- 特征並行的主要思想是在不同機器在不同的特征集合上分別尋找最優的分割點,然后在機器間同步最優的分割點。
- 數據並行則是讓不同的機器先在本地構造直方圖,然后進行全局的合並,最后在合並的直方圖上面尋找最優分割點。
LightGBM 針對這兩種並行方法都做了優化:
- 在特征並行算法中,通過在本地保存全部數據避免對數據切分結果的通信;
- 在數據並行中使用分散規約 (Reduce scatter) 把直方圖合並的任務分攤到不同的機器,降低通信和計算,並利用直方圖做差,進一步減少了一半的通信量。基於投票的數據並行則進一步優化數據並行中的通信代價,使通信代價變成常數級別。在數據量很大的時候,使用投票並行可以得到非常好的加速效果。
反正就是牛逼轟轟,加快運行速度的意思
1.3 其他注意
- 當生長相同的葉子時,Leaf-wise 比 level-wise 減少更多的損失。
- 高速,高效處理大數據,運行時需要更低的內存,支持 GPU
- 不要在少量數據上使用,會過擬合,建議 10,000+ 行記錄時使用。
本文章轉載:https://blog.csdn.net/weixin_39807102/article/details/81912566,只做學習筆記,不做商業用途