python - LightGBM 最佳迭代总是返回 1
问题描述
我正在使用 lightgbm 来解决回归问题,以下是我的参数:
lgbm_params = {
'nthread': 5,
'boosting_type': 'gbdt',
'objective': 'regression',
'scale_pos_weight':7,
'metric':['rmse',"l1"],
'learning_rate': 0.001,
'max_bin':2**7-1,
'num_leaves': 63,
'max_depth': -1,
'subsample': 1,
'feature_fraction': 0.9,
'colsample_bytree': 0.08,
'min_split_gain': 0.09,
'lambda_l2' : 0.2,
'verbose': 1,
}
带有训练参数:
def lgb_mae_score(y_hat, data):
y_true = data.get_label()
return 'lgb_mae_score', mean_absolute_error(y_hat,y_true), True
dtrain = lgb.Dataset(train_x, label=train_y)
dval = lgb.Dataset(valid_x, label=valid_y, reference=dtrain)
bst = lgb.train(
lgbm_params, dtrain, num_boost_round=20000,
valid_sets=[dval], early_stopping_rounds=1000, verbose_eval=100,feval=lgb_mae_score
)
但我的训练过程总是在 1000 epoch 停止并返回:
很明显loss还在下降,第一轮并不是最好的迭代。
任何想法为什么我会陷入这种情况?
任何建议将不胜感激。
- - - - - - - - - - - - - -更新 - - - - - - - - - - - ------
我认为问题是由我的自定义指标函数引起的lgb_mae_score
。
我将它从训练功能中删除,训练过程很顺利,但我仍然不明白为什么。
解决方案
您在模型训练中设置 early_stopping_rounds 参数。所以它将停止在 1000 个 epoch。
请参考 light-gbm 文档: https ://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.early_stopping.html 。
当模型准确性有所提高时,训练将停止。如果我们设置 early_stopping_rounds 参数模型将从训练数据中选择最佳参数
推荐阅读
- ansible - Ansible Playbook 仅执行角色列表中的第一个角色
- java - 启动 JMeter bat 文件时出现 Java 错误
- html - 仅使用 xPath 获取节点文本的子字符串
- vba - 如何制作子文件夹的子文件夹?
- git - 如何更改git目录
- c# - 在 Singleton 服务中使用 IOptionsMonitor 在运行时从 appsettings 重新加载值
- r - 将字符中的最后一个逗号替换为“&”
- python - CHECK 约束解决方法中禁止的 SQLAlchemy 子查询
- python-3.x - 如何使用函数式编程方法实现 Google Cloud Function?
- c# - 使用 REST API 的设计模式