1. 程式人生 > >Xgboost和lightgbm的區別

Xgboost和lightgbm的區別

這是資料應用學院8/4 Live:資料科學家常用工具XGBoost與LightGBM大比拼,效能與結構的筆記。

Xgboost, lightgbm, catboost實際上是對GBDT方法的不同實現,它們針對同一目標、做了不同的優化處理。

XGboost作為最早出現的庫,優化做得稍微少一些,但總體而言,它們都對基礎的GBDT方法做了不同的優化。

首先,它們在基礎邏輯上並沒有什麼不同,我們限定max_trees或者max_iterations,之後演算法從0棵樹開始跑,每一輪根據上一輪的殘差增加一棵決策樹。在每一次增加決策樹的時候,選擇當前的最優結構。而在生成當前決策樹的過程中,各個演算法採用了不同的優化方案。

在生成每一棵決策樹時,我們從一棵空決策樹開始,不斷地進行節點劃分。其劃分依據如下:

對於binary features,處理是很簡單的。但:

對於categorical features,xgboost需要自己採用one-hot等方法進行處理,而lightgbm和catboost有自己的處理方法。lightgbm使用的處理方法並不是one-hot,而是另一種optimal的劃分方法。

對於連續變數,選擇分界點較為困難。一個較為簡單的方法是brute force,把資料集中連續變數每一個可能的取值都嘗試一次,然後對於每一個分界點,遍歷所有example,確定這些example在分界點的左邊還是右邊。當然也可以先對example進行排序再劃分,這一優化稱為presorted。但在大的資料集中,這個方法顯然是很慢的。為了進一步加速,XGboost允許使用histogram方法,將連續變數劃分為不同的bins,在這些bins的中心線做劃分。不過histogram理論上會導致一定的效能損失。

而lightgbm除了hist之外還提供另一項優化,這項優化被稱為GOSS。lightgbm保留高梯度的samples,而從導致較小的地圖變化的samples進行一個隨機取樣。什麼是資料的梯度?

lightGBM的樹生長的過程也和xgboost不一樣。xgboost的生長是level-wise的,即一層一層生長的,而lightgbm是leaf-wise即梯度優先的。如下圖所示,即使左子樹已經比右子樹深很多,但只要左子樹的梯度劃分仍然比右子樹佔優,就繼續在左子樹進行劃分。