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

Posted

技术标签:

【中文标题】如何使用 sklearn.metrics 计算多标签分类任务的微观/宏观度量?【英文标题】:How do I use sklearn.metrics to compute micro/macro measures for multilabel classification task? 【发布时间】:2016-02-02 20:47:27 【问题描述】:

我有一个多标签分类器产生的结果,我想在 python 中使用sklearn.metrics 计算微观和宏观精度、召回和 F1 分数,但不太清楚如何计算。

我有两个二元稀疏矩阵dataOUTdataGT,它们分别代表同一数据集的分类结果和基本事实。两个矩阵的大小都是nLabels X nSamples。每个样本都可以用一个或多个标签进行标记,因此如果分类器标记为jth 的样本带有ith 标签,则dataOUT[i,j]1,否则0

对于任何给定的类i,我可以通过从dataOUTdataGT 中提取ith 行来轻松计算常规精度、召回率和F-score,可以将它们提供给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

但是我如何计算整个数据集的微观和宏观度量,即如何为(dataOUT,dataGT) 对而不是分别为每个标签?

谢谢!

【问题讨论】:

【参考方案1】:

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

一维数组,或标签指示数组/稀疏矩阵

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

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

另请阅读Multiclass and multilabel classification

【讨论】:

以上是关于如何使用 sklearn.metrics 计算多标签分类任务的微观/宏观度量?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn.metrics 用法详解

计算欧几里得距离时 sklearn.metrics.pairwise_distances_argmin_min 的奇怪结果

sklearn.metrics.roc_curve解析

如何将 sklearn.metrics.classification_report 的输出作为字典?

如何计算相关性分数?

sklearn.metrics.roc_curve 用于多类分类