機器學習——LightGBM



###基礎概念

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM