【问题标题】:Is sklearn.metrics.mean_squared_error the larger the better (negated)?sklearn.metrics.mean_squared_error 越大越好(否定)吗?
【发布时间】:2018-06-22 23:25:25
【问题描述】:

一般来说,mean_squared_error 越小越好。

当我使用 sklearn 指标包时,它在文档页面中显示:http://scikit-learn.org/stable/modules/model_evaluation.html

所有 scorer 对象都遵循返回值较高的约定 优于较低的返回值。因此,衡量 模型和数据之间的距离,例如 metrics.mean_squared_error,可用作 neg_mean_squared_error 它返回指标的否定值。

但是,如果我去:http://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html#sklearn.metrics.mean_squared_error

说是Mean squared error regression loss,没说是否定的。

如果我查看了源代码并检查了那里的示例:https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/metrics/regression.py#L183 它正在执行正常的mean squared error,即越小越好。

所以我想知道我是否遗漏了有关文档中否定部分的任何内容。谢谢!

【问题讨论】:

    标签: python scikit-learn metrics mean-square-error


    【解决方案1】:

    这是实现您自己的评分对象 [1] 的惯例。它必须是正的,因为您可以创建一个非损失函数来计算自定义的正分数。这意味着通过使用损失函数(对于分数对象),您必须获得负值。

    损失函数的范围是:(optimum) [0. ... +] (e.g. unequal values between y and y')。例如检查均方误差的公式,它总是正的:

    图片来源:http://scikit-learn.org/stable/modules/model_evaluation.html#mean-squared-error

    【讨论】:

      【解决方案2】:

      实际函数"mean_squared_error" 没有任何关于负面部分的内容。但是当你尝试 'neg_mean_squared_error' 时实现的函数将返回分数的否定版本。

      请查看源代码以了解其在the source code中的定义:

      neg_mean_squared_error_scorer = make_scorer(mean_squared_error,
                                              greater_is_better=False)
      

      观察参数greater_is_better是如何设置为False的。

      现在所有这些分数/损失都用于各种其他事物,例如 cross_val_score、cross_val_predict、GridSearchCV 等。例如,在“accuracy_score”或“f1_score”的情况下,分数越高越好,但在损失的情况下(错误),分数越低越好。要以相同的方式处理它们,它会返回负数。

      因此,此实用程序用于以相同方式处理分数和损失,而无需更改特定损失或分数的源代码。

      所以,你没有错过任何东西。您只需要注意要使用损失函数的场景。如果您只想计算 mean_squared_error,则只能使用 mean_squared_error。但是如果你想用它来调整你的模型,或者使用 Scikit 中的工具进行交叉验证,请使用'neg_mean_squared_error'

      也许可以添加一些细节,我会解释更多。

      【讨论】:

      • 所以对于指标和损失,它应该是 'neg_mean_squared_error' ,对吧?
      • @Ben 你能解释一下你的意思吗>
      • 对不起,我忘了补充我的问题是指 Keras 的'model.compile()'
      • 对于负值,“更大”是指幅​​度更大还是幅度更小?传统上,对于负值,更大应该意味着幅度更小,但这里是这种情况吗?
      【解决方案3】:

      这正是我在我的代码中寻找的,我试图破译和澄清 rmse 报告以理解我的数据。

      就我而言,我正在使用这种方法来计算 rmse。我应该如何阅读报告?是越高越好还是相反?

      def rmsle_cv(model):
          kf = KFold(n_folds, random_state=42).get_n_splits(train)
          rmse= np.sqrt(-cross_val_score(model, train, y_train, scoring="neg_mean_squared_error", cv = kf))
          return(rmse)
      
      
      def rmsle(y, y_pred):
          return np.sqrt(mean_squared_error(y, y_pred))
      

      就我而言,我得到了这些结果

      Lasso score(cv): 0.1176 (0.0068)
      ElasticNet score(cv): 0.1177 (0.0068)
      Ridge(01): 0.1270 (0.0097)
      Gradient Boosting score(cv): 0.1443 (0.0109)
      BayRidge(01): 0.1239 (0.0079)
      Kernel Ridge score(cv): 0.1210 (0.0068)
      Xgboost score(cv): 0.1177 (0.0060)
      LGBM score(cv): 0.1158 (0.0064)
      

      【讨论】:

        猜你喜欢
        • 2012-10-03
        • 1970-01-01
        • 2014-05-02
        • 2013-07-30
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        • 1970-01-01
        • 2017-10-15
        相关资源
        最近更新 更多