【机器学习基础】XGBoost、LightGBM与CatBoost算法对比与调参
機(jī)器學(xué)習(xí)
Author:louwill
Machine Learning Lab
? ? ?
雖然現(xiàn)在深度學(xué)習(xí)大行其道,但以XGBoost、LightGBM和CatBoost為代表的Boosting算法仍有其廣闊的用武之地。拋開(kāi)深度學(xué)習(xí)適用的圖像、文本、語(yǔ)音和視頻等非結(jié)構(gòu)化的數(shù)據(jù)應(yīng)用,Boosting算法對(duì)于訓(xùn)練樣本較少的結(jié)構(gòu)化數(shù)據(jù)領(lǐng)域仍然是第一選擇。本文先對(duì)前述章節(jié)的三大Boosting的聯(lián)系與區(qū)別進(jìn)行簡(jiǎn)單闡述,并一個(gè)實(shí)際數(shù)據(jù)案例來(lái)對(duì)三大算法進(jìn)行對(duì)比。然后對(duì)常用的Boosting算法超參數(shù)調(diào)優(yōu)方法進(jìn)行介紹,包括隨機(jī)調(diào)參法、網(wǎng)格搜索法和貝葉斯調(diào)參法,并給出相應(yīng)的代碼示例。
三大Boosting算法對(duì)比
首先,XGBoost、LightGBM和CatBoost都是目前經(jīng)典的SOTA(state of the art)Boosting算法,都可以歸類到梯度提升決策樹(shù)算法系列。三個(gè)模型都是以決策樹(shù)為支撐的集成學(xué)習(xí)框架,其中XGBoost是對(duì)原始版本的GBDT算法的改進(jìn),而LightGBM和CatBoost則是在XGBoost基礎(chǔ)上做了進(jìn)一步的優(yōu)化,在精度和速度上都有各自的優(yōu)點(diǎn)。
三大模型的原理細(xì)節(jié)我們本文不做敘述,可參考【原創(chuàng)首發(fā)】機(jī)器學(xué)習(xí)公式推導(dǎo)與代碼實(shí)現(xiàn)30講.pdf。那么這三大Boosting算法又有哪些大的方面的區(qū)別呢?主要有兩個(gè)方面。第一個(gè)是三個(gè)模型樹(shù)的構(gòu)造方式有所不同,XGBoost使用按層生長(zhǎng)(level-wise)的決策樹(shù)構(gòu)建策略,LightGBM則是使用按葉子生長(zhǎng)(leaf-wise)的構(gòu)建策略,而CatBoost使用了對(duì)稱樹(shù)結(jié)構(gòu),其決策樹(shù)都是完全二叉樹(shù)。第二個(gè)有較大區(qū)別的方面是對(duì)于類別特征的處理。XGBoost本身不具備自動(dòng)處理類別特征的能力,對(duì)于數(shù)據(jù)中的類別特征,需要我們手動(dòng)處理變換成數(shù)值后才能輸入到模型中;LightGBM中則需要指定類別特征名稱,算法即可對(duì)其自動(dòng)進(jìn)行處理;CatBoost以處理類別特征而聞名,通過(guò)目標(biāo)變量統(tǒng)計(jì)等特征編碼方式也能實(shí)現(xiàn)類別特征的高效處理。
下面我們以kaggle 2015年航班延誤數(shù)據(jù)集為示例,分別用XGBoost、LightGBM和CatBoost模型進(jìn)行實(shí)驗(yàn)。圖1是flights數(shù)據(jù)集簡(jiǎn)介。
圖2?flights數(shù)據(jù)集
該數(shù)據(jù)集完整數(shù)據(jù)量有500多萬(wàn)條航班記錄數(shù)據(jù),特征有31個(gè),僅作演示用的情況下,我們采用抽樣的方式從原始數(shù)據(jù)集中抽樣1%的數(shù)據(jù),并篩選11個(gè)特征,經(jīng)過(guò)預(yù)處理后重新構(gòu)建訓(xùn)練數(shù)據(jù)集,目標(biāo)是構(gòu)建對(duì)航班是否延誤的二分類模型。數(shù)據(jù)讀取和簡(jiǎn)單預(yù)處理過(guò)程如代碼1所示。
代碼1 數(shù)據(jù)處理
# 導(dǎo)入pandas和sklearn數(shù)據(jù)劃分模塊 import pandas as pd from sklearn.model_selection import train_test_split # 讀取flights數(shù)據(jù)集 flights = pd.read_csv('flights.csv') # 數(shù)據(jù)集抽樣1% flights = flights.sample(frac=0.01, random_state=10) # 特征抽樣,獲取指定的11個(gè)特征 flights = flights[["MONTH", "DAY", "DAY_OF_WEEK", "AIRLINE", "FLIGHT_NUMBER","DESTINATION_AIRPORT", "ORIGIN_AIRPORT","AIR_TIME", "DEPARTURE_TIME", "DISTANCE", "ARRIVAL_DELAY"]] # 對(duì)標(biāo)簽進(jìn)行離散化,延誤10分鐘以上才算延誤 flights["ARRIVAL_DELAY"] = (flights["ARRIVAL_DELAY"]>10)*1 #?類別特征 cat_cols?=?["AIRLINE",?"FLIGHT_NUMBER",?"DESTINATION_AIRPORT", "ORIGIN_AIRPORT"] #?類別特征編碼 for?item?in?cat_cols:flights[item]?=?flights[item].astype("category").cat.codes?+1# 數(shù)據(jù)集劃分 X_train,?X_test,?y_train,?y_test?=?train_test_split(flights.drop(["ARRIVAL_DELAY"],?axis=1),flights["ARRIVAL_DELAY"], random_state=10, test_size=0.3) # 打印劃分后的數(shù)據(jù)集大小 print(X_train.shape,?y_train.shape,?X_test.shape,?y_test.shape)輸出:
(39956, 10) (39956,) (17125, 10) (17125,)在代碼1中,我們先讀取了flights原始數(shù)據(jù)集,因?yàn)樵紨?shù)據(jù)集量太大,我們對(duì)其進(jìn)行抽樣1%,并篩選了11個(gè)特征,構(gòu)建有57081條1、11個(gè)特征的航班記錄數(shù)據(jù)集。然后對(duì)抽樣數(shù)據(jù)集進(jìn)行簡(jiǎn)單的預(yù)處理,先對(duì)訓(xùn)練標(biāo)簽進(jìn)行二值離散化,延誤大于10分鐘的轉(zhuǎn)化為1(延誤),延誤小于10分鐘的轉(zhuǎn)化為0(不延誤),然后對(duì)“航線”、“航班號(hào)”、“目的地機(jī)場(chǎng)”、“出發(fā)地機(jī)場(chǎng)”等類別特征進(jìn)行類別編碼處理。最后劃分?jǐn)?shù)據(jù)集,得到有39956條訓(xùn)練樣本,17125條測(cè)試樣本。
XGBoost
下面我們開(kāi)始來(lái)測(cè)試三個(gè)模型在該數(shù)據(jù)集上的效果。先來(lái)看XGBoost,如代碼2所示。
代碼2?XGBoost
# 導(dǎo)入xgboost模塊 import xgboost as xgb # 導(dǎo)入模型評(píng)估auc函數(shù) from sklearn.metrics import roc_auc_score # 設(shè)置模型超參數(shù) params = {'booster': 'gbtree','objective': 'binary:logistic', 'gamma': 0.1,'max_depth': 8,'lambda': 2,'subsample': 0.7,'colsample_bytree': 0.7,'min_child_weight': 3,'eta': 0.001,'seed': 1000,'nthread': 4, } # 封裝xgboost數(shù)據(jù)集 dtrain = xgb.DMatrix(X_train, y_train) # 訓(xùn)練輪數(shù),即樹(shù)的棵數(shù) num_rounds = 500 # 模型訓(xùn)練 model_xgb = xgb.train(params, dtrain, num_rounds) # 對(duì)測(cè)試集進(jìn)行預(yù)測(cè) dtest = xgb.DMatrix(X_test) y_pred = model_xgb.predict(dtest) print('AUC?of?testset?based?on?XGBoost:?',?roc_auc_score(y_test,?y_pred))輸出:
在代碼15-2中,我們測(cè)試了XGBoost在flights數(shù)據(jù)集上的表現(xiàn),導(dǎo)入相關(guān)模塊并設(shè)置模型超參數(shù),便可基于訓(xùn)練集進(jìn)行XGBoost模型擬合,最后將訓(xùn)練好的模型用于測(cè)試集預(yù)測(cè),可得到測(cè)試集AUC為0.6845。
LightGBM
LightGBM在flights數(shù)據(jù)集上的測(cè)試過(guò)程如代碼3所示。
代碼3?LightGBM
# 導(dǎo)入lightgbm模塊 import lightgbm as lgb dtrain = lgb.Dataset(X_train, label=y_train) params = { "max_depth": 5, "learning_rate" : 0.05, "num_leaves": 500, "n_estimators": 300 }# 指定類別特征 cate_features_name = ["MONTH","DAY","DAY_OF_WEEK","AIRLINE", "DESTINATION_AIRPORT", "ORIGIN_AIRPORT"]# lightgbm模型擬合 model_lgb = lgb.train(params, d_train, categorical_feature = cate_features_name)# 對(duì)測(cè)試集進(jìn)行預(yù)測(cè) y_pred = model_lgb.predict(X_test) print('AUC?of?testset?based?on?XGBoost:?'roc_auc_score(y_test,?y_pred))輸出:
在代碼3中,我們測(cè)試了LightGBM在flights數(shù)據(jù)集上的表現(xiàn),導(dǎo)入相關(guān)模塊并設(shè)置模型超參數(shù),便可基于訓(xùn)練集進(jìn)行LightGBM模型擬合,最后將訓(xùn)練好的模型用于測(cè)試集預(yù)測(cè),可得到測(cè)試集AUC為0.6873,跟XGBoost效果差不多。
CatBoost
CatBoost在flights數(shù)據(jù)集上的測(cè)試過(guò)程如代碼4所示。
代碼4?CatBoost
# 導(dǎo)入lightgbm模塊 import catboost as cb # 類別特征索引 cat_features_index = [0,1,2,3,4,5,6] # 創(chuàng)建catboost模型實(shí)例 model_cb?=?cb.CatBoostClassifier(eval_metric="AUC",one_hot_max_size=50,?depth=6,?iterations=300,?l2_leaf_reg=1,learning_rate=0.1) # catboost模型擬合 model_cb.fit(X_train, y_train, cat_features=cat_features_index) # 對(duì)測(cè)試集進(jìn)行預(yù)測(cè) y_pred = model_cb.predict(X_test) print('AUC?of?testset?based?on?CatBoost:?'roc_auc_score(y_test,?y_pred))輸出:
AUC of testset based on CatBoost: 0.5463773041667715在代碼4中,我們測(cè)試了CatBoost在flights數(shù)據(jù)集上的表現(xiàn),導(dǎo)入相關(guān)模塊并設(shè)置模型超參數(shù),便可基于訓(xùn)練集進(jìn)行CatBoost模型擬合,最后將訓(xùn)練好的模型用于測(cè)試集預(yù)測(cè),可得到測(cè)試集AUC為0.54,相較于XGBoost和LightGBM,CatBoost在該數(shù)據(jù)集上的效果要差不少。表1是針對(duì)flights數(shù)據(jù)集三大模型的綜合對(duì)比結(jié)果。
從表1的綜合對(duì)比結(jié)果來(lái)看,LightGBM無(wú)論是在精度上還是速度上,都要優(yōu)于XGBoost和CatBoost。當(dāng)然了,我們只是在數(shù)據(jù)集上直接用三個(gè)模型做了比較,沒(méi)有做進(jìn)一步的數(shù)據(jù)特征工程和超參數(shù)調(diào)優(yōu),表1的結(jié)果均可做進(jìn)一步的優(yōu)化。
常用的超參數(shù)調(diào)優(yōu)方法
機(jī)器學(xué)習(xí)模型中有大量需要事先進(jìn)行人為設(shè)定的參數(shù),比如說(shuō)神經(jīng)網(wǎng)絡(luò)訓(xùn)練的batch-size,XGBoost等集成學(xué)習(xí)模型的樹(shù)相關(guān)參數(shù),我們將這類不是經(jīng)過(guò)模型訓(xùn)練得到的參數(shù)叫做超參數(shù)(hyperparameter)。人為的對(duì)超參數(shù)調(diào)整的過(guò)程也就是我們熟知的調(diào)參。機(jī)器學(xué)習(xí)中常用的調(diào)參方法包括網(wǎng)格搜索法(grid search)、隨機(jī)搜索法(random search)和貝葉斯優(yōu)化(bayesian optimization)。
網(wǎng)格搜索法
網(wǎng)格搜索是一項(xiàng)常用的超參數(shù)調(diào)優(yōu)方法,常用于優(yōu)化三個(gè)或者更少數(shù)量的超參數(shù),本質(zhì)是一種窮舉法。對(duì)于每個(gè)超參數(shù),使用者選擇一個(gè)較小的有限集去探索。然后,這些超參數(shù)笛卡爾乘積得到若干組超參數(shù)。網(wǎng)格搜索使用每組超參數(shù)訓(xùn)練模型,挑選驗(yàn)證集誤差最小的超參數(shù)作為最好的超參數(shù)。
例如,我們有三個(gè)需要優(yōu)化的超參數(shù)a,b,c,候選的取值分別是{1,2},{3,4},{5,6}。則所有可能的參數(shù)取值組合組成了一個(gè)8個(gè)點(diǎn)的3維空間網(wǎng)格如下:{(1,3,5),(1,3,6),(1,4,5),(1,4,6),(2,3,5),(2,3,6),(2,4,5),(2,4,6)},網(wǎng)格搜索就是通過(guò)遍歷這8個(gè)可能的參數(shù)取值組合,進(jìn)行訓(xùn)練和驗(yàn)證,最終得到最優(yōu)超參數(shù)。
Sklearn中通過(guò)model_selection模塊下的GridSearchCV來(lái)實(shí)現(xiàn)網(wǎng)格搜索調(diào)參,并且這個(gè)調(diào)參過(guò)程是加了交叉驗(yàn)證的。我們同樣以前述flights數(shù)據(jù)集為例,展示XGBoost的網(wǎng)格搜索代碼示例。
代碼5 網(wǎng)格搜索
### 基于XGBoost的GridSearch搜索范例 # 導(dǎo)入GridSearch模塊 from sklearn.model_selection import GridSearchCV # 創(chuàng)建xgb分類模型實(shí)例 model = xgb.XGBClassifier() # 待搜索的參數(shù)列表空間 param_lst = {"max_depth": [3,5,7],"min_child_weight" : [1,3,6],"n_estimators": [100,200,300],"learning_rate": [0.01, 0.05, 0.1]} # 創(chuàng)建網(wǎng)格搜索 grid_search = GridSearchCV(model, param_grid=param_lst, cv=3, verbose=10, n_jobs=-1) # 基于flights數(shù)據(jù)集執(zhí)行搜索 grid_search.fit(X_train, y_train) # 輸出搜索結(jié)果 print(grid_search.best_estimator_)輸出:
XGBClassifier(max_depth=5, min_child_weight=6, n_estimators=300)代碼5給出了基于XGBoost的網(wǎng)格搜索范例。我們先創(chuàng)建XGBoost分類模型實(shí)例,然后給出需要搜索的參數(shù)和對(duì)應(yīng)的參數(shù)范圍列表,并基于GridSearch創(chuàng)建網(wǎng)格搜索對(duì)象,最后擬合訓(xùn)練數(shù)據(jù),輸出網(wǎng)格搜索的參數(shù)結(jié)果??梢钥吹?#xff0c;當(dāng)樹(shù)最大深度為5、最小子樹(shù)權(quán)重取6以及樹(shù)的棵數(shù)為300時(shí),模型能達(dá)到相對(duì)最優(yōu)的效果。
隨機(jī)搜索
隨機(jī)搜索,顧名思義,即在指定的超參數(shù)范圍或者分布上隨機(jī)搜索和尋找最優(yōu)超參數(shù)。相較于網(wǎng)格搜索方法,給定超參數(shù)分布內(nèi)并不是所有的超參數(shù)都會(huì)進(jìn)行嘗試,而是會(huì)從給定分布中抽樣一個(gè)固定數(shù)量的參數(shù),實(shí)際僅對(duì)這些抽樣到的超參數(shù)進(jìn)行實(shí)驗(yàn)。相較于網(wǎng)格搜索,隨機(jī)搜索有時(shí)候會(huì)是一種更高效的調(diào)參方法。Sklearn中通過(guò)model_selection模塊下RandomizedSearchCV方法進(jìn)行隨機(jī)搜索?;赬GBoost的隨機(jī)搜索調(diào)參示例如代碼6所示。
代碼6 隨機(jī)搜索
### 基于XGBoost的GridSearch搜索范例 # 導(dǎo)入GridSearch模塊 from sklearn.model_selection import GridSearchCV # 創(chuàng)建xgb分類模型實(shí)例 model = xgb.XGBClassifier() # 待搜索的參數(shù)列表空間 param_lst = {"max_depth": [3,5,7],"min_child_weight" : [1,3,6],"n_estimators": [100,200,300],"learning_rate": [0.01, 0.05, 0.1]} # 創(chuàng)建網(wǎng)格搜索 grid_search = GridSearchCV(model, param_grid=param_lst, cv=3, verbose=10, n_jobs=-1) # 基于flights數(shù)據(jù)集執(zhí)行搜索 grid_search.fit(X_train, y_train) # 輸出搜索結(jié)果 print(grid_search.best_estimator_)輸出:
代碼6給出了隨機(jī)搜索的使用示例,模式上跟網(wǎng)格搜索基本一致,可以看到,隨機(jī)搜索的結(jié)果認(rèn)為樹(shù)的棵樹(shù)取300,最小子樹(shù)權(quán)重為6,最大深度為5,學(xué)習(xí)率取0.1的時(shí)候模型達(dá)到最優(yōu)。
?
貝葉斯調(diào)參
除了上述兩種調(diào)參方法外,本小節(jié)介紹第三種,也有可能是最好的一種調(diào)參方法,即貝葉斯優(yōu)化。貝葉斯優(yōu)化是一種基于高斯過(guò)程(gaussian process)和貝葉斯定理的參數(shù)優(yōu)化方法,近年來(lái)被廣泛用于機(jī)器學(xué)習(xí)模型的超參數(shù)調(diào)優(yōu)。這里不詳細(xì)探討高斯過(guò)程和貝葉斯優(yōu)化的數(shù)學(xué)原理,僅展示貝葉斯優(yōu)化的基本用法和調(diào)參示例。
貝葉斯優(yōu)化其實(shí)跟其他優(yōu)化方法一樣,都是為了為了求目標(biāo)函數(shù)取最大值時(shí)的參數(shù)值。作為一個(gè)序列優(yōu)化問(wèn)題,貝葉斯優(yōu)化需要在每一次迭代時(shí)選取一個(gè)最佳觀測(cè)值,這是貝葉斯優(yōu)化的關(guān)鍵問(wèn)題。而這個(gè)關(guān)鍵問(wèn)題正好被上述的高斯過(guò)程完美解決。關(guān)于貝葉斯優(yōu)化的大量數(shù)學(xué)原理,包括高斯過(guò)程、采集函數(shù)、Upper Confidence Bound(UCB)和Expectation Improvements(EI)等概念原理,本節(jié)限于篇幅不做展開(kāi)描述。貝葉斯優(yōu)化可直接借用現(xiàn)成的第三方庫(kù)BayesianOptimization來(lái)實(shí)現(xiàn)。使用示例如代碼7所示。
代碼7 貝葉斯優(yōu)化
### 基于XGBoost的BayesianOptimization搜索范例 # 導(dǎo)入xgb模塊 import xgboost as xgb # 導(dǎo)入貝葉斯優(yōu)化模塊 from bayes_opt import BayesianOptimization # 定義目標(biāo)優(yōu)化函數(shù) def xgb_evaluate(min_child_weight,colsample_bytree,max_depth,subsample,gamma,alpha):# 指定要優(yōu)化的超參數(shù)params['min_child_weight'] = int(min_child_weight)params['cosample_bytree'] = max(min(colsample_bytree, 1), 0)params['max_depth'] = int(max_depth)params['subsample'] = max(min(subsample, 1), 0)params['gamma'] = max(gamma, 0)params['alpha'] = max(alpha, 0)# 定義xgb交叉驗(yàn)證結(jié)果cv_result?=?xgb.cv(params,?dtrain,?num_boost_round=num_rounds,?nfold=5,seed=random_state,callbacks=[xgb.callback.early_stop(50)])return cv_result['test-auc-mean'].values[-1]# 定義相關(guān)參數(shù) num_rounds = 3000 random_state = 2021 num_iter = 25 init_points = 5 params = {'eta': 0.1,'silent': 1,'eval_metric': 'auc','verbose_eval': True,'seed': random_state } # 創(chuàng)建貝葉斯優(yōu)化實(shí)例 # 并設(shè)定參數(shù)搜索范圍 xgbBO = BayesianOptimization(xgb_evaluate, {'min_child_weight': (1, 20),'colsample_bytree': (0.1, 1),'max_depth': (5, 15),'subsample': (0.5, 1),'gamma': (0, 10),'alpha': (0, 10),}) # 執(zhí)行調(diào)優(yōu)過(guò)程 xgbBO.maximize(init_points=init_points,?n_iter=num_iter)代碼7給出了基于XGBoost的貝葉斯優(yōu)化示例,在執(zhí)行貝葉斯優(yōu)化前,我們需要基于XGBoost的交叉驗(yàn)證xgb.cv定義一個(gè)待優(yōu)化的目標(biāo)函數(shù),獲取xgb.cv交叉驗(yàn)證結(jié)果,并以測(cè)試集AUC為優(yōu)化時(shí)的精度衡量指標(biāo)。最后將定義好的目標(biāo)優(yōu)化函數(shù)和超參數(shù)搜索范圍傳入貝葉斯優(yōu)化函數(shù)BayesianOptimization中,給定初始化點(diǎn)和迭代次數(shù),即可執(zhí)行貝葉斯優(yōu)化。
圖2?貝葉斯優(yōu)化結(jié)果
部分優(yōu)化過(guò)程如圖2所示,可以看到,貝葉斯優(yōu)化在第23次迭代時(shí)達(dá)到最優(yōu),當(dāng)alpha參數(shù)取4.099、列抽樣比例為0.1、gamma參數(shù)為0、樹(shù)最大深度為5、最小子樹(shù)權(quán)重取5.377以及子抽樣比例為1.0時(shí),測(cè)試集AUC達(dá)到最優(yōu)的0.72。
總結(jié)
本章是在前述幾章集成學(xué)習(xí)內(nèi)容基礎(chǔ)上的一個(gè)簡(jiǎn)單綜合對(duì)比,并給出了集成學(xué)習(xí)常用的超參數(shù)調(diào)優(yōu)方法和示例。我們針對(duì)常用的三大Boosting集成學(xué)習(xí)模型:XGBoost、LightGBM和CatBoost,以具體的數(shù)據(jù)實(shí)例做了一個(gè)精度和速度上的性能對(duì)比,但限于具體的數(shù)據(jù)集和調(diào)優(yōu)差異,對(duì)比結(jié)果僅作為演示說(shuō)明使用,并不能真正代表LightGBM模型一定就要優(yōu)于CatBoost模型。
三大常用的超參數(shù)調(diào)優(yōu)方法:網(wǎng)格搜索法、隨機(jī)搜索法和貝葉斯優(yōu)化法。本章也基于同樣的數(shù)據(jù)集給出了三大超參數(shù)調(diào)優(yōu)方法的使用示例,但限于篇幅,并沒(méi)有太多深入每個(gè)方法的數(shù)學(xué)原理闡述。
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯溫州大學(xué)《機(jī)器學(xué)習(xí)課程》視頻 本站qq群851320808,加入微信群請(qǐng)掃碼:總結(jié)
以上是生活随笔為你收集整理的【机器学习基础】XGBoost、LightGBM与CatBoost算法对比与调参的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: win7系统怎么更改语言及字体
- 下一篇: 【Python】扫盲帖:关于在Windo