代码之家  ›  专栏  ›  技术社区  ›  piccolbo

为什么sklearn中的cross-val-u分数会翻转度量值?

  •  0
  • piccolbo  · 技术社区  · 7 年前

    我想把这个模型从 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 关于交叉得分翻转给定得分函数的符号,解决方案似乎是 neg_* 我们引入了一些指标,使这种翻转变得不必要,我正在使用 neg_log_loss . 这个问题涉及到 mse 但这些论点似乎适用于 log_loss 也。有没有办法 cross_val_score 是否返回其参数中指定的相同度量值?或者这是我应该提交的bug?或者是我的误解和标志的改变仍然是可以期待的 十字记分法 ?

    我希望这是一个足够具体的问题。 Sklearn devs将用户重定向到so,以解决那些不明确的bug报告或功能需求的问题。

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

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

    有了这段代码,它看起来不再像是度量标准的简单符号翻转。分数输出为0.59,并且 array([-0.70578452, -0.68773683, -0.68627652, -0.69731349, -0.69198876, -0.70089103, -0.69476663, -0.68279466, -0.70066003, -0.68532253]) 交叉验证分数。

    1 回复  |  直到 7 年前
        1
  •  1
  •   dataista    7 年前

    注:在富有成效的评论线后编辑 Vivek Kumar 和 piccolbo .

    关于线性回归 score 方法的奇怪结果

    你发现了一个错误,在版本中修复了 0.20.0 .

    从 changelog :

    修复:修复了linear_model.logisticregressioncv中的错误,其中score方法总是计算精度,而不是由评分参数给出的度量。 #10998 托马斯·范。

    此外,sklearn的0.19逻辑回归cv documentation 说:

    得分(x,y,样本重量=无)

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

    来自版本时 0.20.0 , the docs 用错误修复程序更新:

    得分(x,y,样本重量=无)

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


    关于返回的负值 cross_val_score

    交叉值得分 翻转结果值 error 或 loss 度量,同时保留 分数 韵律学。从 documentation :

    所有记分器对象都遵循这样的惯例:返回值越高越好。因此,度量模型和数据之间距离的度量,如metrics.mean_squared_error,可用作neg_mean_squared_error,返回度量的负值。

    推荐文章