大戰三回合:XGBoost、LightGBM和Catboost一決高低

2020-12-17 AI科技大本營

作者 | LAVANYA

譯者 | 陸離

責編 | Jane

【導讀】XGBoost、LightGBM 和 Catboost 是三個基於 GBDT(Gradient Boosting Decision Tree)代表性的算法實現,今天,我們將在三輪 Battle 中,根據訓練和預測的時間、預測得分和可解釋性等評測指標,讓三個算法一決高下!

一言不合就 Battle

GBDT 是機器學習中的一個非常流行並且有效的算法模型,2014 年陳天奇博士提出的 XGBoost 算法就是 GBDT 一個重要實現。但在大訓練樣本和高維度特徵的數據環境下,GBDT 算法的性能以及準確性卻面臨了極大的挑戰,隨後,2017 年 LightGBM 應勢而生,由微軟開源的一個機器學習框架;同年,俄羅斯的搜索巨頭 Yandex 開源 Catboost 框架。

XGBoost(eXtreme Gradient Boosting) 特點是計算速度快,模型表現好,可以用於分類和回歸問題中,號稱「比賽奪冠的必備殺器」。LightGBM(Light Gradient Boosting Machine)的訓練速度和效率更快、使用的內存更低、準確率更高、並且支持並行化學習與處理大規模數據。Catboost( Categorical Features+Gradient Boosting)採用的策略在降低過擬合的同時保證所有數據集都可用於學習。性能卓越、魯棒性與通用性更好、易於使用而且更實用。據其介紹 Catboost 的性能可以匹敵任何先進的機器學習算法。

三個都是基於 GBDT 最具代表性的算法,都說自己的性能表現、效率及準確率很優秀,究竟它們誰更勝一籌呢?為了 PK 這三種算法之間的高低,我們給它們安排了一場「最浪漫的 Battle」,通過三輪 Battle 讓 XGBoost、Catboost 和 LightGBM 一絕高下!

Round 1:分類模型,按照數據集Fashion MNIST把圖像分類(60000行數據,784個特徵);Round 2:回歸模型,預測紐約計程車的票價(60000行數據,7個特徵);Round 3:通過海量數據集,預測紐約計程車票價(200萬行數據,7個特徵);

Battle 規則

在每一輪 PK 中,我們都遵循以下步驟:

1、訓練 XGBoost、Catboost、LightGBM 三種算法的基準模型,每個模型使用相同的參數進行訓練;

2、使用超參數自動搜索模塊 GridSearchCV 來訓練 XGBoost、Catboost 和 LightGBM 三種算法的微調整模型;

3、衡量指標:

a.訓練和預測的時間;

b.預測得分;

c.可解釋性(包括:特徵重要性,SHAP 值,可視化樹);

PK 結果揭曉

(一)運行時間& 準確度得分

Top 1:LightGBM

Top 2:CatBoost

Top 3:XGBoost

在訓練和預測時間兩方面,LightGBM 都是明顯的獲勝者,CatBoost 則緊隨其後,而 XGBoost 的訓練時間相對更久,但預測時間與其它兩個算法的差距沒有訓練時間那麼大。

在增強樹(boosted trees)中進行訓練的時間複雜度介於(log)和(2)之間,而對於預測,時間複雜度為(log2 ),其中 = 訓練實例的數量, = 特徵數量,以及 = 決策樹的深度。

Round 1 ~ 3

(二)可解釋性

一個模型的預測得分僅反映了它的一方面,我們還想知道模型為什麼要做出這個預測的。

在這裡,我們描繪出了模型特徵的重要性和 SHAP 值,還有一個實際的決策樹,以便更準確地理解模型的預測。

(a)特徵的重要性

這三個增強模型都提供了一個 .feature_importances_ attribute 屬性,允許我們查看有哪些特徵對模型預測的影響是最大的:

Round 1 ~ 3

(b)SHAP值

另外一種方法是 SHAP 摘要圖,用來了解每個特性對模型輸出的影響分布。SHAP 值是在這些特徵之間的公平的信用分配,並且具有博弈論一致性的理論保證,這使得它們通常比整個數據集中的那些典型特徵的重要性更值得信賴。

Round 1 & 2

(c)繪製決策樹

最後,XGBoost 和 LightGBM 這兩個算法還允許我們繪製用於進行預測的實際決策樹,這對於更好地了解每個特徵對目標變量的預測能力非常的有用。而 CatBoost 沒有決策樹的繪製功能。

如果想看 CatBoost 的結果,這裡推薦給大家一個可視化工具: https://blog.csdn.net/l_xzmy/article/details/81532281

Round 1 & 2

評測總結

