基礎概念
LigthGBM是boosting集合模型中的新進成員,它和xgboost一樣是對GBDT的高效實現,很多方面會比xgboost表現的更為優秀。原理上它和GBDT及xgboot類似,都採用損失函數的負梯度作為當前決策樹的殘差近似值,去擬合新的決策樹。
LightGBM的優化點
1、採用直方圖算法
2、樹的生長策略優化
3、相對於xgboost和GBDT,LightGBM提出了兩個新方法,使得LightGBM的效率要顯著要高於GBDT和xgboost。這兩種新方法是:Gradient-based One-Side Sampling (GOSS:基於梯度的one-side採樣) 和Exclusive Feature Bundling (EFB:互斥的特徵捆綁)
直方圖算法(Histogram)
直方圖算法是先把連續的浮點特徵值離散化成k個整數,同時構造一個寬度為k的直方圖。遍歷數據時,根據離散化後的值作為索引在直方圖中累積統計量,當遍歷一次數據後,直方圖累積了需要的統計量,然後根據直方圖的離散值,遍歷尋找最優的分割點。
它的優點如下:
- 直方圖只需對直方圖統計量計算信息增益,相比較於預排序算法每次都遍歷所有的值,信息增益的計算量要小很多
- 通過利用葉節點的父節點和相鄰節點的直方圖的相減來獲得該葉節點的直方圖,從而減少構建直方圖次數,提升效率
- 存儲直方圖統計量所使用的內存遠小於預排序算法
樹的生長策略優化
LightGBM 通過 leaf-wise (best-first)策略來生長樹。它將選取具有最大信息增益最大的葉節點來生長。 當生長相同的葉子時,leaf-wise 算法可以比 level-wise 算法減少更多的損失。
當 數據較小的時候,leaf-wise 可能會造成過擬合。 所以,LightGBM 可以利用額外的參數 max_depth 來限制樹的深度並避免過擬合(樹的生長仍然通過 leaf-wise 策略)。
Gradient-based One-Side Sampling
GOSS是通過區分不同梯度的實例,保留較大梯度實例同時對較小梯度隨機採樣的方式減少計算量,從而達到提升效率的目的。
這裡有一個問題,為什麼只對梯度小的樣本進行採樣呢?
因為在提升樹訓練過程中目標函數學習的就是負梯度(近似殘差),梯度小說明訓練誤差已經很小了,對這部分數據的進一步學習的效果不如對梯度大的樣本進行學習的效果好或者說對梯度小的樣本進行進一步學習對改善結果精度幫助其實並不大。
GOSS的計算步驟如下:
- 根據樣本的梯度將樣本降序排序。
- 保留前n個數據樣本,作為數據子集z1。
- 對於剩下的數據的樣本,隨機採樣獲得大小為m的數據子集Z2。
- 計算信息增益時對採樣的Z2樣本的梯度數據乘以(1-n)/m(目的是不改變原數據的分佈)
Exclusive Feature Bundling
EFB是通過特徵捆綁的方式減少特徵維度(其實是降維技術)的方式,來提升計算效率。通常被捆綁的特徵都是互斥的(一個特徵值為零一個特徵值不為零),這樣兩個特徵捆綁起來才不會丟失信息。如果兩個特徵並不是完全互斥(部分情況下兩個特徵都是非零值),可以用一個指標對特徵不互斥程度進行衡量,稱之為衝突比率,當這個值較小時,我們可以選擇把不完全互斥的兩個特徵捆綁,而不影響最後的精度。
EBF的算法步驟如下:
- 將特徵按照非零值的個數進行排序
- 計算不同特徵之間的衝突比率
- 遍歷每個特徵並嘗試合併特徵,使衝突比率最小化
LightGBM的python包參數詳解
超參數:
- max_depth, default=-1, type=int,樹的最大深度限制,防止過擬合
- min_data_in_leaf, default=20, type=int, 葉子節點最小樣本數,防止過擬合
- feature_fraction, default=1.0, type=double, 0.0 < feature_fraction < 1.0,隨機選擇特徵比例,加速訓練及防止過擬合
- feature_fraction_seed, default=2, type=int,隨機種子數,保證每次能夠隨機選擇樣本的一致性
- bagging_fraction, default=1.0, type=double, 類似隨機森林,每次不重採樣選取數據
- lambda_l1, default=0, type=double, L1正則
- lambda_l2, default=0, type=double, L2正則
- min_split_gain, default=0, type=double, 最小切分的信息增益值
- top_rate, default=0.2, type=double,大梯度樹的保留比例
- other_rate, default=0.1, type=int,小梯度樹的保留比例
- min_data_per_group, default=100, type=int,每個分類組的最小數據量
- max_cat_threshold, default=32, type=int,分類特徵的最大閾值
LightGBM的python簡單實現
import lightgbm as lgb
import pandas as pd
iris = load_iris()
data=iris.data
target = iris.target
X_train,X_test,y_train,y_test =train_test_split(data,target,test_size=0.25)
gbm = lgb.LGBMRegressor(learning_rate=0.03,n_estimators=200,max_depth=8)
gbm.fit(X_train, y_train)
#預測結果
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration_)
參考文檔:
官方中文文檔
http://lightgbm.apachecn.org/cn/latest/index.html
原理介紹文檔
https://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree.pdf
閱讀更多 i機器不學習 的文章