带有“early_stopping_rounds”的 xgboost 的 cross_val_score 返回“IndexError”

Posted

技术标签:

【中文标题】带有“early_stopping_rounds”的 xgboost 的 cross_val_score 返回“IndexError”【英文标题】:cross_val_score for xgboost with "early_stopping_rounds" returns "IndexError" 【发布时间】:2018-07-17 02:35:02 【问题描述】:

我正在使用 sklearn 和 xgboost 在 python (v3.6) 中建立回归模型。 我想用 early_stopping_rounds 计算 sklearn.cross_val_score。以下代码返回错误:

xgb_model = xgb.XGBRegressor(n_estimators=600,
                             learning_rate=0.06)

xgb_cv = cross_val_score(xgb_model, train_x, train_y, 
                         cv=5, scoring='neg_mean_absolute_error',
                         fit_params='early_stopping_rounds':3)

IndexError: list index out of range

另外,如果我尝试将参数传递为“xgbregressor__early_stopping_rounds”(在一些相关主题中在线找到),则会显示以下错误:

TypeError: fit() got an unexpected keyword argument
'xgbregressor__early_stopping_rounds'

如果我在没有“fit_params”的情况下运行相同的模型,一切正常。 使用 cross_val_score 时有什么办法可以避免这个错误?

【问题讨论】:

我认为您可以在此 *** 响应中找到解决方案:***.com/a/43014158/6413835 你是对的,谢谢! xgboost 有自己的交叉验证功能。 xgboost.cv。链接:xgboost.readthedocs.io/en/latest/python/python_api.html。有没有理由不使用它? 最初,我在这篇帖子https://jessesw.com/XG-Boost/ 之后使用xgboost.cv 尝试了它,但后来又切换回了sklearn 框架。我只是觉得更舒服。您是否看到使用 xgboost.cv 的任何实际优势? 只是它更兼容。 【参考方案1】:

按照 lbcommer 的建议,从这里 GridSearchCV - XGBoost - Early Stopping 用 glao 的回答解决了这个问题 - 谢谢!

为避免过度拟合,我使用训练数据的单独部分作为验证数据集来评估算法。请参阅下面的代码:

train_x, val_x, train_y, val_y = train_test_split(train_x, train_y, test_size = 0.30, random_state=1)

xgb_model = xgb.XGBRegressor(n_estimators=600, learning_rate=0.06)

fit_params='early_stopping_rounds': 30, 
            'eval_metric': 'mae',
            'verbose': False,
            'eval_set': [[val_x, val_y]]

xgb_cv = cross_val_score(xgb_model, train_x, train_y, 
                         cv = 5, 
                         scoring = 'neg_mean_absolute_error',
                         fit_params = fit_params)

【讨论】:

显然,在进行 K 折 CV 时,不需要保留。 eval_set 应该只是每个 k 折的测试拆分。最终我不得不在一个简单的 for 循环中使用 xgb.train 来做到这一点。

以上是关于带有“early_stopping_rounds”的 xgboost 的 cross_val_score 返回“IndexError”的主要内容,如果未能解决你的问题,请参考以下文章

XGBoost 最佳迭代

LightGBM 中的交叉验证

如何使用 lightgbm.cv 进行回归?

XGBoost - 帮助解释助推器的行为。为啥第 0 次迭代总是最好的?

带有多个链接的 NSAttributedString 的 UILabel,带有行限制,显示尾部截断,带有未见文本的 NSBackgroundColorAttributeName

使用带有 uuencode 的“sendmail”发送邮件,并带有主题