[机器学习]XGBoost 和 LightGBM 参数对比与调参
XGBoost 參數(shù)介紹
XGBoost的參數(shù)一共分為三類(完整參數(shù)請戳官方文檔):
1.通用參數(shù)
2.Booster參數(shù)
n_estimator: 也作num_boosting_rounds
這是生成的最大樹的數(shù)目,也是最大的迭代次數(shù)。
learning_rate: 有時也叫作eta,系統(tǒng)默認(rèn)值為0.3,。
每一步迭代的步長,很重要。太大了運(yùn)行準(zhǔn)確率不高,太小了運(yùn)行速度慢。我們一般使用比默認(rèn)值小一點(diǎn),0.1左右就很好。
gamma:系統(tǒng)默認(rèn)為0,我們也常用0。
在節(jié)點(diǎn)分裂時,只有分裂后損失函數(shù)的值下降了,才會分裂這個節(jié)點(diǎn)。gamma指定了節(jié)點(diǎn)分裂所需的最小損失函數(shù)下降值。 這個參數(shù)的值越大,算法越保守。因?yàn)間amma值越大的時候,損失函數(shù)下降更多才可以分裂節(jié)點(diǎn)。所以樹生成的時候更不容易分裂節(jié)點(diǎn)。范圍: [0,∞]
subsample:系統(tǒng)默認(rèn)為1。
這個參數(shù)控制對于每棵樹,隨機(jī)采樣的比例。減小這個參數(shù)的值,算法會更加保守,避免過擬合。但是,如果這個值設(shè)置得過小,它可能會導(dǎo)致欠擬合。 典型值:0.5-1,0.5代表平均采樣,防止過擬合. 范圍: (0,1],注意不可取0
colsample_bytree:系統(tǒng)默認(rèn)值為1。我們一般設(shè)置成0.8左右。
用來控制每棵隨機(jī)采樣的列數(shù)的占比(每一列是一個特征)。 典型值:0.5-1范圍: (0,1]
colsample_bylevel:默認(rèn)為1,我們也設(shè)置為1.
這個就相比于前一個更加細(xì)致了,它指的是每棵樹每次節(jié)點(diǎn)分裂的時候列采樣的比例
max_depth: 系統(tǒng)默認(rèn)值為6
我們常用3-10之間的數(shù)字。這個值為樹的最大深度。這個值是用來控制過擬合的。max_depth越大,模型學(xué)習(xí)的更加具體。設(shè)置為0代表沒有限制,范圍: [0,∞]
max_delta_step:默認(rèn)0,我們常用0.
這個參數(shù)限制了每棵樹權(quán)重改變的最大步長,如果這個參數(shù)的值為0,則意味著沒有約束。如果他被賦予了某一個正值,則是這個算法更加保守。通常,這個參數(shù)我們不需要設(shè)置,但是當(dāng)個類別的樣本極不平衡的時候,這個參數(shù)對邏輯回歸優(yōu)化器是很有幫助的。
lambda:也稱reg_lambda,默認(rèn)值為0。
權(quán)重的L2正則化項(xiàng)。(和Ridge regression類似)。這個參數(shù)是用來控制XGBoost的正則化部分的。這個參數(shù)在減少過擬合上很有幫助。
alpha:也稱reg_alpha默認(rèn)為0,
權(quán)重的L1正則化項(xiàng)。(和Lasso regression類似)。 可以應(yīng)用在很高維度的情況下,使得算法的速度更快。
scale_pos_weight:默認(rèn)為1
在各類別樣本十分不平衡時,把這個參數(shù)設(shè)定為一個正值,可以使算法更快收斂。通常可以將其設(shè)置為負(fù)樣本的數(shù)目與正樣本數(shù)目的比值。
3.學(xué)習(xí)目標(biāo)參數(shù)
objective [缺省值=reg:linear]
- reg:linear– 線性回歸
- reg:logistic – 邏輯回歸
- binary:logistic – 二分類邏輯回歸,輸出為概率
- binary:logitraw – 二分類邏輯回歸,輸出的結(jié)果為wTx
- count:poisson – 計(jì)數(shù)問題的poisson回歸,輸出結(jié)果為poisson分布。在poisson回歸中,max_delta_step的缺省值為0.7 (used to safeguard optimization)
- multi:softmax – 設(shè)置 XGBoost 使用softmax目標(biāo)函數(shù)做多分類,需要設(shè)置參數(shù)num_class(類別個數(shù))
- multi:softprob – 如同softmax,但是輸出結(jié)果為ndata*nclass的向量,其中的值是每個數(shù)據(jù)分為每個類的概率。
eval_metric [缺省值=通過目標(biāo)函數(shù)選擇]
- rmse: 均方根誤差
- mae: 平均絕對值誤差
- logloss: negative log-likelihood
- error: 二分類錯誤率。其值通過錯誤分類數(shù)目與全部分類數(shù)目比值得到。對于預(yù)測,預(yù)測值大于0.5被認(rèn)為是正類,其它歸為負(fù)類。 error@t: 不同的劃分閾值可以通過 ‘t’進(jìn)行設(shè)置
- merror: 多分類錯誤率,計(jì)算公式為(wrong cases)/(all cases)
- mlogloss: 多分類log損失
- auc: 曲線下的面積
- ndcg: Normalized Discounted Cumulative Gain
- map: 平均正確率
一般來說,我們都會使用xgboost.train(params, dtrain)函數(shù)來訓(xùn)練我們的模型。這里的params指的是booster參數(shù)。
?
LightGBM 參數(shù)介紹
XGBoost 一共有三類參數(shù)通用參數(shù),學(xué)習(xí)目標(biāo)參數(shù),Booster參數(shù),那么對于LightGBM,我們有核心參數(shù),學(xué)習(xí)控制參數(shù),IO參數(shù),目標(biāo)參數(shù),度量參數(shù),網(wǎng)絡(luò)參數(shù),GPU參數(shù),模型參數(shù),這里我常修改的便是核心參數(shù),學(xué)習(xí)控制參數(shù),度量參數(shù)等。更詳細(xì)的請看LightGBM中文文檔
1.核心參數(shù)
boosting:也稱boost,boosting_type.默認(rèn)是gbdt。
LGB里面的boosting參數(shù)要比xgb多不少,我們有傳統(tǒng)的gbdt,也有rf,dart,doss,最后兩種不太深入理解,但是試過,還是gbdt的效果比較經(jīng)典穩(wěn)定
- gbdt, 傳統(tǒng)的梯度提升決策樹
- rf, Random Forest (隨機(jī)森林)
- dart, Dropouts meet Multiple Additive Regression Trees
- goss, Gradient-based One-Side Sampling (基于梯度的單側(cè)采樣)
num_thread:也稱作num_thread,nthread.指定線程的個數(shù)。
這里官方文檔提到,數(shù)字設(shè)置成cpu內(nèi)核數(shù)比線程數(shù)訓(xùn)練效更快(考慮到現(xiàn)在cpu大多超線程)。并行學(xué)習(xí)不應(yīng)該設(shè)置成全部線程,這反而使得訓(xùn)練速度不佳。
application:默認(rèn)為regression。,也稱objective, app這里指的是任務(wù)目標(biāo)
- 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 目標(biāo)函數(shù), 應(yīng)該設(shè)置好 num_class
- multiclassova, One-vs-All 二分類目標(biāo)函數(shù), 應(yīng)該設(shè)置好 num_class
- cross-entropy application
- xentropy, 目標(biāo)函數(shù)為 cross-entropy (同時有可選擇的線性權(quán)重), alias=cross_entropy
- xentlambda, 替代參數(shù)化的 cross-entropy, alias=cross_entropy_lambda
- 標(biāo)簽是 [0, 1] 間隔內(nèi)的任意值
- lambdarank, lambdarank application
- 在 lambdarank 任務(wù)中標(biāo)簽應(yīng)該為 int type, 數(shù)值越大代表相關(guān)性越高 (e.g. 0:bad, 1:fair, 2:good, 3:perfect)
- label_gain 可以被用來設(shè)置 int 標(biāo)簽的增益 (權(quán)重)
valid:驗(yàn)證集選用,也稱test,valid_data, test_data.支持多驗(yàn)證集,以,分割
learning_rate:也稱shrinkage_rate,梯度下降的步長。默認(rèn)設(shè)置成0.1,我們一般設(shè)置成0.05-0.2之間
num_leaves:也稱num_leaf,新版lgb將這個默認(rèn)值改成31,這代表的是一棵樹上的葉子數(shù)
num_iterations:也稱num_iteration, num_tree, num_trees, num_round, num_rounds,num_boost_round。迭代次數(shù)
device:default=cpu, options=cpu, gpu
- 為樹學(xué)習(xí)選擇設(shè)備, 你可以使用 GPU 來獲得更快的學(xué)習(xí)速度
- Note: 建議使用較小的 max_bin (e.g. 63) 來獲得更快的速度
- Note: 為了加快學(xué)習(xí)速度, GPU 默認(rèn)使用32位浮點(diǎn)數(shù)來求和. 你可以設(shè)置 gpu_use_dp=true 來啟用64位浮點(diǎn)數(shù), 但是它會使訓(xùn)練速度降低
- Note: 請參考 安裝指南 來構(gòu)建 GPU 版本
2.學(xué)習(xí)控制參數(shù)
- 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 將會在每次迭代中隨機(jī)選擇部分特征. 例如, 如果設(shè)置為 0.8, 將會在每棵樹訓(xùn)練之前選擇 80% 的特征
- 可以用來加速訓(xùn)練
- 可以用來處理過擬合
bagging_fraction:default=1.0, type=double, 0.0 < bagging_fraction < 1.0, 也稱sub_row, subsample
- 類似于 feature_fraction, 但是它將在不進(jìn)行重采樣的情況下隨機(jī)選擇部分?jǐn)?shù)據(jù)
- 可以用來加速訓(xùn)練
- 可以用來處理過擬合
- Note: 為了啟用 bagging, bagging_freq 應(yīng)該設(shè)置為非零值
bagging_freq: default=0, type=int, 也稱subsample_freq
- bagging 的頻率, 0 意味著禁用 bagging. k 意味著每 k 次迭代執(zhí)行bagging
- Note: 為了啟用 bagging, bagging_fraction 設(shè)置適當(dāng)
lambda_l1:默認(rèn)為0,也稱reg_alpha,表示的是L1正則化,double類型
lambda_l2:默認(rèn)為0,也稱reg_lambda,表示的是L2正則化,double類型
cat_smooth: default=10, type=double
- 用于分類特征
- 這可以降低噪聲在分類特征中的影響, 尤其是對數(shù)據(jù)很少的類別
min_data_in_leaf , 默認(rèn)為20。 也稱min_data_per_leaf , min_data, min_child_samples。
一個葉子上數(shù)據(jù)的最小數(shù)量。可以用來處理過擬合。
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, 可以用來處理過擬合.
- 子節(jié)點(diǎn)所需的樣本權(quán)重和(hessian)的最小閾值,若是基學(xué)習(xí)器切分后得到的葉節(jié)點(diǎn)中樣本權(quán)重和低于該閾值則不會進(jìn)一步切分,在線性模型中該值就對應(yīng)每個節(jié)點(diǎn)的最小樣本數(shù),該值越大模型的學(xué)習(xí)約保守,同樣用于防止模型過擬合
early_stopping_round, 默認(rèn)為0, type=int, 也稱early_stopping_rounds, early_stopping。
如果一個驗(yàn)證集的度量在 early_stopping_round 循環(huán)中沒有提升, 將停止訓(xùn)練、
min_split_gain, 默認(rèn)為0, type=double, 也稱min_gain_to_split`。執(zhí)行切分的最小增益。
max_bin:最大直方圖數(shù)目,默認(rèn)為255,工具箱的最大數(shù)特征值決定了容量 工具箱的最小數(shù)特征值可能會降低訓(xùn)練的準(zhǔn)確性, 但是可能會增加一些一般的影響(處理過擬合,越大越容易過擬合)。
- 針對直方圖算法tree_method=hist時,用來控制將連續(xù)值特征離散化為多個直方圖的直方圖數(shù)目。
- LightGBM 將根據(jù) max_bin 自動壓縮內(nèi)存。 例如, 如果 maxbin=255, 那么 LightGBM 將使用 uint8t 的特性值。
12.subsample_for_bin
bin_construct_sample_cnt, 默認(rèn)為200000, 也稱subsample_for_bin。用來構(gòu)建直方圖的數(shù)據(jù)的數(shù)量。
3.度量函數(shù)
- 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 (與可選的線性權(quán)重), alias=cross_entropy
- xentlambda, “intensity-weighted” 交叉熵, alias=cross_entropy_lambda
- kldiv, Kullback-Leibler divergence, alias=kullback_leibler
- 支持多指標(biāo), 使用 , 分隔
4.?IO參數(shù)
總的來說,我還是覺得LightGBM比XGBoost用法上差距不大。參數(shù)也有很多重疊的地方。很多XGBoost的核心原理放在LightGBM上同樣適用。 同樣的,Lgb也是有train()函數(shù)和LGBClassifier()與LGBRegressor()函數(shù)。后兩個主要是為了更加貼合sklearn的用法,這一點(diǎn)和XGBoost一樣。
?
兩者參數(shù)對比
1. 使用num_leaves
因?yàn)長ightGBM使用的是leaf-wise的算法,因此在調(diào)節(jié)樹的復(fù)雜程度時,使用的是num_leaves而不是max_depth。
大致?lián)Q算關(guān)系:num_leaves = 2^(max_depth)。它的值的設(shè)置應(yīng)該小于2^(max_depth),否則可能會導(dǎo)致過擬合。
2.對于非平衡數(shù)據(jù)集:可以param['is_unbalance']='true’
3. Bagging參數(shù):bagging_fraction+bagging_freq(必須同時設(shè)置)、feature_fraction。bagging_fraction可以使bagging的更快的運(yùn)行出結(jié)果,feature_fraction設(shè)置在每次迭代中使用特征的比例。
4. min_data_in_leaf:這也是一個比較重要的參數(shù),調(diào)大它的值可以防止過擬合,它的值通常設(shè)置的比較大。
5.max_bin:調(diào)小max_bin的值可以提高模型訓(xùn)練速度,調(diào)大它的值和調(diào)大num_leaves起到的效果類似。
?
?
調(diào)參核心
- 調(diào)參1:提高準(zhǔn)確率":num_leaves, max_depth, learning_rate
- 調(diào)參2:降低過擬合 max_bin min_data_in_leaf
- 調(diào)參3:降低過擬合 正則化L1, L2
- 調(diào)參4:降低過擬合 數(shù)據(jù)抽樣 列抽樣
調(diào)參方向:處理過擬合(過擬合和準(zhǔn)確率往往相反)
- 使用較小的 max_bin
- 使用較小的 num_leaves
- 使用 min_data_in_leaf 和 min_sum_hessian_in_leaf
- 通過設(shè)置 bagging_fraction 和 bagging_freq 來使用 bagging
- 通過設(shè)置 feature_fraction <1來使用特征抽樣
- 使用更大的訓(xùn)練數(shù)據(jù)
- 使用 lambda_l1, lambda_l2 和 min_gain_to_split 來使用正則
- 嘗試 max_depth 來避免生成過深的樹
imbalanced數(shù)據(jù)集的參數(shù)
lightGBM和XGBoost都提供了?scale_pos_weight?參數(shù)來處理正樣本和負(fù)樣本的不平衡問題。?
1. lightGBM通過增加正樣本標(biāo)簽的權(quán)重,即label_weights_[1] *= scale_pos_weight_?來處理樣本不平衡的問題
? ? 一個簡單的方法是設(shè)置is_unbalance參數(shù)為True或者設(shè)置scale_pos_weight, 二者只能選一個。?
設(shè)置is_unbalance參數(shù)為True時會把負(fù)樣本的權(quán)重設(shè)為:正樣本數(shù)/負(fù)樣本數(shù)。這個參數(shù)只能用于二分類。
?
2.?XGBoost 使用增大CART樹葉子的分?jǐn)?shù)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?是用來調(diào)節(jié)正負(fù)樣本不均衡問題的,用助于樣本不平衡時訓(xùn)練的收斂。?如何你僅僅關(guān)注預(yù)測問題的排序或者AUC指標(biāo),那么你盡管可以調(diào)節(jié)此參數(shù)。用?scale_pos_weights?調(diào)節(jié)后預(yù)測的結(jié)果所表示概率確實(shí)已經(jīng)沒有參考意義了
?
總結(jié)
以上是生活随笔為你收集整理的[机器学习]XGBoost 和 LightGBM 参数对比与调参的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现货市场和期货市场的区别
- 下一篇: [kubernetes] Schedul