sklearn.metrics.mean_squared_error越大越好(否定)?

时间:2018-01-13 20:55:13

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

一般来说,mean_squared_error越小越好。

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

  

所有得分手对象都遵循更高回报值的惯例   比低回报值更好。因此衡量的指标   模型和数据之间的距离,如   metrics.mean_squared_error,可用作neg_mean_squared_error   返回指标的否定值。

enter image description here

但是,如果我转到: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,即越小越好。

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

3 个答案:

答案 0 :(得分:16)

实际函数"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; precision_score'或者' f1_score',得分越高越好,但在损失(错误)的情况下,得分越低越好。要以相同的方式处理它们,它会返回否定值。

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

所以,你没有错过任何东西。您只需要处理要使用损失函数的场景。如果您只想计算mean_squared_error,则只能使用mean_squared_error。但是,如果您想使用它来调整模型,或者使用scikit中的实用程序进行cross_validate,请使用'neg_mean_squared_error'

也许添加一些有关的细节,我会解释更多。

答案 1 :(得分:0)

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

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

mean squared error

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

答案 2 :(得分:0)

这正是我在尝试解密和澄清rmse报告以理解我的数据的代码时所要寻找的东西。

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

Found 0 images belonging to 0 classes

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

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))