sklearn中评估指标(精度等)的意外行为

时间:2013-10-27 10:46:45

标签: python numpy scikit-learn

from sklearn.metrics import precision_score
a = [ 1, 2, 1, 1, 2 ]
b = [ 1, 2, 2, 1, 1 ]

print precision_score(a,b, labels = [1])
# 0.6666
print precision_score(a,b, labels = [2])
# 0.5
print precision_score(a,b, labels = [1,2])
# 0.6666

为什么第一个和最后一个案例的值相同?

手动计算,总精度应为3/5 = 0.6。但第三种情况输出0.6666,恰好是第一种情况的值。

编辑1:添加了相关功能的导入路径。

2 个答案:

答案 0 :(得分:1)

你必须告诉precision_score它应该计算精度的标签。您所看到的是标签1的精确度:

>>> precision_score(a, b)
0.66666666666666663
>>> precision_score(a, b, pos_label=1)
0.66666666666666663

但是你想要标签2的精度:

>>> precision_score(a, b, pos_label=2)
0.5

答案 1 :(得分:1)

请参阅此处(http://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_score.html#sklearn.metrics.precision_score)以获取文档。我认为您需要将 average 参数更改为 micro 以获得指定标签的整体精度,即:。

print precision_score(a,b, labels = [1,2], average='micro')

平均值的默认值为加权,它计算指定标签上的精度加权平均值。如果您使用 micro ,根据文档,它会计算所有真实和误报的精确度(可能 all 表示所有指定的标签,但文档不清楚这个)。我想这就是你想要的?我无法检查这个,因为我不知道你正在使用哪个版本的 scikit