xgboost&lightgbm調參指南


本文重點闡述了xgboost和lightgbm的主要參數和調參技巧,其理論部分可見集成學習,以下內容主要來自xgboostLightGBM的官方文檔。

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 來避免生成過深的樹


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM