[机器学习]XGBoost 和 LightGBM 参数对比与调参
XGBoost 參數介紹
XGBoost的參數一共分為三類(完整參數請戳官方文檔):
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參數。
?
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 Trees
- goss, 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, mse
- regression_l1, L1 loss, alias=mean_absolute_error, mae
- huber, Huber loss
- fair, Fair loss
- poisson, Poisson regression
- quantile, Quantile regression
- quantile_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_entropy
- xentlambda, 替代參數化的 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 標簽的增益 (權重)
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.學習控制參數
- 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)的最小閾值,若是基學習器切分后得到的葉節點中樣本權重和低于該閾值則不會進一步切分,在線性模型中該值就對應每個節點的最小樣本數,該值越大模型的學習約保守,同樣用于防止模型過擬合
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.度量函數
- 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
- 支持多指標, 使用 , 分隔
4.?IO參數
總的來說,我還是覺得LightGBM比XGBoost用法上差距不大。參數也有很多重疊的地方。很多XGBoost的核心原理放在LightGBM上同樣適用。 同樣的,Lgb也是有train()函數和LGBClassifier()與LGBRegressor()函數。后兩個主要是為了更加貼合sklearn的用法,這一點和XGBoost一樣。
?
兩者參數對比
1. 使用num_leaves
因為LightGBM使用的是leaf-wise的算法,因此在調節樹的復雜程度時,使用的是num_leaves而不是max_depth。
大致換算關系:num_leaves = 2^(max_depth)。它的值的設置應該小于2^(max_depth),否則可能會導致過擬合。
2.對于非平衡數據集:可以param['is_unbalance']='true’
3. Bagging參數:bagging_fraction+bagging_freq(必須同時設置)、feature_fraction。bagging_fraction可以使bagging的更快的運行出結果,feature_fraction設置在每次迭代中使用特征的比例。
4. min_data_in_leaf:這也是一個比較重要的參數,調大它的值可以防止過擬合,它的值通常設置的比較大。
5.max_bin:調小max_bin的值可以提高模型訓練速度,調大它的值和調大num_leaves起到的效果類似。
?
?
調參核心
- 調參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 來避免生成過深的樹
imbalanced數據集的參數
lightGBM和XGBoost都提供了?scale_pos_weight?參數來處理正樣本和負樣本的不平衡問題。?
1. lightGBM通過增加正樣本標簽的權重,即label_weights_[1] *= scale_pos_weight_?來處理樣本不平衡的問題
? ? 一個簡單的方法是設置is_unbalance參數為True或者設置scale_pos_weight, 二者只能選一個。?
設置is_unbalance參數為True時會把負樣本的權重設為:正樣本數/負樣本數。這個參數只能用于二分類。
?
2.?XGBoost 使用增大CART樹葉子的分數w,即w += y * ((param_.scale_pos_weight * w) - w);;來處理樣本不平衡的問題。
source
#pragma omp parallel for schedule(static)for (omp_ulong i = 0; i < n - remainder; i += 8) {avx::Float8 y(&info.labels_[i]);avx::Float8 p = Loss::PredTransform(avx::Float8(&preds_h[i]));avx::Float8 w = info.weights_.empty() ? avx::Float8(1.0f): avx::Float8(&info.weights_[i]);// Adjust weightw += y * (scale * w - w);avx::Float8 grad = Loss::FirstOrderGradient(p, y);avx::Float8 hess = Loss::SecondOrderGradient(p, y);avx::StoreGpair(gpair_ptr + i, grad * w, hess * w);}for (omp_ulong i = n - remainder; i < n; ++i) {auto y = info.labels_[i];bst_float p = Loss::PredTransform(preds_h[i]);bst_float w = info.GetWeight(i);w += y * ((param_.scale_pos_weight * w) - w);gpair[i] = GradientPair(Loss::FirstOrderGradient(p, y) * w,Loss::SecondOrderGradient(p, y) * w);}}scale_pos_weight?是用來調節正負樣本不均衡問題的,用助于樣本不平衡時訓練的收斂。?如何你僅僅關注預測問題的排序或者AUC指標,那么你盡管可以調節此參數。用?scale_pos_weights?調節后預測的結果所表示概率確實已經沒有參考意義了
?
總結
以上是生活随笔為你收集整理的[机器学习]XGBoost 和 LightGBM 参数对比与调参的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现货市场和期货市场的区别
- 下一篇: 魅族m711c是什么型号