正如F1 score Wikipedia中提到的那样,'F1 score 在 1 处达到其最佳值(完美的精度和召回率),在 0 处达到最差值'。
提到的最坏情况是什么?
即使我们考虑以下情况:无论是精度还是召回率都是 0。整个F1 分数值变得未定义。因为当精度或召回率为0 时,真阳性值应为 0。当真阳性值变为 0 时,精度和召回率都变为 0。
正如F1 score Wikipedia中提到的那样,'F1 score 在 1 处达到其最佳值(完美的精度和召回率),在 0 处达到最差值'。
提到的最坏情况是什么?
即使我们考虑以下情况:无论是精度还是召回率都是 0。整个F1 分数值变得未定义。因为当精度或召回率为0 时,真阳性值应为 0。当真阳性值变为 0 时,精度和召回率都变为 0。
F1 永远不会为零,但对于坏分类器来说非常接近于零。如果 TP 或 TN 为零,则无需检查 F1。
这是维基百科的错误。
因为调和平均值仅在正实数处定义。或者可能等于 0 以防万一. 这提供了未定义的结果.
它不能完全为零。我们只需要一种(只有一种)精度。或者回忆为零以使 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 均为零。