【发布时间】:2019-04-22 05:27:03
【问题描述】:
我正在从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_* 指标以使这种翻转变得不必要,我正在使用neg_log_loss。该问题讨论了mse,但这些论点似乎也适用于log_loss。有没有办法让cross_val_score 返回与其参数中指定的相同的指标?或者这是我应该提交的错误?还是我的误解和符号更改仍然可以期待cross_val_score?
我希望这对 SO 来说是一个足够具体的问题。 Sklearn devs 将用户重定向到 SO 以解决不明确的错误报告或功能要求的问题。
在 cmets 中为每个请求添加最少的重现代码(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])。
【问题讨论】:
-
您能否展示完整的代码以及可能在
model.score()时重现正分数的一些数据?我无法在 scikit-learn 内置数据集上复制它。 -
完整代码在github.com/piccolbo/rightload branch basilica ML代码在ml.py 共享数据比较复杂,运行代码需要访问Web服务。我需要想出一些更独立的东西来进行更实际的复制。
-
生成正分数的代码非常简单,在 ml.py:127 和以下行中。 model.fit(X,y) 后跟 model.score(X,y),差不多。我希望我得到了你的问题——当然,我还欠你一些完整的复制数据。
-
得到了复制,但它需要与数据共享两个泡菜。有没有一种首选的方式来做到这一点?
-
将repro 替换为独立且快速的repro。不过,它看起来不再像一个简单的标志翻转了。
标签: scikit-learn cross-validation loss-function