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

Is sklearn.metrics.mean_squared_error the larger the better (negated)?

一般来说,mean_squared_error是越小越好。

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

All scorer objects follow the convention that higher return values are better than lower return values. Thus metrics which measure the distance between the model and the data, like metrics.mean_squared_error, are available as neg_mean_squared_error which return the negated value of the metric.

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

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

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

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

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

实际函数 "mean_squared_error" 没有任何关于负数部分的信息。但是当您尝试 'neg_mean_squared_error' 时实现的功能将 return 得分的否定版本。

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

neg_mean_squared_error_scorer = make_scorer(mean_squared_error,
                                        greater_is_better=False)

观察参数 greater_is_better 如何设置为 False

现在所有这些 scores/losses 都用于其他各种事物,例如 cross_val_score、cross_val_predict、GridSearchCV 等。例如,在 'accuracy_score' 或 [=33 的情况下=],分数越高越好,但在出现丢失(错误)的情况下,分数越低越好。要以同样的方式处理它们,它 return 是负面的。

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

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

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

这正是我在我的代码中寻找的,我试图破译和澄清 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)

这是一种语义问题。当您使用术语“损失”时,它在很大程度上暗示您希望将其最小化。但是,当您谈论“分数”时,暗示您想要最大化它(例如分类器的准确性)。因此,当对回归模型进行评分时,最大分数意味着最小损失,即最大化负损失。