F1分数可以为零吗?

数据挖掘 分类 表现 公制 混淆矩阵 f1score
2021-10-07 05:02:54

正如F1 score Wikipedia中提到的那样,'F1 score 在 1 处达到其最佳值(完美的精度和召回率),在 0 处达到最差值'

提到的最坏情况是什么?

在此处输入图像描述

即使我们考虑以下情况:无论是精度还是召回率都是 0整个F1 分数值变得未定义。因为当精度召回率为0 时,阳性值应为 0。当真阳性值变为 0 时,精度召回率都变为 0。

4个回答

F1 永远不会为零,但对于坏分类器来说非常接近于零。如果 TP 或 TN 为零,则无需检查 F1。

这是维基百科的错误。

F1因为调和平均值仅在实数处定义。R或者RC可能等于 0 以防万一=0. 这提供了未定义的结果F1=00.

它不能完全为零我们只需要一种(只有一种)精度。或者回忆为零以使 f1 = 零,但两者都以“tp”作为分子。

#### Will be Nan
y_test = np.array([0,0,1,1])
y_pred = np.array([0,1,0,0])

from sklearn.metrics import confusion_matrix
tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel()
precision = tp/(tp+tn)
recall = tp/(tp+fn)
f1 = 2*precision*recall/(precision+recall)
print(f1)

#### Can be ~0 with a specific case, with this data
y_test = np.hstack((np.zeros((1,2)),np.ones((1,1000000))))
y_pred = np.hstack((np.ones((1,1)),np.zeros((1,1000000)),np.ones((1,1))))
tn, fp, fn, tp = confusion_matrix(y_test[0], y_pred[0]).ravel()
precision = tp/(tp+tn)
recall = tp/(tp+fn)
f1 = 2*precision*recall/(precision+recall)
print('{0:1.6f}'.format(f1))

0.000002

如果我们按照公式,当精度或召回率中至少一个为零时(不管另一个为零或未定义),它实际上可以为零。查看精度、召回率和 F1 的公式:

通过查看 F1 公式,当 TP 为零(导致 Prec 和 Rec 为 0 或未定义)且 FP + FN > 0 时,F1 可以为零。由于 FP 和 FN 都是非负数,这意味着 F1 可以在三种情况下为零:

1- TP = FP = 0 ^ FN > 0,

2- TP = FN = 0 ^ FP > 0,

3- TP = 0 ^ FP > 0 ^ FN > 0。

在第一种情况下,Prec 未定义,Rec 为零。在第二种情况下,Prec 为零且 Rec 未定义,在最后一种情况下,Prec 和 Rec 均为零。