为什么sklearn中的cross_val_score会翻转指标的值?

时间:2018-11-19 19:48:16

标签: scikit-learn cross-validation loss-function

我正在使用sklearn中的模型。

LogisticRegressionCV(
        solver="sag", scoring="neg_log_loss", verbose=0, n_jobs=-1, cv=10
    )

拟合结果得出model.score(在训练集上)为0.67,并且发生变化。由于无法(或我不知道如何)访问作为模型拟合的一部分执行的交叉验证的结果,因此我使用

在同一模型上作为单独的交叉验证运行
cross_val_score(model, X, y, cv=10, scoring="neg_log_loss")

这将返回一个负数数组

[-0.69517214 -0.69211235 -0.64173978 -0.66429986 -0.77126878 -0.65127196
 -0.66302393 -0.65916281 -0.66893633 -0.67605681]

如果符号被翻转,它将在与训练得分兼容的范围内。 我已经在issue中阅读了有关cross_val_score翻转给定计分函数符号的讨论,并且该解决方案似乎正在引入neg_*度量标准,以使这种翻转变得不必要,并且我正在使用{{1} }。这个问题讨论的是neg_log_loss,但这些论点似乎也适用于mse。有没有办法让log_loss返回与其参数中指定的指标相同的指标?还是这是我应该提出的错误?还是cross_val_score仍会出现我误会和标志更改的情况?

我希望这对于SO是一个足够具体的问题。 cross_val_score开发人员将用户重定向到SO,以解决不是明确的错误报告或功能要求的问题。

在注释中为每个请求添加最少的repro代码(sklearn v 0.19.1 python 2.7):

Sklearn

使用此代码,它看起来不再像是该指标的简单符号翻转。分数的输出为0.59,交叉验证分数的输出为from numpy.random import randn, seed from sklearn.linear_model import LogisticRegressionCV from sklearn.model_selection import cross_val_score seed (0) X = randn(100,2) y = randn(100)>0 model = LogisticRegressionCV( solver="sag", scoring="neg_log_loss", verbose=0, n_jobs=-1, cv=10 ) model.fit(X=X, y=y) model.score(X,y) cross_val_score(model, X, y, cv=10, scoring="neg_log_loss")

1 个答案:

答案 0 :(得分:2)

注意:在卓有成效的注释线程之后使用Vivek Kumarpiccolbo编辑。

关于LinearRegressionCV score方法的奇怪结果

您发现了一个错误,该错误已在版本0.20.0中修复。

来自changelog

  

修复:修复了linear_model.LogisticRegressionCV中的一个错误,该错误中的得分方法始终计算准确性,而不是计分参数给出的度量。 #10998,作者:托马斯·范。

此外,sklearn的0.19 LogisticRegressionCV documentation说:

  

得分(X,y,sample_weight =无)

     

返回给定测试数据和标签的平均准确度

0.20.0版本开始,docs的错误修正如下:

  

得分(X,y,sample_weight =无)

     

在给定的测试数据和标签上使用评分选项返回得分


关于cross_val_score中返回的负值

cross_val_score翻转errorloss度量的结果值,同时保留score度量的符号。来自documentation

  

所有计分器对象均遵循以下约定:较高的返回值比较低的返回值更好。因此,用于度量模型与数据之间距离的度量(如metrics.mean_squared_error)可以作为neg_mean_squared_error来使用,该度量返回度量的取反值。