機器學習 之LightGBM算法



1、基本知識點簡介

  • 在集成學習的Boosting提升算法中,有兩大家族:第一是AdaBoost提升學習方法,另一種是GBDT梯度提升樹。

  • 傳統的AdaBoost算法:利用前一輪迭代弱學習器的誤差來更新訓練集的權重,一輪輪迭代下去。

  • 梯度提升樹GBDT:也是通過迭代的算法,使用前向分布算法,但是其弱分類器限定了只能使用CART回歸樹模型。

  • GBDT算法原理:指通過在殘差減小的梯度方向建立boosting tree(提升樹),即gradient boosting tree(梯度提升樹)。每次建立新模型都是為了使之前模型的殘差往梯度方向下降。

  • XGBoost原理:XGBoost屬於集成學習Boosting,是在GBDT的基礎上對Boosting算法進行的改進,並加入了模型復雜度的正則項。GBDT是用模型在數據上的負梯度作為殘差的近似值,從而擬合殘差。XGBoost也是擬合數據殘差,並用泰勒展開式(二階泰勒展開式)對模型損失殘差的近似,同時在損失函數上添加了正則化項。

  • lightGBM,它是微軟出的新的boosting框架,基本原理與XGBoost一樣,使用基於學習算法的決策樹,只是在框架上做了一優化(重點在模型的訓練速度的優化)。最主要的是LightGBM使用了基於直方圖的決策樹算法,基本思想是先把連續的浮點特征值離散化成k個整數,同時構造一個寬度為k的直方圖。在遍歷數據的時候,根據離散化后的值作為索引在直方圖中累積統計量,當遍歷一次數據后,直方圖累積了需要的統計量,當遍歷一次數據后,直方圖累積了需要的統計量,然后根據直方圖的離散值,遍歷尋找最優的分割點。

2、LightGBM輕量級提升學習方法

  • LightGBM原理和XGBoost類似,通過損失函數的泰勒展開式近似表達殘差(包含了一階和二階導數信息),另外利用正則化項控制模型的復雜度。但是LightGBM最大的特點是,
    1. 通過使用leaf-wise分裂策略代替XGBoost的level-wise分裂策略,通過只選擇分裂增益最大的結點進行分裂,避免了某些結點增益較小帶來的開銷。
    2. 另外LightGBM通過使用基於直方圖的決策樹算法,只保存特征離散化之后的值,代替XGBoost使用exact算法中使用的預排序算法(預排序算法既要保存原始特征的值,也要保存這個值所處的順序索引),減少了內存的使用,並加速的模型的訓練速度。

2.1 leaf-wise分裂策略

(1)XGBoost的level-wise分類策略

  • level-wise是指對每一層所有結點做無差別分裂,盡管部分結點的增益比較小,依然會進行分裂,帶來了沒必要的開銷。
    (2)LightGBM的leaf-wise分裂策略

  • leaf-wise是指在當前所有葉子結點中選擇分類增益最大的結點進行分裂,並進行最大深度限制,避免過擬合。

  • 二叉樹的分裂增益公式為:

其中\(\frac{1}{2} [\frac{G_{L}^{2}}{H_{L} + \lambda} + \frac{G_{R}^{2}}{H_{R} + \lambda} - \frac{(G_{L}+G_{R})^{2}}{H_{L} + H_{R} + \lambda}]\)是指不考慮其他因素,通過分裂得到的增益,但實際上每次引入新葉子結點,都會帶來復雜度的代價,即\(\gamma\)
\(G_{j} = \sum_{i \in I_{j}} g_{i}, i=1,2,...,n; j=1,2,..,T\)\(H_{j} = \sum_{i \in I_{j}} h_{i}, i=1,2,...,n; j=1,2,..,T\)
這里\(G_{j}\)為該葉子結點上面樣本集合中數據點在誤差函數上的一階導數和二階導數。

2.2 基於直方圖的排序算法

  • 直方圖算法基本實現:是指先把連續的浮點特征值離散化成 k 個整數,同時構造一個寬度為 k 的直方圖。在遍歷數據的時候,根據離散化后的值作為是索引,在直方圖中累積統計量,然后根據直方圖的離散值,遍歷尋找最優的分割點。在XGBoost中需要遍歷所有離散化的值,而LightGBM通過建立直方圖只需要遍歷 k 個直方圖的值。

  • 使用直方圖的優點:

    • 明顯減少內存的使用,因為直方圖不需要額外存儲預排序的結果,而且可以只保存特征離散化后的值。
    • 遍歷特征值時,不需要像XGBoost一樣需要計算每次分裂的增益,而是對每個特征只需要計算建立直方圖的個數,即k次,時間復雜度由O(#data * #feature)優化到O(k * #feature)。(由於決策樹本身是弱分類器,分割點是否精確並不是太重要,因此直方圖算法離散化的分割點對最終的精度影響並不大。另外直方圖由於取的是較粗略的分割點,因此不至於過度擬合,起到了正則化的效果)
    • LightGBM的直方圖能做差加速。一個葉子的直方圖可以由它的父親結點的直方圖與它兄弟的直方圖做差得到。構造的直方圖本來需要遍歷該葉子結點上所有數據,但是直方圖做差僅需遍歷直方圖的k個桶即可(即直方圖區間),速度上可以提升一倍。如下圖:

2.3 支持類別特征和高效並行處理

  • 直接支持類別特征,不需要做one-hot編碼。大多數機器學習都無法直接支持類別特征,一般需要把類別進行特征編碼,這樣就降低了空間和時間的效率。但是LightGBM可以在對離散特征分裂時,每個取值都當作一個桶,分裂時的增益為“是否屬於某個類別category”的gain。
  • 支持高效並行:包括特征並行和數據並行。(減少的是分割數據的時間,而不是模型訓練的時間)
    • 特征並行:即在不同機器上在不同的特征集上分別尋找最優的分割點,然后在機器間同步最優的分割點。其通過本地保存全部數據避免對數據切分結果的通信。
    • 數據並行:即讓不同的機器先在本地構造直方圖,然后進行全局的合並,最后在合並的直方圖上面尋找最優分割點。其使用分散規約(Reduce scatter)把直方圖合並的任務分攤到不同的機器上,降低了通信量,並利用直方圖做差,減少了通信量,即減少了通信時間。


參考
1、LightGBM官方文檔:https://lightgbm.readthedocs.io/en/latest/Features.html
2、LightGBM圖形理解:https://www.cnblogs.com/jiangxinyang/p/9337094.html


免責聲明!

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



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