CatBoost

(1)CatBoost 提供了比 XGBoost 更高的準確性和和更短的訓練時間;

(2)支持即用的分類特徵,因此我們不需要對分類特徵進行預處理(例如,通過 LabelEncoding 或 OneHotEncoding)。事實上,CatBoost 的文檔明確地說明不要在預處理期間使用熱編碼,因為「這會影響訓練速度和最終的效果」;

(3)通過執行有序地增強操作,可以更好地處理過度擬合,尤其體現在小數據集上;

(4)支持即用的 GPU 訓練(只需設置參數task_type =「GPU」);

(5)可以處理缺失的值;

LightGBM

(1)LightGBM 也能提供比 XGBoost 更高的準確性和更短的訓練時間;

(2)支持並行的樹增強操作,即使在大型數據集上(相比於 XGBoost)也能提供更快的訓練速度;

(3)使用 histogram-esquealgorithm,將連續的特徵轉化為離散的特徵,從而實現了極快的訓練速度和較低的內存使用率;

(4)通過使用垂直拆分(leaf-wise split)而不是水平拆分(level-wise split)來獲得極高的準確性,這會導致非常快速的聚合現象,並在非常複雜的樹結構中能捕獲訓練數據的底層模式。可以通過使用 num_leaves 和 max_depth 這兩個超參數來控制過度擬合;

XGBoost

(1)支持並行的樹增強操作;

(2)使用規則化來遏制過度擬合;

(3)支持用戶自定義的評估指標;

(4)處理缺失的值;

(5)XGBoost 比傳統的梯度增強方法(如 AdaBoost)要快得多;

如果想深入研究這些算法,可以閱讀下面相關文章的連結:

LightGBM: 一種高效的梯度增強決策樹 https://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree.pdf CatBoost: 支持分類特徵的梯度增強http://learningsys.org/nips17/assets/papers/paper_11.pdf XGBoost: 一個可擴展的樹增強系統 https://arxiv.org/pdf/1603.02754.pdf

重要參數解讀

下面列出的是模型中一些重要的參數,以幫助大家更好學習與使用這些算法!

Catboostn_estimators:表示用於創建樹的最大數量;learning_rate:表示學習率,用於減少梯度的級別;eval_metric:表示用於過度擬合檢測和最佳模型選擇的度量標準;depth:表示樹的深度;subsample:表示數據行的採樣率,不能在貝葉斯增強類型設置中使用;l2_leaf_reg:表示成本函數的L2規則化項的係數;random_strength:表示在選擇樹結構時用於對拆分評分的隨機量,使用此參數可以避免模型過度擬合;min_data_in_leaf:表示在一個葉子中訓練樣本的最小數量。CatBoost不會在樣本總數小於指定值的葉子中搜索新的拆分;colsample_bylevel, colsample_bytree, colsample_bynode — 分別表示各個層、各棵樹、各個節點的列採樣率;task_type:表示選擇「GPU」或「CPU」。如果數據集足夠大(從數萬個對象開始),那麼在GPU上的訓練與在CPU上的訓練相比速度會有顯著的提升,數據集越大,加速就越明顯;boosting_type:表示在默認情況下,小數據集的增強類型值設置為「Ordered」。這可以防止過度擬合,但在計算方面的成本會很高。可以嘗試將此參數的值設置為「Plain」,來提高訓練速度;rsm:對於那些具有幾百個特性的數據集,rsm參數加快了訓練的速度,通常對訓練的質量不會有影響。另外,不建議為只有少量(10-20)特徵的數據集更改rsm參數的默認值;border_count:此參數定義了每個特徵的分割數。默認情況下,如果在CPU上執行訓練,它的值設置為254,如果在GPU上執行訓練,則設置為128;

