一、XGBoost參數解釋
XGBoost的參數一共分為三類:
- 通用參數:宏觀函數控制。
- Booster參數:控制每一步的booster(tree/regression)。booster參數一般可以調控模型的效果和計算代價。我們所說的調參,很這是大程度上都是在調整booster參數。
- 學習目標參數:控制訓練目標的表現。我們對於問題的划分主要體現在學習目標參數上。比如我們要做分類還是回歸,做二分類還是多分類,這都是目標參數所提供的。
Note: 我下面介紹的參數都是我覺得比較重要的, 完整參數請戳官方文檔
1.通用參數
booster
:我們有兩種參數選擇,gbtree
和gblinear
。gbtree是采用樹的結構來運行數據,而gblinear是基於線性模型。silent
:靜默模式,為1
時模型運行不輸出。nthread
: 使用線程數,一般我們設置成-1
,使用所有線程。如果有需要,我們設置成多少就是用多少線程。
2.Booster參數
-
n_estimator
: 也作num_boosting_rounds
這是生成的最大樹的數目,也是最大的迭代次數。
-
learning_rate
: 有時也叫作eta
,系統默認值為0.3
,。每一步迭代的步長,很重要。太大了運行准確率不高,太小了運行速度慢。我們一般使用比默認值小一點,
0.1
左右就很好。 -
gamma
:系統默認為0
,我們也常用0
。在節點分裂時,只有分裂后損失函數的值下降了,才會分裂這個節點。
gamma
指定了節點分裂所需的最小損失函數下降值。 這個參數的值越大,算法越保守。因為gamma
值越大的時候,損失函數下降更多才可以分裂節點。所以樹生成的時候更不容易分裂節點。范圍:[0,∞]
-
subsample
:系統默認為1
。這個參數控制對於每棵樹,隨機采樣的比例。減小這個參數的值,算法會更加保守,避免過擬合。但是,如果這個值設置得過小,它可能會導致欠擬合。 典型值:
0.5-1
,0.5
代表平均采樣,防止過擬合. 范圍:(0,1]
,注意不可取0 -
colsample_bytree
:系統默認值為1。我們一般設置成0.8左右。用來控制每棵隨機采樣的列數的占比(每一列是一個特征)。 典型值:
0.5-1
范圍:(0,1]
-
colsample_bylevel
:默認為1,我們也設置為1.這個就相比於前一個更加細致了,它指的是每棵樹每次節點分裂的時候列采樣的比例
-
max_depth
: 系統默認值為6
我們常用
3-10
之間的數字。這個值為樹的最大深度。這個值是用來控制過擬合的。max_depth
越大,模型學習的更加具體。設置為0
代表沒有限制,范圍:[0,∞]
-
max_delta_step
:默認0
,我們常用0
.這個參數限制了每棵樹權重改變的最大步長,如果這個參數的值為
0
,則意味着沒有約束。如果他被賦予了某一個正值,則是這個算法更加保守。通常,這個參數我們不需要設置,但是當個類別的樣本極不平衡的時候,這個參數對邏輯回歸優化器是很有幫助的。 -
lambda
:也稱reg_lambda
,默認值為0
。權重的L2正則化項。(和Ridge regression類似)。這個參數是用來控制XGBoost的正則化部分的。這個參數在減少過擬合上很有幫助。
-
alpha
:也稱reg_alpha
默認為0
,
權重的L1正則化項。(和Lasso regression類似)。 可以應用在很高維度的情況下,使得算法的速度更快。 -
scale_pos_weight
:默認為1
在各類別樣本十分不平衡時,把這個參數設定為一個正值,可以使算法更快收斂。通常可以將其設置為負樣本的數目與正樣本數目的比值。
3.學習目標參數
objective [缺省值=reg:linear]
-
reg:linear
– 線性回歸 -
reg:logistic
– 邏輯回歸 -
binary:logistic
– 二分類邏輯回歸,輸出為概率 -
binary:logitraw
– 二分類邏輯回歸,輸出的結果為wTx -
count:poisson
– 計數問題的poisson回歸,輸出結果為poisson分布。在poisson回歸中,max_delta_step的缺省值為0.7 (used to safeguard optimization) -
multi:softmax
– 設置 XGBoost 使用softmax目標函數做多分類,需要設置參數num_class(類別個數) -
multi:softprob
– 如同softmax,但是輸出結果為ndata*nclass的向量,其中的值是每個數據分為每個類的概率。
eval_metric [缺省值=通過目標函數選擇]
-
rmse
: 均方根誤差 -
mae
: 平均絕對值誤差 -
logloss
: negative log-likelihood -
error
: 二分類錯誤率。其值通過錯誤分類數目與全部分類數目比值得到。對於預測,預測值大於0.5被認為是正類,其它歸為負類。 error@t: 不同的划分閾值可以通過 ‘t’進行設置 -
merror
: 多分類錯誤率,計算公式為(wrong cases)/(all cases) -
mlogloss
: 多分類log損失 -
auc
: 曲線下的面積 -
ndcg
: Normalized Discounted Cumulative Gain -
map
: 平均正確率
一般來說,我們都會使用xgboost.train(params, dtrain)
函數來訓練我們的模型。這里的params
指的是booster
參數。
二、XGBoost調參
import xgboost as xgb import pandas as pd from sklearn.model_selection import train_test_split from sklearn.metrics import roc_auc_score train_data = pd.read_csv('train.csv') # 讀取數據 y = train_data.pop('30').values # 用pop方式將訓練數據中的標簽值y取出來,作為訓練目標,這里的‘30’是標簽的列名 col = train_data.columns x = train_data[col].values # 剩下的列作為訓練數據 train_x, valid_x, train_y, valid_y = train_test_split(x, y, test_size=0.333, random_state=0) # 分訓練集和驗證集 # 這里不需要Dmatrix parameters = { 'max_depth': [5, 10, 15, 20, 25], 'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15], 'n_estimators': [500, 1000, 2000, 3000, 5000], 'min_child_weight': [0, 2, 5, 10, 20], 'max_delta_step': [0, 0.2, 0.6, 1, 2], 'subsample': [0.6, 0.7, 0.8, 0.85, 0.95], 'colsample_bytree': [0.5, 0.6, 0.7, 0.8, 0.9], 'reg_alpha': [0, 0.25, 0.5, 0.75, 1], 'reg_lambda': [0.2, 0.4, 0.6, 0.8, 1], 'scale_pos_weight': [0.2, 0.4, 0.6, 0.8, 1] } xlf = xgb.XGBClassifier(max_depth=10, learning_rate=0.01, n_estimators=2000, silent=True, objective='binary:logistic', nthread=-1, gamma=0, min_child_weight=1, max_delta_step=0, subsample=0.85, colsample_bytree=0.7, colsample_bylevel=1, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=1440, missing=None) # 有了gridsearch我們便不需要fit函數 gsearch = GridSearchCV(xlf, param_grid=parameters, scoring='accuracy', cv=3) gsearch.fit(train_x, train_y) print("Best score: %0.3f" % gsearch.best_score_) print("Best parameters set:") best_parameters = gsearch.best_estimator_.get_params() for param_name in sorted(parameters.keys()): print("\t%s: %r" % (param_name, best_parameters[param_name]))
三、LightGBM參數解釋
我們都知道,XGBoost 一共有三類參數通用參數,學習目標參數,Booster參數,那么對於LightGBM,我們有核心參數,學習控制參數,IO參數,目標參數,度量參數,網絡參數,GPU參數,模型參數,這里我常修改的便是核心參數,學習控制參數,度量參數等。更詳細的請看LightGBM中文文檔
1.核心參數
-
boosting
:也稱boost
,boosting_type
.默認是gbdt
。LGB里面的boosting參數要比xgb多不少,我們有傳統的
gbdt
,也有rf
,dart
,doss
,最后兩種不太深入理解,但是試過,還是gbdt的效果比較經典穩定gbdt
, 傳統的梯度提升決策樹rf
, Random Forest (隨機森林)dart
, Dropouts meet Multiple Additive Regression Treesgoss
, Gradient-based One-Side Sampling (基於梯度的單側采樣)
-
num_thread
:也稱作num_thread
,nthread
.指定線程的個數。這里官方文檔提到,數字設置成cpu內核數比線程數訓練效更快(考慮到現在cpu大多超線程)。並行學習不應該設置成全部線程,這反而使得訓練速度不佳。
-
application
:默認為regression
。,也稱objective
,app
這里指的是任務目標- regression
regression_l2
, L2 loss, alias=regression, mean_squared_error, mseregression_l1
, L1 loss, alias=mean_absolute_error, maehuber
, Huber lossfair
, Fair losspoisson
, Poisson regressionquantile
, Quantile regressionquantile_l2
, 類似於 quantile, 但是使用了 L2 loss
- binary, binary log loss classification application
- multi-class classification
multiclass
, softmax 目標函數, 應該設置好num_class
multiclassova
, One-vs-All 二分類目標函數, 應該設置好num_class
- cross-entropy application
xentropy
, 目標函數為 cross-entropy (同時有可選擇的線性權重), alias=cross_entropyxentlambda
, 替代參數化的 cross-entropy, alias=cross_entropy_lambda- 標簽是 [0, 1] 間隔內的任意值
- lambdarank, lambdarank application
- 在 lambdarank 任務中標簽應該為 int type, 數值越大代表相關性越高 (e.g. 0:bad, 1:fair, 2:good, 3:perfect)
label_gain
可以被用來設置 int 標簽的增益 (權重)
- regression
-
valid
:驗證集選用,也稱test
,valid_data
,test_data
.支持多驗證集,以,
分割 -
learning_rate
:也稱shrinkage_rate
,梯度下降的步長。默認設置成0.1,我們一般設置成0.05-0.2
之間 -
num_leaves
:也稱num_leaf
,新版lgb將這個默認值改成31,這代表的是一棵樹上的葉子數 -
num_iterations
:也稱num_iteration
,num_tree
,num_trees,
num_round
,num_rounds
,num_boost_round
。迭代次數 -
device
:default=cpu, options=cpu, gpu- 為樹學習選擇設備, 你可以使用 GPU 來獲得更快的學習速度
- Note: 建議使用較小的 max_bin (e.g. 63) 來獲得更快的速度
- Note: 為了加快學習速度, GPU 默認使用32位浮點數來求和. 你可以設置 gpu_use_dp=true 來啟用64位浮點數, 但是它會使訓練速度降低
- Note: 請參考 安裝指南 來構建 GPU 版本
2.學習控制參數
max_depth
- default=
-1
, type=int限制樹模型的最大深度. 這可以在#data
小的情況下防止過擬合. 樹仍然可以通過 leaf-wise 生長. < 0
意味着沒有限制.
-
feature_fraction
:default=1.0, type=double, 0.0 < feature_fraction < 1.0, 也稱sub_feature
,colsample_bytree
- 如果 feature_fraction 小於 1.0, LightGBM 將會在每次迭代中隨機選擇部分特征. 例如, 如果設置為 0.8, 將會在每棵樹訓練之前選擇 80% 的特征
- 可以用來加速訓練
- 可以用來處理過擬合
-
bagging_fraction
:default=1.0, type=double, 0.0 < bagging_fraction < 1.0, 也稱sub_row
,subsample
- 類似於 feature_fraction, 但是它將在不進行重采樣的情況下隨機選擇部分數據
- 可以用來加速訓練
- 可以用來處理過擬合
- Note: 為了啟用 bagging, bagging_freq 應該設置為非零值
-
bagging_freq
: default=0, type=int, 也稱subsample_freq
- bagging 的頻率, 0 意味着禁用 bagging. k 意味着每 k 次迭代執行bagging
- Note: 為了啟用 bagging, bagging_fraction 設置適當
-
lambda_l1
:默認為0,也稱reg_alpha,表示的是L1正則化,double類型 -
lambda_l2
:默認為0,也稱reg_lambda,表示的是L2正則化,double類型 -
cat_smooth
: default=10, type=double- 用於分類特征
- 這可以降低噪聲在分類特征中的影響, 尤其是對數據很少的類別
-
min_data_in_leaf
, 默認為20。 也稱min_data_per_leaf
,min_data
,min_child_samples
。
一個葉子上數據的最小數量。可以用來處理過擬合。 -
min_sum_hessian_in_leaf
, default=1e-3
, 也稱min_sum_hessian_per_leaf
,min_sum_hessian
,min_hessian
,min_child_weight
。- 一個葉子上的最小 hessian 和. 類似於
min_data_in_leaf
, 可以用來處理過擬合. - 子節點所需的樣本權重和(hessian)的最小閾值,若是基學習器切分后得到的葉節點中樣本權重和低於該閾值則不會進一步切分,在線性模型中該值就對應每個節點的最小樣本數,該值越大模型的學習約保守,同樣用於防止模型過擬合
- 一個葉子上的最小 hessian 和. 類似於
-
early_stopping_round
, 默認為0, type=int, 也稱early_stopping_rounds
,early_stopping
。
如果一個驗證集的度量在early_stopping_round
循環中沒有提升, 將停止訓練、 -
min_split_gain
, 默認為0, type=double, 也稱
min_gain_to_split`。執行切分的最小增益。 -
max_bin
:最大直方圖數目,默認為255,工具箱的最大數特征值決定了容量 工具箱的最小數特征值可能會降低訓練的准確性, 但是可能會增加一些一般的影響(處理過擬合,越大越容易過擬合)。- 針對直方圖算法tree_method=hist時,用來控制將連續值特征離散化為多個直方圖的直方圖數目。
- LightGBM 將根據
max_bin
自動壓縮內存。 例如, 如果 maxbin=255, 那么 LightGBM 將使用 uint8t 的特性值。
12.subsample_for_bin
bin_construct_sample_cnt
, 默認為200000, 也稱subsample_for_bin
。用來構建直方圖的數據的數量。
3.度量函數
-
metric
: default={l2 for regression}, {binary_logloss for binary classification}, {ndcg for lambdarank}, type=multi-enum, options=l1, l2, ndcg, auc, binary_logloss, binary_error …-
l1
, absolute loss, alias=mean_absolute_error, mae -
l2
, square loss, alias=mean_squared_error, mse -
l2_root
, root square loss, alias=root_mean_squared_error, rmse -
quantile
, Quantile regression -
huber
, Huber loss -
fair
, Fair loss -
poisson
, Poisson regression -
ndcg
, NDCG -
map
, MAP -
auc
, AUC -
binary_logloss
, log loss -
binary_error
, 樣本: 0 的正確分類, 1 錯誤分類 -
multi_logloss
, mulit-class 損失日志分類 -
multi_error
, error rate for mulit-class 出錯率分類 -
xentropy
, cross-entropy (與可選的線性權重), alias=cross_entropy -
xentlambda
, “intensity-weighted” 交叉熵, alias=cross_entropy_lambda -
kldiv
, Kullback-Leibler divergence, alias=kullback_leibler - 支持多指標, 使用 , 分隔
-
總的來說,我還是覺得LightGBM比XGBoost用法上差距不大。參數也有很多重疊的地方。很多XGBoost的核心原理放在LightGBM上同樣適用。 同樣的,Lgb也是有train()函數和LGBClassifier()與LGBRegressor()函數。后兩個主要是為了更加貼合sklearn的用法,這一點和XGBoost一樣。
四、LightGBM調參
mport pandas as pd import lightgbm as lgb from sklearn.grid_search import GridSearchCV # Perforing grid search from sklearn.model_selection import train_test_split train_data = pd.read_csv('train.csv') # 讀取數據 y = train_data.pop('30').values # 用pop方式將訓練數據中的標簽值y取出來,作為訓練目標,這里的‘30’是標簽的列名 col = train_data.columns x = train_data[col].values # 剩下的列作為訓練數據 train_x, valid_x, train_y, valid_y = train_test_split(x, y, test_size=0.333, random_state=0) # 分訓練集和驗證集 train = lgb.Dataset(train_x, train_y) valid = lgb.Dataset(valid_x, valid_y, reference=train) parameters = { 'max_depth': [15, 20, 25, 30, 35], 'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15], 'feature_fraction': [0.6, 0.7, 0.8, 0.9, 0.95], 'bagging_fraction': [0.6, 0.7, 0.8, 0.9, 0.95], 'bagging_freq': [2, 4, 5, 6, 8], 'lambda_l1': [0, 0.1, 0.4, 0.5, 0.6], 'lambda_l2': [0, 10, 15, 35, 40], 'cat_smooth': [1, 10, 15, 20, 35] } gbm = lgb.LGBMClassifier(boosting_type='gbdt', objective = 'binary', metric = 'auc', verbose = 0, learning_rate = 0.01, num_leaves = 35, feature_fraction=0.8, bagging_fraction= 0.9, bagging_freq= 8, lambda_l1= 0.6, lambda_l2= 0) # 有了gridsearch我們便不需要fit函數 gsearch = GridSearchCV(gbm, param_grid=parameters, scoring='accuracy', cv=3) gsearch.fit(train_x, train_y) print("Best score: %0.3f" % gsearch.best_score_) print("Best parameters set:") best_parameters = gsearch.best_estimator_.get_params() for param_name in sorted(parameters.keys()): print("\t%s: %r" % (param_name, best_parameters[param_name]))
五、調參核心
- 調參1:提高准確率":num_leaves, max_depth, learning_rate
- 調參2:降低過擬合 max_bin min_data_in_leaf
- 調參3:降低過擬合 正則化L1, L2
- 調參4:降低過擬合 數據抽樣 列抽樣
調參方向:處理過擬合(過擬合和准確率往往相反)
- 使用較小的
max_bin
- 使用較小的
num_leaves
- 使用
min_data_in_leaf
和min_sum_hessian_in_leaf
- 通過設置
bagging_fraction
和bagging_freq
來使用 bagging - 通過設置
feature_fraction
<1來使用特征抽樣 - 使用更大的訓練數據
- 使用
lambda_l1
,lambda_l2
和min_gain_to_split
來使用正則 - 嘗試
max_depth
來避免生成過深的樹
調參范圍
XGBoost | LightGBM | 范圍 | |
---|---|---|---|
葉子數 | num_leaves,默認為 | num_leaves | range(35,65,5) |
樹深 | max_depth,默認為6 | max_depth | range(3,10,2) |
樣本抽樣 | subsample | bagging_fraction,subsample | [i/10.0 for i in range(6,10)] |
特征抽樣 | colsample_bytree | feature_fraction,colsample_bytree | [i/10.0 for i in range(6,10)] |
L1正則化 | alpha,reg_alpha | lambda_l2,reg_alpha | [1e-5, 1e-2, 0.1, 1, 2,2.5,3] |
L2正則化 | lambda,reg_lambda | lambda_l1,reg_lambda | [1e-5, 1e-2, 0.1, 1, 2,2.5,3] |
六、參考文章
1、當GridSearch遇上XGBoost 一段代碼解決調參問題
2、LightGBM核心解析與調參
3、 LightGBM 中文文檔
4、 LightGBM英文文檔
5、【集成學習】lightgbm調參案例
作者:只為此心無垠
鏈接:https://www.jianshu.com/p/1100e333fcab
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。