LightGBM(light gradient boosting machine,輕量梯度提升機)是對XGBoost進行改進的模型版本,其三者之間的演變關系為:GBDT-》XGBoost-》LightGBM,依次對性能進行優化,盡管XGBoost已經很高效了,但是仍然有缺陷,故此時就得到一個更為高效的模型版本LightGBM
由于XGBoost的復雜度是由于對每個特征值進行預排序,遍歷所有可能的分裂點計算增益,其排序算法的復雜度=特征數×特征分裂點的數量×樣本數。對XGBoost優化主要就從特征數、特征分裂點、樣本數三個方面進行優化
?其涉及的優化方面涉及算法和策略(機器學習的三要素:模型、策略和算法),以下是LightGBM采樣的四個優化方法:
①直方圖算法(Histogram-based Split,從特征分裂點的優化)
由于XGBoost通過對每個特征值進行排序,遍歷所有可能的分裂點計算增益,其計算復雜度高(特征數×特征分裂點數×樣本量),內存消耗較大。其優化的方式是將連續特征離散化轉化為直方圖的bins,僅需遍歷所有的bins而非所有的樣本來尋找最優特分裂點。使得其復雜度降低到O(特征數×bins數×樣本量),同時還可以通過直方圖差加速(父結點直方圖剪去子結點直方圖得到另外一個子結點的直方圖),其速度提升十倍,內存消耗降低到1/10
知識補充:
在機器學習中,bins(即分箱或者區間)指的是將連續型特征(年齡、收入、溫度等)的數值范圍離散化為多個區間,對每個區間進行整數編號。即劃分區間
②單邊梯度抽樣(Gradient-based One-Side Sampling,從對應樣本量的優化)
這個單邊梯度抽樣是分為對高梯度樣本和低梯度樣本進行分別抽樣,使得在減少30%~50%的數據量時,幾乎不損失精度。這種方法避免了傳統隨機采樣過程中可能丟失重要樣本信息。
其核心思想分為三個 :
A.保留高梯度樣本:選取梯度絕對值最大的前a%樣本,
B.隨機抽樣低梯度樣本:從剩余樣本中隨機抽取b%,并為其梯度乘以(1-a)/b作為補償分布偏移。一般a和b的默認取值為0.2和0.1
C.僅用抽樣數據計算分裂增益值,降低原本使用全部樣本進行增益計算的計算復雜度。
其分裂增益計算的數學表達式:
知識補充:
梯度在GBDT中代表樣本的預測難度,即梯度的絕對值越大,樣本越難擬合
③互斥特征捆綁算法(Exclusive Feature Bunding,從特征數上優化)
在高維特征中,許多特征是互斥的(如“用戶性別”和“懷孕次數”不會同時為非零值),對于這種互斥或者沖突最少的特征進行捆綁,將捆綁的特征映射到同一個bin范圍(如原特征A的bin范圍是0-10,特征B的bin范圍為11-20);那么怎么識別這種互斥或者沖突最少的特征呢?可以選擇使用貪心算法和圖著色算法獲取沖突最少特征。那么如何定義沖突最少呢?此時可以定義一個捆綁特征沖突率,當該沖突率低于閾值(max_conflict_rate)時,即可對其特征進行捆綁。
知識補充1:
(如“用戶性別”和“懷孕次數”不會同時為非零值)這一內容怎么理解?
對于性別為男性的用戶,懷孕次數幾乎總是 0(除非特殊場景)。
對于性別為女性的用戶,懷孕次數可能為 0、1、2 等。如果在一些場景為>0的樣本
結論:在同一行數據中,這兩個特征不會同時為非零值(男性懷孕次數為0,女性懷孕次數可能為非零)。因此它們是互斥特征(如果其為男性,那么其懷孕次數自動為0;而懷孕次數不為0,一定是女性,在這種場景下兩個特征就可以視為單一特征)。
知識補充2:
捆綁特征選擇算法(圖著色算法):將所有特征視為圖的各個頂點,用一條邊連接兩個不互相獨立的特征,邊的權重則表示兩個相連接的特征的沖突比率(max_conflict_rate),通過閾值比較判定兩點之間是否需要被涂上同一個顏色。但是這樣會存在一個問題,特征捆綁后怎么進行取值的問題?比如一個特征A的取值范圍是[20,40),另外一個特征B的取值范圍為[30,60),此時特征捆綁后不做什么特殊處理后,就會得到取值范圍為[20,60],那么我現在有一個值為30的特征值,我該放進A特征中,還是放進B特征中呢?故需要對不互相獨立的特征進行一個偏置處理,即比如對特征B的取值范圍加上一個10的偏置值,使得B特征的取值范圍變成[40,70],此時就可以對里面的特征進行很好的區分了
④leaf-wise生長策略(帶有深度限制葉子結點生長,即有max_depth作為葉子結點生長限制條件,為了避免出現XGBoost的過擬合的問題)
XGBoost的Level_wise策略:逐層分裂所有葉子結點,避免過擬合但產生冗余分裂(出現某些增益低的結點無需分裂),故其產生的是一個對稱樹。
LightGBM的leaf_wise策略:只分裂增益最大的葉子,生成不對稱樹,并通過設置max_depth來防止過擬合。故其產生的是一個不對稱樹
綜上,LightGBM較XGBoost更適合處理大規模(百萬級別以上的樣本)、高維特征、實時性高的數據樣本;而對于小規模本地上運行的樣本、樣本需要精細調制的、需要強解釋的模型,建議使用XGBoost框架。
幸運的是,LightGBM作為工業級的框架,其已經封裝成庫,直接可以在pycharm中通過pip install lightgbm的指令進行安裝。Lightgbm庫提供了分類和回歸兩大類接口,以及可以繪制模型特征重要性圖