sklearn.metrics.mean_squared_error是越大越好(取反)吗?

37
一般而言,mean_squared_error越小越好。
当我使用sklearn metrics包时,在文档页面上说:
所有得分器对象都遵循高返回值优于低返回值的惯例。因此,像metrics.mean_squared_error这样测量模型与数据之间距离的指标可以作为neg_mean_squared_error使用,它返回指标的否定值。 http://scikit-learn.org/stable/modules/model_evaluation.html 并且 enter image description here 但是,如果我去这里:
它说它是均方误差回归损失,没有说它是否被否定。 http://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html#sklearn.metrics.mean_squared_error

如果我查看源代码并检查其中的示例:https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/metrics/regression.py#L183,它正在执行正常的均方误差,即越小越好。

所以我想知道我是否在文档中错过了否定部分。谢谢!

4个回答

57
实际功能 "mean_squared_error" 并没有涉及到负数部分。但是,当您尝试使用 'neg_mean_squared_error' 时,实现的函数将返回得分的取反版本。
请检查 源代码 中如何定义:
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'
也许添加一些详细信息,我将解释得更多。

1
所以对于指标和损失函数应该是'neg_mean_squared_error',对吗? - Ben
@Ben,你能否详细解释一下你的意思? - Vivek Kumar
抱歉,我忘记提到我的问题涉及Keras的“model.compile()”。 - Ben
2
对于负值,“greater”是指较大的幅度还是较小的幅度?传统上,对于负值,“greater”应该意味着较小的幅度,但在这种情况下是否如此? - roulette01

4

这是一个语义问题。当你使用"loss"这个术语时,它强烈暗示你想要将其最小化。然而,当你谈论"score"时,它暗示着你想要将其最大化(例如分类器的准确性)。因此,在评分回归模型时,最大分数意味着最小损失,即最大化负损失。


1
这是一种实现自己的评分对象[1]的惯例。它必须是正的,因为您可以创建一个非损失函数来计算自定义正分数。这意味着通过使用损失函数(用于得分对象),您必须获得负值。
损失函数的范围为:(最佳)[0. ... +](例如y和y'之间的不等值)。例如,检查均方误差的公式,它始终为正数:

mean squared error

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


1

这正是我在尝试解密和澄清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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接