我正在使用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")
。
答案 0 :(得分:2)
注意:在卓有成效的注释线程之后使用Vivek Kumar和piccolbo编辑。
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
翻转error
或loss
度量的结果值,同时保留score
度量的符号。来自documentation:
所有计分器对象均遵循以下约定:较高的返回值比较低的返回值更好。因此,用于度量模型与数据之间距离的度量(如metrics.mean_squared_error)可以作为neg_mean_squared_error来使用,该度量返回度量的取反值。