個人學習筆記(十八)LightGBM與XGBoost的區別

       在LightGBM與XGBoost的相關資料裏,我發現很少有博客能把它們的重要區別完整羅列出來,要麼只介紹了GOSS、EFB,要麼只涉及到leaf-wise。所以在這裏我把這些資料整合起來,儘量用簡短的話語把LightGBM與XGBoost的重要區別敘述出來,內容包含了我自己的理解,不一定正確。

一、GOSS與EFB

       傳統的XGBoost算法在特徵維度較高和數據量巨大的時候,仍然存在效率和可擴展性的問題。這是因爲在基模型分裂時,目標函數的表達式是這樣的
Obj=12j=1TGj2Hj+λ+γTObj=-\frac{1}{2}\sum_{j=1}^T\frac{G_j^2}{H_j+\lambda}+\gamma|T|       上面的式子中,GjG_jHjH_j代表葉子節點的一階、二階梯度和,所以可以看到,對每一個特徵的每一個切分點,都要計算一遍上面的目標函數,而每一次計算都要遍歷所有數據(包括樣本、特徵),這個過程非常耗時。LightGBM利用GOSS(基於梯度的單邊採樣)和EFB(互斥特徵捆綁)改進了這一過程。
       在AdaBoost中,樣本權重代表了樣本的重要程度,被分類錯誤的樣本的權重較高。LightGBM參考了這一想法,用樣本梯度來衡量樣本的重要程度。爲什麼樣本梯度能衡量樣本有多重要呢?邏輯是這樣的,如果一個樣本的梯度比較小,一般意味着它的訓練誤差小(GBDT用負梯度代替殘差就是這一原理),已經被學習的很好了,因此可以直接丟棄掉。
       GOSS是這麼做的,首先根據樣本的梯度將樣本排序,保留TOP a%a\%個樣本作爲子集AA,再在剩下的(1a)%(1-a)\%的樣本里隨機選取b%b\%的樣本作爲子集BB,爲了抵消對數據分佈的影響,將子集BB內的樣本權重乘以一個1ab\frac{1-a}{b},將AABB合併作爲新的樣本集進行下一個基模型的訓練。
       上述GOSS通過樣本採樣,一定程度上減小了運算次數,接下來的EFB通過特徵捆綁,進一步提高了模型運算速度。
       EFB將多個稀疏特徵特徵捆綁成一個bundles,它是這麼做的。EFB首先構造一個圖,圖上的節點代表各個特徵,節點之間有邊,邊上的權重代表特徵之間的衝突,通過特徵在圖中的度來降序排序特徵,依次檢查每個特徵將它分配給具有小衝突的現有bundles(只分配具有小衝突的特徵)。這個算法的時間複雜度是O(n2)O(n^2),當特徵數量nn很大時,LightGBM會採用一種更高效的無圖排序,直接根據每個特徵的非零個數進行排序,這裏認爲每個特徵的非零個數越多,它與其他特徵的衝突也越多。
       好了,現在如果找到了兩個可以合併的特徵,EFB如何將它們合併呢?我們知道,LightGBM是通過直方圖將連續特徵離散化的,如果特徵A的取值範圍是[0, 10),特徵B的取值範圍是[0, 20),可以給特徵B一個10的偏移量,讓它的取值範圍變成[10, 30),這樣將特徵A、B分別離散化後合併,它們就會分佈在不同的bins中。

二、Leaf-wise

       這一點就是LightGBM與XGBoost的區別中老生常談的話題了,與XGBoost的level-wise不同,LightGBM採用了leaf-wise的分裂方式,看下面的兩幅圖就清楚了。
在這裏插入圖片描述
在這裏插入圖片描述
       相比之下,leaf-wise更爲高效,只需要少量的分裂就能很大程度的降低損失函數。但同時,也需要控制深度防止過擬合。

三、處理類別特徵

       對於類別特徵,一般需要轉化成多維的one-hot編碼特徵,這種做法降低了空間和時間的效率。還有很重要的一點是,決策樹在使用one-hot編碼分裂時,只能做到one vs many,但LightGBM使用了many vs many的切分方式。舉個栗子,如果一個特徵有A、B、C、D四個分類,XGBoost只能做到將A放一類,B、C、D放一類,而LightGBM能做到A、B一類,C、D一類。
       LightGBM是這麼做的,它根據訓練目標的相關性對類別進行重排序,更具體的說,類別特徵可以認爲是已經離散化成bins的特徵,而LightGBM根據gh\frac{\sum g}{\sum h}將各個bins重新排序,再選取最優切分點。

四、並行

       LightGBM在並行方面也對XGBoost做了改進,包括特徵並行與數據並行兩方面。
       特徵並行的傳統做法是,對數據列採樣,即不同的機器上保留不同的特徵子集,各個機器上的worker根據所分配的特徵子集尋找到局部的最優切分點(特徵、閾值),互相通信來從局部最佳切分點裏得到最佳切分點,擁有最佳切分點的worker執行切分操作,然後將切分結果傳送給其他的worker,其他的worker根據接收到的數據來進行下一次的切分數據。
       LightGBM對此做出的改進是,讓每個機器保留整個完整的數據集(並不是經過列採樣的數據),這樣就不必在切分後傳輸切分結果數據,因爲每個機器已經持有完整的數據集,這是典型的空間換時間。
       在數據並行方面,傳統的做法是,行採樣對數據進行橫向切分,worker使用分配到的局部數據構建局部的直方圖,合併局部直方圖得到全局的直方圖,對全局直方圖尋找最優切分點,然後進行切分。
       不同於合併所有的局部直方圖獲得全局的直方圖,LightGBM通過Reduce Scatter方法來合併不同worker的無交叉的不同特徵的直方圖,這樣找到該直方圖的局部最優切分點,最後同步到全局最優切分點。

參考:
(1)LightGBM: A Highly Efficient Gradient Boosting Decision Tree 論文
(2)『 論文閱讀』LightGBM原理
(3)XGBoost、LightGBM的詳細對比介紹
(4)Lightgbm基本原理介紹
(5)LightGBM介紹及參數調優

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章