使用k-fold调参,k-fold实在是消耗时间,但是留出法精度实在是不高(主要是验证集测试集分布差异)。
博文使用k-flod调参,如果使用留出法调参原理和k-fold一样,只是API和参数名称存在差别而已。
lgb参数解释
首先创造一个基础模型,各项参数需要选择一个初始值,至于初始值如何确定那就仁者见仁智者见智了。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实在是太小了。
众所周知,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)
调节这两个数值适当降低过拟合。
调节这两个数值适当降低过拟合。
这两个值也是降低过拟合,
最后一步需要重新确定n_estimators 。注意,如果之前训练使用的lr较大,此时需要降低lr。