LightGBMnum_leaves:表示一棵樹中最大的葉子數量。在LightGBM中,必須將num_leaves的值設置為小於2^(max_depth),以防止過度擬合。而更高的值會得到更高的準確度,但這也可能會造成過度擬合;max_depth:表示樹的最大深度,這個參數有助於防止過度擬合;min_data_in_leaf:表示每個葉子中的最小數據量。設置一個過小的值可能會導致過度擬合;eval_metric:表示用於過度擬合檢測和最佳模型選擇的度量標準;learning_rate:表示學習率,用於降低梯度的級別;n_estimators:表示可以創建樹的最大數量;colsample_bylevel, colsample_bytree, colsample_bynode — 分別表示各個層、各棵樹、各個節點的列採樣率;boosting_type— 該參數可選擇以下的值:『gbdt』,表示傳統的梯度增強決策樹;『dart』,缺失則符合多重累計回歸樹(Multiple Additive Regression Trees);『goss』,表示基於梯度的單側抽樣(Gradient-based One-Side Sampling);『rf』,表示隨機森林(Random Forest);feature_fraction:表示每次迭代所使用的特徵分數(即所佔百分比,用小數表示)。將此值設置得較低,來提高訓練速度;min_split_again:表示當在樹的葉節點上進行進一步的分區時,所需最小損失值的減少量;n_jobs:表示並行的線程數量,如果設為-1則可以使用所有的可用線程;bagging_fraction:表示每次迭代所使用的數據分數(即所佔百分比,用小數表示)。將此值設置得較低,以提高訓練速度;application:default(默認值)=regression, type(類型值)=enum, options(可選值)=regression : 表示執行回歸任務;binary : 表示二進位分類;multiclass:表示多個類的類別;lambdarank : 表示lambdarank 應用;max_bin:表示用於存放特徵值的最大容器(bin)數。有助於防止過度擬合; num_iterations:表示增強要執行的迭代的迭代;XGBoost 參數 https://xgboost.readthedocs.io/en/latest/parameter.html LightGBM 參數 https://lightgbm.readthedocs.io/en/latest/Python-API.htmlCatBoost 參數 https://catboost.ai/docs/concepts/python-reference_parameters-list.html#python-reference_parameters-list

上面三個文件可以查看這些模型所有超參數。

如果想詳細本文的代碼和原文,可訪問下面的地址:

https://www.kaggle.com/lavanyashukla01/battle-of-the-boosting-algos-lgb-xgb-catboost https://lavanya.ai/2019/06/27/battle-of-the-boosting-algorithms/

(*本文為 AI科技大本營編譯文章,轉載請聯繫 1092722531)

