【发布时间】:2019-01-25 00:42:40
【问题描述】:
我正在使用 Python 在 25 个特征列数据集上训练 XGBoost 回归器,并使用 SKlearn 的 GridSearchCV 进行参数调整。 GridSearchCV 允许您使用 'scoring' 参数选择得分手,r2 是一个有效选项。
grid = GridSearchCV(mdl, param_grid=params, verbose=1, cv=kfold,
n_jobs=-1, error_score='raise',scoring='r2')`
但是,当我希望在grid.fit() 函数中使用r2 作为我的“eval_metric”时,我没有很好的方法来使用r2。
grid.fit(X_train, y_train, eval_set=[(X_test, y_test)],
eval_metric='rmse', early_stopping_rounds=150)
我曾尝试使用 sklearns 内置的r2_score 方法,但存在一些问题。第一个是,r2 score 是根据y_test 集合与y_pred 集合计算的。为了设置y_pred,我们需要拟合模型。所以你可以看到我遇到了循环问题。
我已经尝试了一些方法来解决这个问题。首先是训练模型并在 eval_metric 变量中进行预测,如下所示:
grid.fit(X_train, y_train, eval_set=[(X_test, y_test)],
eval_metric=r2_score(y_test, mdl.predict(X_test)), early_stopping_rounds=150)
但我收到以下错误:
xgboost.core.XGBoostError: need to call fit beforehand
这是有道理的。
有什么方法可以获取 GridSearchCV 正在使用的当前参数,创建和存储预测,然后使用 r2_score 作为 eval_metric?
我的想法是这样的。 r2 分数是 0 到 1 范围内的标准评估指标(1 表示完美拟合)。这是一个指标,如果有一种方法可以对其进行标准化优化,它将在几乎所有机器学习中产生非常深远的影响。
【问题讨论】:
-
有几个我不清楚的问题:1) 任何评估指标都是基于
y_test与y_pred的比较。所以我不明白为什么这是一个表演者。 2) 可调用的签名特定于 xgboost,请参阅此处的eval_metric文档:xgboost.readthedocs.io/en/latest/python/…。 3)你为什么要首先拥有eval_metric?它不用于优化,仅用于监控迭代和提前停止之间的性能。 -
正如@MykhailoLisovyi 所说,您没有正确使用参数。您不需要传递 metric 中的值,只需传递可调用的值,并且值将在适当的时间自动传递给它们(在拟合模型并在迭代中获得预测之后)。
标签: python scikit-learn xgboost evaluation grid-search