【问题标题】:Cross-validation in scikit-learn: mean absolute error of (X_test, y_test)scikit-learn 中的交叉验证:(X_test, y_test) 的平均绝对误差
【发布时间】:2019-06-08 15:19:59
【问题描述】:

通常我们将原始特征和目标数据 (X,y) 拆分为 (X_train, y_train) 和 (X_test, y_test)。

通过使用方法:

mae_A = cross_val_score(clf, X_train_scaled, y_train, scoring="neg_mean_absolute_error", cv=kfold)

我得到了 (X_train, y_train) 的交叉验证平均绝对误差 (MAE),对吧?

那么,我怎样才能获得 (X_test, y_test) 的 MAE(来自之前使用 (X_train, y_train) 得到的交叉验证模型)?

非常感谢!

麦孔·洛伦索

【问题讨论】:

  • 通常,您不会分别对训练和测试进行交叉验证。您对整个数据集执行此操作。
  • 如果在 cv=kfold 而不是 kfold 中,您使用可迭代的收益率(训练、测试)拆分作为索引数组,您的模型将在训练索引上进行训练并为测试索引生成分数。跨度>

标签: python scikit-learn cross-validation


【解决方案1】:

这是正确的方法。通常,您应该只使用训练数据来训练您的模型。 因此,test_set 在交叉验证过程中应该保持不可见,即通过模型的超参数,否则您可能会通过添加来自测试样本的知识来使从模型获得的结果产生偏差。

我得到了 (X_train, y_train) 的交叉验证平均绝对误差 (MAE),对吗?

是的,cross_val_score 显示的错误将仅来自训练数据。 所以想法是,一旦你对cross_val_score 的结果感到满意,你就可以用整个训练集拟合最终模型,并对y_test 进行预测。为此,您可以使用sklearn.metrics。例如,如果你想获得MAE

from sklearn.metrics import mean_absolute_error as mae
accuracy = mae(y_test, y_pred)

【讨论】:

  • 谢谢!我真正需要的是一种方法来明确获取从交叉验证创建的每个模型的统计信息。为此,我只是这样做了:“kf = KFold(n_splits=n_splits)”并循环遍历它以获得原始 X_train、y_train 的分裂和平:“for train_index, test_index in kf.split(X_train)... " 之后,对于每个“model.fit”,我使用了你的 mae(y_test, y_pred)。
  • 那是另一个问题@maicon。我建议您创建另一个帖子来询问这个问题。不要忘记投票/接受这个答案,它对你有帮助,谢谢!
  • 嗨@yatu,我认为在执行交叉验证时,应该将整个数据输入到模型中,而不仅仅是训练集。
【解决方案2】:

试试这个:

(假设你有数据 x,y 并且数据已经拟合了 fit(x,y)

from sklearn import linear_model
from sklearn.model_selection import cross_val_score
reg = linear_model.LinearRegression()
scoring = 'neg_mean_absolute_error'
mae = cross_val_score(reg, x, y, cv=5,scoring=scoring)
mae

【讨论】:

    猜你喜欢
    • 2014-02-22
    • 2016-06-12
    • 2019-09-11
    • 2015-12-11
    • 2016-04-25
    • 2017-09-02
    • 2012-01-07
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多