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

Posted

技术标签:

【中文标题】如何计算多标签分类的 F1 分数?【英文标题】:How To Calculate F1-Score For Multilabel Classification? 【发布时间】:2018-03-25 18:21:41 【问题描述】:

我尝试计算 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:召回率和 F 分数定义不明确,在没有真实样本的标签中设置为 0.0。”

【问题讨论】:

【参考方案1】:

如果你稍微加一下数据就可以了:

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。

由于precision_scorerecall_scoreweighted 参数下都不为零,因此f1_score 存在。由于示例中缺少信息,我认为您的案例无效。

【讨论】:

嗨,我的数组与 np.zeros((1,5)) 的形状为 (1,5) 我刚刚写了一条评论以举例说明一个示例的外观,但它实际上是形式像这样 [[1,0,0,0,0]...]。问题是 f1_score 适用于 average="micro"/"macro" 但不适用于“weighted”。所以我的问题是“加权”选项是否不适用于多标签,或者我是否必须在 f1_score 函数中设置其他选项,如标签/pos_label。 请阅读答案。您不能使用形状为 (1, 5) 的目标变量。在这种情况下,您的 f1_score 即使使用“微观”或“宏观”平均也无法工作。 当我使用 ravel 获取形状 (5,) 时,它使用一个值作为一个样本,因此它不适用于多标签,例如当我用 average="samples" 尝试这个形状时,我收到错误“基于样本的精度、召回率、fscore 在多标签分类之外没有意义。”我得到了微观和宏观形状 (1,5) 的工作结果(它们是正确的)唯一的问题是选项 average="weighted" 尝试将数据相加。这将导致正确计算指标。 @E.Z.你能看看这个问题吗:***.com/questions/59195168/…

以上是关于如何计算多标签分类的 F1 分数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sklearn.metrics 计算多标签分类任务的微观/宏观度量?

scikit-learn 在多标签分类中计算 F1

Sklearn多分类 手写数字多分类 混淆矩阵 F1 多标签分类器 多输出分类器

Tensorflow Precision, Recall, F1 - 多标签分类

为多类多标签分类构建混淆矩阵

多分类SVM损失函数: Multiclass SVM loss