F1 分数取决于哪个 class 被赋予正面标签?

F1 scores depend on which class is given the positive label?

f1 分数真的取决于哪个 class 被赋予正面标签吗?

当我使用 scikit learn 的 f1 指标时,似乎:

>>> from sklearn import metrics as m
>>> m.f1_score([0,0,0,1,1,1],[0,0,0,1,1,0])
0.8
>>> m.f1_score([1,1,1,0,0,0],[1,1,1,0,0,1])
0.8571428571428571

第一种情况和第二种情况的唯一区别是0和1被调换了。但是我得到了不同的答案。

这看起来真的很糟糕。这意味着如果我报告 cat/dog classifier 的 f1 分数,该值取决于猫或狗是否获得正标签。

这是真的吗,还是我搞砸了什么?

对于多类分类,您应该使用 cross-entropy 度量。交叉熵对于重新标记是不变的。通过重新标记,您只是对求和中的项重新排序。

如果你想使用 f1 分数,你必须使用 F 分数,请注意,当且仅当真阳性的数量等于真阴性的数量时,标签交换才是不变的。

在你的例子中,我看到了 3 个真阴性,2 个真阳性。如果我删除一个真阴性,我们在交换标签后会有相同的 F1 分数。

m.f1_score([1,1,0,0,1],[1,1,0,0,0]) # 0.8
m.f1_score([0,0,1,1,0],[0,0,1,1,1]) # 0.8

数学

让我们从 [Wikipedia F-score page] 中的一个公式开始,以跳过一些步骤。

其中tp是真阳性率,fn是假阴性率。 我将使用 ' 来表示交换标签的度量。

通过交换标签,我们有 tn'=tpfn'=fpfp'=fntp'=tn

如果你想 F1'=F1。我们有 tp/(tp+(fn+fp)/2)=tp'/(tp'+(fn'+fp')/2)=tn/(tn+(fn+fp)/2)。当且仅当 tp=tn.

满足