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

How do I use sklearn.metrics to compute micro/macro measures for multilabel classification task?

我有一个多标签 class 生成器生成的结果,我想使用 python 中的 sklearn.metrics 计算微观和宏观精度、召回率和 F1 分数,但可以完全弄清楚如何。

我有两个二元稀疏矩阵,dataOUTdataGT 分别表示同一数据集的 class 化结果和基本事实。两个矩阵的大小都是 nLabels X nSamples。每个样本都可以用一个或多个标签进行标记,因此如果 class 标识符用 i 第标签标记第 j 个样本,那么 dataOUT[i,j] 就是 1,并且 0 否则。

对于任何给定的 class i,我可以通过从 dataOUT 和 [=15] 中提取第 i 行来轻松计算常规精度、召回率和 F 分数=] 可以将它们喂给 sklearn.metrics.precision_recall_fscore_support,例如像这样:

import numpy as np
from sklearn.metrics import precision_recall_fscore_support

iLabel = 5 # some specific label

yOUT = np.asarray(dataOUT[iLabel,:].todense()).reshape(-1)
yGT = np.asarray(dataGT[iLabel,:].todense()).reshape(-1)

ps,rs,fs,ss = precision_recall_fscore_support(yGT,yOUT)
p = ps[1]   # Precision for iLabel
r = rs[1]   # Recall for iLabel
f1 = fs[1]  # F1 for iLabel

但是我如何计算整个数据集的微观和宏观测量,即如何获得单个微观 (P,R,F) 和单个宏观 (P,R,F) 三元组为 (dataOUT,dataGT) 对而不是分别为每个标签?

谢谢!

scikit-learn 中的大多数指标都支持多标签参数。 sklearn.metrics.precision_recall_fscore_support 如果文档说:

1d array-like, or label indicator array / sparse matrix

你可以只用整个 y 矩阵和地面真实矩阵来提供度量。但是这些矩阵必须具有 [n_samples、n_labels] 的形状,换句话说,该矩阵的每一行都必须对应于同一样本的一组标签,而每一列都对应于某个标签。所以你应该转置你的矩阵。

ps,rs,fs,ss = precision_recall_fscore_support(dataGT.T, dataOUT.T)

另请阅读此文Multiclass and multilabel classification