相關焦點

  • 機器學習實戰|GBDT Xgboost LightGBM對比
    XGBoost加入了更多的剪枝策略和正則項,控制過擬合風險。傳統的GBDT用的是CART,Xgboost能支持的分類器更多,也可以是線性的。GBDT只用了一階導,但是xgboost對損失函數做了二階的泰勒展開,並且還可以自定義損失函數。
  • 入門 | 從結構到性能,一文概述XGBoost、Light GBM和CatBoost的同與不同
    則通過預分類算法和直方圖算法來確定最優分割。data.drop(["ARRIVAL_DELAY"], axis=1), data["ARRIVAL_DELAY"],                                                random_state=10, test_size=0.25)XGBoostimport xgboost
  • 從結構到性能,一文概述XGBoost、Light GBM和CatBoost的同與不同
    TotalCount 是在所有樣本中(包含當前樣本),和當前樣本具有相同的分類特徵值的樣本數量。y_test = train_test_split(data.drop(["ARRIVAL_DELAY"], axis=1), data["ARRIVAL_DELAY"],random_state=10, test_size=0.25)XGBoostimport xgboost
  • 聊聊lightgbm
    算法偽代碼如下從第一層到最後一層,都需要計算每個特徵的直方圖和標籤的直方圖,進而選擇最優的直方圖分割。這種做法相對而言,計算複雜度低,所需存儲較少。容易看出,構建直方圖的複雜度跟樣本量和特徵個數的乘積同階,尋找最優分割的複雜度跟分箱數和特徵數的乘積同階。
  • 深入理解LightGBM
    我們還得先從xgboost說起談起Lightgbm, 我們已經知道了是xgboost的強化版本, 關於xgboost,從其工作原理到數學推導再到優化策略最後到實戰應用,【白話機器學習】算法理論+實戰之Xgboost算法都已經描述過了,這裡只進行簡單的回憶和梳理,在這次回憶中我們看看xgboost在某些策略上是不是依然存在一些問題?
  • 聊聊CatBoost
    在GBDT中,構建下一棵樹包含兩步,即選擇樹的結構以及樹結構固定之後設置葉子節點的值。在CatBoost中,對於每個樣本Sample,都單獨構建一個利用該樣本之前的樣本點的梯度估計得到的模型Model,針對這些模型Model,估計該樣本Sample的梯度,然後利用新模型Model_new重新對樣本Sample打分。算法偽代碼示例如下:
  • 【機器學習】XGBoost算法學習小結
    XGBoost概述    xgboost 是"極端梯度上升"(Extreme Gradient Boosting)的簡稱,是一種現在在數據科學競賽的獲勝方案很流行的算法,它的流行源於在著名的Kaggle數據科學競賽上被稱為"奧託分類"的挑戰。由於
  • 資料|陳天奇介紹Xgboost原理的PPT
    from=leiphonecolumn_res0929【 圖片來源:https://xgboost.apachecn.org/所有者:https://xgboost.apachecn.org/ 】內容簡介陳天奇介紹Xgboost原理的PPT,用於學習xgboost原理。XGBoost是一個優化的分布式梯度增強庫,旨在實現高效,靈活和便攜。
  • 從零解讀 Xgboost 算法 (原理+代碼)
    文中涉及到的公式和註解都可以左右滑動查看全部,涉及到的代碼去這裡下載:https://github.com/DA-southampton/NLP_ability全文目錄如下:0.提升樹1. xgboost原理解讀1.0 學習路徑:1.1
  • Python XGBoost算法代碼實現和篩選特徵應用
    XGBoost算法的步驟和GB基本相同,都是首先初始化為一個常數,gb是根據一階導數ri,xgboost是根據一階導數gi和二階導數hi,迭代生成基學習器,相加更新學習器。二、相比較GBDT優勢1.傳統GBDT以CART作為基分類器,xgboost還支持線性分類器,這個時候xgboost相當於帶L1和L2正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)。
  • 資源 | XGBoost 中文文檔開放:上去就是一把梭
    中文文檔地址:http://xgboost.apachecn.org/cn/latest/英文文檔地址:http://xgboost.apachecn.org/en/latest/中文文檔 GitHub 地址:https://github.com/apachecn/xgboost-doc-zh梯度提升樹已經在實踐中證明可以有效地用於分類和回歸任務的預測挖掘
  • CatBoost:專治類別型特徵的Boosting算法
    一、CatBoost 算法簡介二、目標變量統計三、預測偏移四、樹模型的建立五、Python實踐案例首先,導入 Catboost 庫、CatBoostClassifier 分類器,並讀取數據:import numpy as npimport pandas as pdfrom catboost import CatBoostClassifier## 讀取數據
  • 劍指LightGBM和XGboost!斯坦福發表NGBoost算法
    本文試圖了解這個新算法,並與其他流行的 boosting 算法 LightGBM 和 XGboost 進行比較,以了解它在實踐中是如何工作的。註:Stanford ML Group 發表的論文網址為:https://arxiv.org/abs/1910.03225,有興趣的同學可以下載學習~本文的主要內容包括以下三個部分:什麼是自然梯度增強?
  • 深入理解CatBoost
    例如顏色和種類組合起來,可以構成類似於blue dog這樣的特徵。當需要組合的categorical features變多時,CatBoost只考慮一部分combinations。在選擇第一個節點時,只考慮選擇一個特徵,例如A。在生成第二個節點時,考慮A和任意一個categorical feature的組合,選擇其中最好的。就這樣使用貪心算法生成combinations。
  • 我的XGBoost學習經歷及動手實踐
    引入基本工具庫:import numpy as npimport pandas as pdimport xgboost as xgbimport matplotlib.pyplot as pltplt.style.use("ggplot")%matplotlib inline2.
  • python金融風控評分卡模型和數據分析
    針對銀行,消費金融的現金貸等線上貸款場景,金融信貸領域建模型和數據分析很難?邏輯回歸評分卡/catboost/xgboost/lightgbm/等模型用python一次全部搞定!由易到難,帶你從菜鳥輕鬆晉級kaggle級建模高手。
  • 100天搞定機器學習|Day61 手算+可視化,終於徹底理解了 XGBoost
    我們已經學習了XGBoost淵源及優點、模型原理及優化推導、模型參數解析:100天搞定機器學習|Day60 遇事不決,XGBoost,文章有點太枯燥,大家可能對其中的公式推導和參數還不甚理解。 sklearn.model_selection import train_test_splitfrom sklearn import preprocessingfrom xgboost.sklearn import XGBClassifierfrom xgboost import plot_treeimport matplotlib.pyplot as plt
  • 技術詳解 | catboost完全指南(下)
    接上篇——技術詳解 | catboost完全指南(中),介紹了catboost的基學習器、模型、模型的學習、樹的生成、分裂查找算法,以及一些重要改進後,今天繼續往下。中瘋狂累計,從而使得整個gbdt過度擬合訓練集,通過行列採樣可以在一定程度上緩解這個問題,catboost不僅僅在xgboost引入行列採樣、引入樹的正則化這種從超參數層面控制過擬合程度的方面開發,更是在tree訓練的過程中採用ordered boosting的方式來緩解這種過擬合。
  • 第113天: Python XGBoost 算法項目實戰
    一個已訓練的xgboost模型能夠自動計算特徵重要性,這些重要性得分可以通過成員變量feature_importances_得到。梯度提升算法是如何計算特徵重要性的?使用梯度提升算法的好處是在提升樹被創建後,可以相對直接地得到每個屬性的重要性得分。