作者 | 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)