【问题标题】:F1 scores depend on which class is given the positive label?F1 分数取决于哪个班级被给予正面标签?
【发布时间】:2022-01-16 09:23:00
【问题描述】:

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

当我使用 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 交换了。但我得到了不同的答案。

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

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

【问题讨论】:

  • 为什么这个问题有 2 票作为“需要细节或明确性”结束?问题很明确,还加了一个minimal reproducible example...
  • 可能是因为这个问题在审稿人的头脑中并不清楚。我不确定,也许 stackoverflow 的评分正在鼓励人们结束问题。我认为有些人看到票数接近并投票立即关闭。不止一次发生这种情况,在我写答案时,问题已关闭。
  • 在这种情况下,该问题将得到因任何原因弄错的人的近距离投票,以及受到影响的人的第二次投票。

标签: python machine-learning scikit-learn


【解决方案1】:

对于多类分类,您应该使用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 页面] 中的一个公式开始,以便跳过一些步骤。

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.

【讨论】:

  • 感谢您的解释!我选择它作为答案。这让我更喜欢 f1 作为衡量标准。不幸的是,我必须使用它。但我也没有看到交叉熵在这里有用。交叉熵可以任意高。
  • 谢谢。你是对的,在标签确定之后,交叉熵没有太大意义。你不是我认识的第一个对 F 分数表达这种感觉的人。
猜你喜欢
  • 2020-08-26
  • 2018-10-08
  • 2020-02-22
  • 2021-05-12
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
相关资源
最近更新 更多