使用"early_stopping_rounds"的xgboost的交叉验证分数返回了"IndexError"错误。

5
我正在使用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 时有办法避免这个错误吗?


我认为你可以在这个stackoverflow的回答中找到解决方案:https://dev59.com/EVgQ5IYBdhLWcg3wSiF1#43014158 - lbcommer
你是对的,谢谢! - busy_c
xgboost有自己的交叉验证函数,即xgboost.cv。链接:http://xgboost.readthedocs.io/en/latest/python/python_api.html。不使用它的原因是什么? - Eran Moshe
最初,我尝试了使用xgboost.cv,遵循这篇文章[https://jessesw.com/XG-Boost/]的指导,但后来又切换回sklearn框架。我只是感觉用它更舒适。你认为使用`xgboost.cv`有什么实际优势吗? - busy_c
只是为了更兼容。 - Eran Moshe
1个回答

5

我通过glao在这里GridSearchCV - XGBoost - Early Stopping的答案解决了问题,正如lbcommer建议的那样 - 谢谢!

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

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)

7
在进行K折交叉验证时,显然不需要使用保留集。 对于每个k折,eval_set应该只是测试集。最终,我不得不在一个简单的for循环中使用xgb.train来完成这个过程。 - bloodrootfc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接