如何计算多标签分类的 F1 分数?

9

我尝试计算f1_score,但是当我使用sklearn的f1_score方法时,对于某些情况我会收到一些警告。

我有一个多标签5类问题需要进行预测。

import numpy as np
from sklearn.metrics import f1_score

y_true = np.zeros((1,5))
y_true[0,0] = 1 # => label = [[1, 0, 0, 0, 0]]

y_pred = np.zeros((1,5))
y_pred[:] = 1 # => prediction = [[1, 1, 1, 1, 1]]

result_1 = f1_score(y_true=y_true, y_pred=y_pred, labels=None, average="weighted")

print(result_1) # prints 1.0

result_2 = f1_score(y_true=y_ture, y_pred=y_pred, labels=None, average="weighted")

print(result_2) # prints: (1.0, 1.0, 1.0, None) for precision/recall/fbeta_score/support

当我使用average="samples"而不是"weighted"时,我得到(0.1, 1.0, 0.1818..., None)。这个"weighted"选项对于多标签问题无用吗?还是我该如何正确使用f1_score方法?
当我使用average="weighted"时,也会收到警告:

"UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples."

1个回答

15

如果稍微增加一些数据,它就能起作用:

y_true = np.array([[1,0,0,0], [1,1,0,0], [1,1,1,1]])
y_pred = np.array([[1,0,0,0], [1,1,1,0], [1,1,1,1]])

recall_score(y_true=y_true, y_pred=y_pred, average='weighted')
>>> 1.0
precision_score(y_true=y_true, y_pred=y_pred, average='weighted')
>>> 0.9285714285714286

f1_score(y_true=y_true, y_pred=y_pred, average='weighted')
>>> 0.95238095238095244

数据表明我们没有错过任何真正的阳性,并且没有预测出任何假阴性 (recall_score 等于1)。然而,在第二个观测中,我们预测了一个假阳性,导致 precision_score 等于 ~0.93。

由于参数 weightedprecision_scorerecall_score 都不为零,因此存在 f1_score。我认为你的案例由于示例中缺乏信息是无效的。


嗨,我的数组使用np.zeros((1,5))创建,形状为(1,5)。我刚刚写了一条注释,以便举例说明一个样本的外观,但实际上它的形式是这样的[[1,0,0,0,0]...]。问题在于f1_score函数可以使用average="micro"/"macro"选项,但不能使用"weighted"选项。所以我的问题是,"weighted"选项是否不适用于多标签,或者我需要设置其他选项,如f1_score函数中的labels/pos_label。 - KyleReemoN-
请阅读答案。您无法使用形状为(1,5)的目标变量进行工作。在这种情况下,即使使用“micro”或“macro”平均值,您的f1_score也无法正常工作。 - E.Z
当我使用ravel获取形状为(5,)时,它将一个值用作一个样本,因此对于多标签不起作用,例如,当我尝试使用average="sample"和这个形状时,我会得到错误信息“基于样本的精度,召回率,fscore在多标签分类之外没有意义。” 对于微观和宏观,我可以获得形状为(1,5)的工作结果(它们是正确的),唯一的问题是average="weighted"选项。 - KyleReemoN-
尝试累加数据。这将导致指标被正确计算。 - E.Z
@E.Z. 你可以看一下这个问题吗:https://stackoverflow.com/questions/59195168/multilabel-multiclass-accuracy-how-to-calculate-accuracy-for-multiclass-mult - Aaditya Ura

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接