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'=tp
、fn'=fp
、fp'=fn
、tp'=tn
。
如果你想
F1'=F1
。我们有 tp/(tp+(fn+fp)/2)=tp'/(tp'+(fn'+fp')/2)=tn/(tn+(fn+fp)/2)
。当且仅当 tp=tn
.
满足
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'=tp
、fn'=fp
、fp'=fn
、tp'=tn
。
如果你想
F1'=F1
。我们有 tp/(tp+(fn+fp)/2)=tp'/(tp'+(fn'+fp')/2)=tn/(tn+(fn+fp)/2)
。当且仅当 tp=tn
.