【问题标题】:scikit-learn cross validation, negative values with mean squared errorscikit-learn 交叉验证,具有均方误差的负值
【发布时间】:2014-02-22 00:15:19
【问题描述】:

当我将以下代码与大小 (952,144) 的数据矩阵 X 和大小 (952) 的输出向量 y 一起使用时,mean_squared_error 度量返回负值,这是出乎意料的。你有什么想法吗?

from sklearn.svm import SVR
from sklearn import cross_validation as CV

reg = SVR(C=1., epsilon=0.1, kernel='rbf')
scores = CV.cross_val_score(reg, X, y, cv=10, scoring='mean_squared_error')

scores 中的所有值都是负数。

【问题讨论】:

  • 是的,这应该会发生。我忘记了确切的原因,但我相信这与他们在执行网格搜索时最小化结果有关。实际的 MSE 只是你得到的数字的正数。
  • 可能与sklearn GridSearchCV with Pipeline 重复——@David 是对的,当引入统一评分 API 时,我们决定始终最大化分数,这意味着需要否定实际为损失的分数。

标签: python regression scikit-learn cross-validation


【解决方案1】:

试图解决这个问题,所以我提供了 David 和 larsmans 在 cmets 部分中雄辩地描述的答案:

是的,这应该会发生。实际的 MSE 只是您得到的数字的正数。

统一评分 API 始终最大化分数,因此需要最小化的分数被取反,以便统一评分 API 正常工作。因此,返回的分数在应该最小化的分数时被否定,如果是应该被最大化的分数,则保留为正数。

sklearn GridSearchCV with Pipeline 中也对此进行了描述。

【讨论】:

  • 谢谢。但是在选择最佳模型时,在选择最佳模型时不会考虑负 MSE。最好的模型只需要正 MSE 中的最小值。有什么办法可以解决这个问题?提前致谢!
  • 谢谢!一个问题,如果我得到 [-44, -33, -22] 作为 mse 分数,只需将它们视为 mse =44, 33, 22 ?
【解决方案2】:

您可以通过将评分方法更改为“neg_mean_squared_error”来修复它,如下所示:

from sklearn.svm import SVR
from sklearn import cross_validation as CV

reg = SVR(C=1., epsilon=0.1, kernel='rbf')
scores = CV.cross_val_score(reg, X, y, cv=10, scoring='neg_mean_squared_error')

【讨论】:

    【解决方案3】:

    要查看可用的评分键,请使用:

    import sklearn
    print(sklearn.metrics.SCORERS.keys())
    

    您可以使用'r2' or 'neg_mean_squared_error'。根据您的要求,有很多选择。

    【讨论】:

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