本文重點闡述了xgboost和lightgbm的主要參數和調參技巧,其理論部分可見集成學習,以下內容主要來自xgboost和LightGBM的官方文檔。
xgboost
Xgboost參數主要分為三大類:
General Parameters(通用參數):設置整體功能
Booster Parameters(提升參數):選擇你每一步的booster(樹or回歸)
Learning Task Parameters(學習任務參數):指導優化任務的執行
General Parameters(通用參數)
- booster [default=gbtree]
選擇每次迭代過程中需要運行的模型,一共有兩種選擇:gbtree和gblinear。gbtree使用基於樹的模型進行提升計算,gblinear使用線性模型進行提升計算。缺省值為gbtree - silent [default=0]
取0時表示打印出運行時信息,取1時表示以緘默方式運行,不打印運行時信息。缺省值為0 - nthread [default to maximum number of threads available if not set]
XGBoost運行時的線程數。缺省值是當前系統可以獲得的最大線程數
剩余兩個參數是Xgboost自動指定的,無需設置。
Booster Parameters(提升參數)
雖然有兩種類型的booster,但是我們這里只介紹tree。因為tree的性能比線性回歸好得多,因此我們很少用線性回歸。
- eta [default=0.3]
學習率,可以縮減每一步的權重值,使得模型更加健壯:
典型值一般設置為:0.01-0.2
取值范圍為:[0,1] - gamma [default=0]
這個指定了一個結點被分割時,所需要的最小損失函數減小的大小。這個值一般來說需要根據損失函數來調整。
range: [0,∞] - max_depth [default=6]
數的最大深度。缺省值為6
這個可以用來控制過擬合,典型值是3-10。
取值范圍為:[1,∞] - min_child_weight [default=1]
孩子節點中最小的樣本權重和。在現行回歸模型中,這個參數是指建立每個模型所需要的最小樣本數。該值越大算法越保守
取值范圍為: [0,∞] - subsample [default=1]
用於訓練模型的子樣本占整個樣本集合的比例。如果設置為0.5則意味着XGBoost將隨機的沖整個樣本集合中隨機的抽取出50%的子樣本建立樹模型,這能夠防止過擬合。
取值范圍為:(0,1] - colsample_bytree [default=1]
在建立樹時對特征采樣的比例。缺省值為1
取值范圍:(0,1] - lambda [default=1, alias: reg_lambda]
L2正則化。 - alpha [default=0, alias: reg_alpha]
L1正則化,主要用在數據維度很高的情況下,可以提高運行速度。 - scale_pos_weight, [default=1]
在類別高度不平衡的情況下,將參數設置大於0,可以加快收斂。
Learning Task Parameters(學習任務參數)
-
objective [ default=reg:linear ]
定義學習任務及相應的學習目標,可選的目標函數如下:
“reg:linear” –線性回歸。
“reg:logistic” –邏輯回歸。
“binary:logistic” –二分類的邏輯回歸問題,輸出為概率。
“binary:logitraw” –二分類的邏輯回歸問題,輸出的結果為wTx。
“count:poisson” –計數問題的poisson回歸,輸出結果為poisson分布。
“multi:softmax” –讓XGBoost采用softmax目標函數處理多分類問題,同時需要設置參數num_class(類別個數)
“multi:softprob” –和softmax一樣,但是輸出的是ndata * nclass的向量,可以將該向量reshape成ndata行nclass列的矩陣。每行數據表示樣本所屬於每個類別的概率。 -
eval_metric [ default according to objective ]
評估方法,主要用來驗證數據,根據一個學習目標會默認分配一個評估指標
“rmse”:均方根誤差(回歸任務)
“logloss”:
“error”
“mlogloss”
“merror”
“auc” -
seed [ default=0 ]
隨機數的種子。缺省值為0
調參方法
調參的通用方法:
選擇一個相對較高的學習率。通常來說學習率設置為0.1。但是對於不同的問題可以講學習率設置在0.05-0.3。通過交叉驗證來尋找符合學習率的最佳樹的個數。
當確定好學習率與最佳樹的個數時,調整樹的某些特定參數。比如:max_depth, min_child_weight, gamma, subsample, colsample_bytree
調整正則化參數 ,比如: lambda, alpha。這個主要是為了減少模型復雜度和提高運行速度的。適當地減少過擬合。
降低學習速率,選擇最優參數
import xgboost as xgb
params={
'booster':'gbtree',
'objective': 'multi:softmax', #多分類的問題
'num_class':10, # 類別數,與 multisoftmax 並用
'gamma':0.1, # 用於控制是否后剪枝的參數,越大越保守,一般0.1、0.2這樣子。
'max_depth':12, # 構建樹的深度,越大越容易過擬合
'lambda':2, # 控制模型復雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合。
'subsample':0.7, # 隨機采樣訓練樣本
'colsample_bytree':0.7, # 生成樹時進行的列采樣
'min_child_weight':3,
# 這個參數默認是 1,是每個葉子里面 h 的和至少是多少,對正負樣本不均衡時的 0-1 分類而言
#,假設 h 在 0.01 附近,min_child_weight 為 1 意味着葉子節點中最少需要包含 100 個樣本。
#這個參數非常影響結果,控制葉子節點中二階導的和的最小值,該參數值越小,越容易 overfitting。
'silent':0 ,#設置成1則沒有運行信息輸出,最好是設置為0.
'eta': 0.007, # 如同學習率
'seed':1000,
'nthread':7,# cpu 線程數
#'eval_metric': 'auc'
}
model = xgb.train(plst, xgb_train, num_rounds, watchlist,early_stopping_rounds=100)
model.save_model('./model/xgb.model') # 用於存儲訓練出的模型
print "best best_ntree_limit",model.best_ntree_limit
#Grid seach on subsample and max_features
param_test1 = {
'max_depth':list(range(3,10,2)),
'min_child_weight':list(range(1,6,2))
}
"""
參數說明;
n_estimators:基學習器的個數(第一步得到)
scoring:得分排名依據,因為是越高越好,這是mean_squared_error取負
"""
gsearch1 = GridSearchCV(estimator = XGBRegressor( learning_rate =0.1, n_estimators=33, max_depth=5,
min_child_weight=1, gamma=0, subsample=0.8, colsample_bytree=0.8,
objective= 'gpu:reg:linear', nthread=4, scale_pos_weight=1, seed=27),
param_grid = param_test1, scoring='neg_mean_squared_error',n_jobs=1,iid=False, cv=5)
gsearch1.fit(X,y)
print(gsearch1.cv_results_, gsearch1.best_params_, gsearch1.best_score_)
#進一步探索參數max_depth,min_child_weight(前面得到最好的是{‘max_depth’: 5, ‘min_child_weight’: 1})
#Grid seach on subsample and max_features
param_test2 = {
'max_depth':[4,5,6],
'min_child_weight':[0,1,2] #范圍: [0,∞]
}
gsearch2 = GridSearchCV(estimator = XGBRegressor( learning_rate=0.1, n_estimators=33, max_depth=5,
min_child_weight=2, gamma=0, subsample=0.8, colsample_bytree=0.8,
objective= 'gpu:reg:linear', nthread=4, scale_pos_weight=1,seed=27),
param_grid = param_test2, scoring='neg_mean_squared_error',n_jobs=1,iid=False, cv=5)
gsearch2.fit(X,y)
print(gsearch2.cv_results_, gsearch2.best_params_, gsearch2.best_score_)
#繼續搜索參數min_child_weight {‘max_depth’: 5, ‘min_child_weight’: 2}
#Grid seach on subsample and max_features
#-3775.018211540544
param_test2b = {
'min_child_weight':[2,4,6,8]
}
gsearch2b = GridSearchCV(estimator = XGBRegressor( learning_rate=0.1, n_estimators=33, max_depth=5,
min_child_weight=2, gamma=0, subsample=0.8, colsample_bytree=0.8,
objective= 'gpu:reg:linear', nthread=4, scale_pos_weight=1,seed=27),
param_grid = param_test2b, scoring='neg_mean_squared_error',n_jobs=1,iid=False, cv=5)
gsearch2b.fit(X,y)
print(gsearch2b.cv_results_, gsearch2b.best_params_, gsearch2b.best_score_)
#調整參數gamma,range: [0,∞],default=0
#Grid seach on subsample and max_features
#在樹的葉子節點上進行進一步划分所需的最小損失。越大,算法就越保守。
param_test3 = {
'gamma':[i/10.0 for i in range(0,5)]
}
gsearch3 = GridSearchCV(estimator = XGBRegressor( learning_rate =0.1, n_estimators=33, max_depth=5,
min_child_weight=2, gamma=0, subsample=0.8, colsample_bytree=0.8,
objective= 'gpu:reg:linear', nthread=4, scale_pos_weight=1,seed=27),
param_grid = param_test3, scoring='neg_mean_squared_error',n_jobs=1,iid=False, cv=5)
gsearch3.fit(X,y)
print(gsearch3.cv_results_, gsearch3.best_params_, gsearch3.best_score_)
#調整參數subsample,colsample_bytree
#Grid seach on subsample and max_features
param_test4 = {
'subsample':[i/10.0 for i in range(6,10)],
'colsample_bytree':[i/10.0 for i in range(6,10)]
}
gsearch4 = GridSearchCV(estimator = XGBRegressor( learning_rate =0.1, n_estimators=53, max_depth=5,
min_child_weight=2, gamma=0, subsample=0.8, colsample_bytree=0.8,
objective= 'gpu:reg:linear', nthread=4, scale_pos_weight=1,seed=27),
param_grid = param_test4, scoring='neg_mean_squared_error',n_jobs=1,iid=False, cv=5)
a=gsearch4.fit(train[predictors],train[target])
print(a)
gsearch4.fit(X,y)
print(gsearch4.cv_results_, gsearch4.best_params_, gsearch4.best_score_)
LightGBM
LightGBM中的主要調節的參數包括核心參數、學習控制參數、IO 參數、目標參數、度量參數等。
Core Parameters(核心參數)
- task [default=train]
數據的用途 選擇 train,predict或者convert_model(將模型文件轉換成 if-else 格式): - objective [default=regression]
模型的用途
‘regression’表示回歸任務,但是使用L2損失函數。
‘regression_l1’:表示回歸任務,但是使用L1損失函數。
‘huber’: 表示回歸任務,但是使用huber 損失函數。
‘fair’: 表示回歸任務,但是使用fair 損失函數。
‘binary’: 表示二分類任務,使用對數損失函數作為目標函數。
‘multiclass’: 表示多分類任務,使用softmax 函數作為目標函數。必須設置num_class 參數
‘multiclassova’ : 表示多分類任務,使用one-vs-all 的二分類目標函數。必須設置num_class 參數
‘xentropy’: 目標函數為交叉熵(同時具有可選擇的線性權重)。要求標簽是[0,1] 之間的數值。
‘xentlambda’ : 替代了參數化的cross_entropy 。要求標簽是[0,1]之間的數值。 - boosting [default=gbdt]
給出基學習器模型算法。可以為:
‘gbdt’: 表示傳統的梯度提升決策樹。默認值為’gbdt’
‘rf’: 表示隨機森林。
‘dart’: 表示帶dropout 的gbdt
goss:表示Gradient-based One-Side Sampling 的gbdt (基於梯度的單側采樣) - data, [default=""]
訓練數據, LightGBM 將會使用這個數據進行訓練 - valid, [default=""]
驗證/測試 數據, LightGBM 將輸出這些數據的度量 - num_iterations, [default=100]
boosting的迭代次數。- 對於python/R包,該參數是被忽略的。對於python,使用train()/cv()的輸入參數num_boost_round來代替。
- learning_rate, [default=0.1]
學習率 - num_leaves, [default=31]
一棵樹上的葉子數。 - tree_learner,[default=serial]
主要用於並行學習。 默認為’serial’單台機器。 - num_threads, [default=OpenMP_default]
LightGBM 的線程數 - device, [default=cpu]
指定計算設備。默認為’cpu’。 可以為’gpu’,’cpu’。- 為了加快學習速度,GPU 默認使用32位浮點數來求和。你可以設置gpu_use_dp=True 來啟動64位浮點數,但是它會使得訓練速度降低。
Learning Control Parameters(學習控制參數)
- max_depth, [default=-1]
限制樹模型的最大深度。如果小於0,則表示沒有限制。 - min_data_in_leaf, [default=20]
一個葉子上數據的最小數量. 可以用來處理過擬合. - min_sum_hessian_in_leaf, [default=1e-3]
一個葉子上的最小 hessian 和也就是葉節點樣本權重之和的最小值), 類似於 min_data_in_leaf, 可以用來處理過擬合. - feature_fraction, [default=1.0]
如果小於1.0,則lightgbm 會在每次迭代中隨機選擇部分特征。如0.8 表示:在每棵樹訓練之前選擇80% 的特征來訓練。 - feature_fraction_seed, [default=2]
feature_fraction 的隨機數種子 - bagging_fraction, [default=1]
類似於 feature_fraction, 但是它將在不進行重采樣的情況下隨機選擇部分數據- Note: 為了啟用 bagging, bagging_freq 應該設置為非零值
- bagging_freq, [default=0]
bagging 的頻率, 0 意味着禁用 bagging. k 意味着每 k 次迭代執行bagging - bagging_seed , [default=3]
bagging 隨機數種子 - early_stopping_round, [default=0]
如果一個驗證集的度量在 early_stopping_round 循環中沒有提升, 將停止訓練 - lambda_l1, [default=0]
L1 正則 - lambda_l2, [default=0]
L2 正則 - min_split_gain, [default=0]
執行切分的最小增益 - lambda_l1, [default=0]
L1 正則 - feature_fraction_seed, [default=2]
feature_fraction 的隨機數種子 - feature_fraction_seed, [default=2]
feature_fraction 的隨機數種子 - feature_fraction_seed, [default=2]
feature_fraction 的隨機數種子
IO Parameters(IO 參數)
-
max_bin, [default=255]
表示最大的桶的數量。lightgbm 會根據它來自動壓縮內存。如max_bin=255 時,則lightgbm 將使用uint8 來表示特征的每一個值。 -
min_data_in_bin, [default=3]
表示每個桶的最小樣本數。該方法可以避免出現一個桶只有一個樣本的情況。 -
data_random_seed, [default=1]
表示並行學習數據分隔中的隨機數種子。默認為1它不包括特征並行。 -
output_model, [default=LightGBM_model.txt]
表示訓練中輸出的模型被保存的文件的文件名。 -
input_model, [default=""]
表示輸入模型的文件的文件名。默認空字符串。對於prediction任務,該模型將用於預測數據,對於train任務,訓練將從該模型繼續 -
output_result, [default=LightGBM_predict_result.txt]
prediction 任務的預測結果文件名 -
pre_partition, [default=false]
用於並行學習(不包括功能並行). 如果為true,則不同的機器使用不同的partition 來訓練。 -
is_sparse, [default=true]
用於 enable/disable 稀疏優化. 設置 false 就禁用稀疏優化 -
two_round, [default=false]
一個布爾值,指示是否啟動兩次加載。默認值為False,表示只需要進行一次加載。默認情況下,lightgbm 會將數據文件映射到內存,然后從內存加載特征,這將提供更快的數據加載速度。但是當數據文件很大時,內存可能會被耗盡。如果數據文件太大,則將它設置為True -
save_binary, [default=1]
表示是否將數據集(包括驗證集)保存到二進制文件中。默認值為False。如果為True,則可以加快數據的加載速度。 -
verbosity, [default=1]
表示是否輸出中間信息。默認值為1。如果小於0,則僅僅輸出critical 信息;如果等於0,則還會輸出error,warning 信息; 如果大於0,則還會輸出info 信息。 -
header, [default=false]
如果輸入數據有標識頭, 則在此處設置 true -
label , [default=""]
表示標簽列。默認為空字符串。你也可以指定一個整數,如label=0 表示第0列是標簽列。你也可以為列名添加前綴,如label=prefix:label_name -
weight , [default=""]
一個字符串,表示樣本權重列。默認為空字符串。你也可以指定一個整數,如weight=0 表示第0列是權重列。注意:它是剔除了標簽列之后的索引。假如標簽列為0,權重列為1,則這里weight=0。你也可以為列名添加前綴,如weight=prefix:weight_name -
query, [default=""]
表示query/group ID 列。 -
ignore_column , [default=""]
表示訓練中忽略的一些列,默認為空字符串。可以用數字做索引,如ignore_column=0,1,2 表示第0,1,2 列將被忽略。注意:它是剔除了標簽列之后的索引。 -
categorical_feature, [default=""]
指定category 特征的列。默認為空字符串。可以用數字做索引,如categorical_feature=0,1,2 表示第0,1,2 列將作為category 特征。注意:它是剔除了標簽列之后的索引。你也可以為列名添加前綴,如categorical_feature=prefix:cat_name1,cat_name2 在categorycal 特征中,負的取值被視作缺失值。 -
predict_leaf_index[default=false]
表示是否預測每個樣本在每棵樹上的葉節點編號。默認為False。在預測時,每個樣本都會被分配到每棵樹的某個葉子節點上。該參數就是要輸出這些葉子節點的編號。該參數只用於prediction 任務。 -
bin_construct_sample_cnt [default=200000]
表示用來構建直方圖的樣本的數量。默認為200000。如果數據非常稀疏,則可以設置為一個更大的值,如果設置更大的值,則會提供更好的訓練效果,但是會增加數據加載時間。 -
num_iteration_predict[default=-1]
表示在預測中使用多少棵子樹。默認為-1。小於等於0表示使用模型的所有子樹。該參數只用於prediction 任務。
Objective Parameters(目標參數)
- sigmoid[default=1]
sigmoid 函數的參數. 將用於 binary 分類 和 lambdarank。 - scale_pos_weight[default=1]
用於調整正樣本的權重,默認值為0,用於二分類任務。 - is_unbalance[default=false]
指示訓練數據是否均衡的。默認為True。用於二分類任務。 - num_class[default=1]
指示了多分類任務中的類別數量。默認為1,用於多分類任務。 - reg_sqrt[default=false]
一個布爾值,默認為False。如果為True,則擬合的結果為:\(\sqrt{label}\)。同時預測的結果被自動轉換為:\({pred}^2\)。它用於回歸任務。
Metric Parameters(度量參數)
- metric[default={l2 for regression}, {binary_logloss for binary classification}, {ndcg for lambdarank}]
度量的指標,默認為:對於回歸問題,使用l2 ;對於二分類問題,使用binary_logloss;對於lambdarank 問題,使用ndcg。如果有多個度量指標,則用逗號, 分隔。- ‘l1’ 或者 mean_absolute_error或者 mae或者 regression_l1: 表示絕對值損失
- ‘l2’ 或者mean_squared_error或者 mse或者 regression_l2或者 regression:表示平方損失
- ‘l2_root’ 或者root_mean_squared_error或者 rmse:表示開方損失
- ‘quantile’: 表示Quantile 回歸中的損失
- ‘mape’ 或者 ‘mean_absolute_percentage_error’ :表示MAPE 損失
- ‘map’ 或者’mean_average_precision’: 表示平均的精度
- ‘auc’: 表示AUC
- ‘binary_logloss’或者’binary’: 表示二類分類中的對數損失函數
- ‘binary_error’: 表示二類分類中的分類錯誤率
- ‘multi_logloss’或者 ‘multiclass’或者 ‘softmax’或者 ‘multiclassova’或者 ‘multiclass_ova’,或者’ova’或者 ‘ovr’: 表示多類分類中的對數損失函數
- ‘multi_error’: 表示多分類中的分類錯誤率
- ‘xentropy’或者’cross_entropy’: 表示交叉熵
- ‘xentlambda’ 或者’cross_entropy_lambda’: 表示intensity 加權的交叉熵
- ‘kldiv’或者’kullback_leibler’: 表示KL 散度
- metric_freq[default=1]
每隔多少次輸出一次度量結果。默認為1。 - train_metric [default=false]
如果為True,則在訓練時就輸出度量結果。
調參方法
針對 leaf-wise 樹的參數優化:
- num_leaves:控制了葉節點的數目。它是控制樹模型復雜度的主要參數。
如果是level-wise,則該參數為\(2^{depth}\),其中\(depth\)為樹的深度。但是當葉子數量相同時,leaf-wise的樹要遠遠深過level-wise樹,非常容易導致過擬合。因此應該讓num_leaves小於\(2^{depth}\)。在leaf-wise樹中,並不存在\(depth\)的概念。因為不存在一個從\(leaves\)到\(depth\)的合理映射。
- min_data_in_leaf:每個葉節點的最少樣本數量。它是處理leaf-wise樹的過擬合的重要參數。將它設為較大的值,可以避免生成一個過深的樹。但是也可能導致欠擬合。
- max_depth: 控制了樹的最大深度。該參數可以顯式的限制樹的深度。
針對更快的訓練速度:
- 通過設置 bagging_fraction 和 bagging_freq 參數來使用 bagging 方法
- 通過設置 feature_fraction 參數來使用特征的子抽樣
- 使用較小的 max_bin
- 使用 save_binary 在未來的學習過程對數據加載進行加速
獲取更好的准確率:
- 使用較大的 max_bin (學習速度可能變慢)
- 使用較小的 learning_rate 和較大的 num_iterations
- 使用較大的 num_leaves (可能導致過擬合)
- 使用更大的訓練數據
- 嘗試 dart
緩解過擬合:
- 使用較小的 max_bin
- 使用較小的 num_leaves
- 使用 min_data_in_leaf 和 min_sum_hessian_in_leaf
- 通過設置 bagging_fraction 和 bagging_freq 來使用 bagging
- 通過設置 feature_fraction 來使用特征子抽樣
- 使用更大的訓練數據
- 使用 lambda_l1, lambda_l2 和 min_gain_to_split 來使用正則
- 嘗試 max_depth 來避免生成過深的樹