lgb调参

使用k-fold调参,k-fold实在是消耗时间,但是留出法精度实在是不高(主要是验证集测试集分布差异)。
博文使用k-flod调参,如果使用留出法调参原理和k-fold一样,只是API和参数名称存在差别而已。

lgb参数解释

step 1 确定n_estimators

首先创造一个基础模型,各项参数需要选择一个初始值,至于初始值如何确定那就仁者见仁智者见智了。lr可以选择0.1加快训练速度,如果硬件条件允许的话,lr最好小一点。

params_lgb = {
    'boosting_type': 'gbdt', 
    'objective': 'regression', 
     'n_jobs':-1,
    'learning_rate': 0.1, 
    'num_leaves': 50, 
    'max_depth': 6,
    'subsample': 0.8, 
    'colsample_bytree': 0.8, 
}
train_data_lgb = lgb.Dataset(train_x, train_y, silent=True)
cv_results = lgb.cv(
    params_lgb, train_data_lgb, num_boost_round=10000, nfold=5, stratified=False, shuffle=True, metrics='l2',
    early_stopping_rounds=100, verbose_eval=50, show_stdv=True, seed=2020)

print('best n_estimators:', len(cv_results['l2']))
print('best cv score:', cv_results['l2'][-1])

获取了临时的n_estimators = 6102之后,就可以将参数(0.02,6102)带入下一步调参了。友情提示:前期如果lr选择的很小的话真的消耗时间。
注意:early_stopping_rounds最好写大一些,越大越好,例子中的100实在是太小了。

Step2 max_depth & num_leaves

众所周知,leaf和depth非常影响树模型的拟合效果。
lgb是基于leaf的模型,每次分叉只分一个,所以depth = leaf -1.
depth和leaf调试一个即可。
此时选择sklearn的网格k-fold交叉验证。

model_lgb = lgb.LGBMRegressor(objective='regression',num_leaves=50,
                              learning_rate=0.02, n_estimators=6102, max_depth=6,
                              metric='mse', bagging_fraction = 0.8,feature_fraction = 0.8)
params_test1={
    'max_depth': range(3,8,2),
    
}
gsearch1 = GridSearchCV(estimator=model_lgb, param_grid=params_test1, scoring='neg_mean_squared_error', cv=5, verbose=1, n_jobs=4)

Step3 min_data_in_leaf & min_sum_hessian_in_leaf

调节这两个数值适当降低过拟合。

Step4 feature_fraction & bagging_fraction

调节这两个数值适当降低过拟合。

Step5 正则化参数lambda_l1& lambda_l2

这两个值也是降低过拟合,

最后一步

最后一步需要重新确定n_estimators 。注意,如果之前训练使用的lr较大,此时需要降低lr。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值