【问题标题】:Metrics Calculation for Multilabel Classification Problem多标签分类问题的度量计算
【发布时间】:2021-09-04 09:30:51
【问题描述】:

我需要了解这个函数如何解决多标签问题。

我尝试计算准确性以达到相同的结果,但我做不到。 它是如何工作的?

这个数据集中有4个标签,y_array是真实的,y_pred是预测的数组。 y是这样的; [0,1,1,1], [1,0,0,0] ...

tp = 0
tn = 0
fn = 0
fp = 0
for i in range(len(y_array)):
    for j in range(4) :
        #True
        if ( y_array[i][j] == 1 ) and (y_pred[i][j]  == 1  ) :
            tp = tp + 1
        elif ( y_array[i][j] == 0 ) and (y_pred[i][j]  == 0  ) :
            tn = tn + 1
        #False
        elif ( y_array[i][j] == 0 ) and (y_pred[i][j]  == 1  ) :
            fn = fn + 1
        elif ( y_array[i][j] == 1 ) and (y_pred[i][j]  == 0  ) :
            fp = fp + 1
ac = (tp+tn)/(tp+tn+fp+fn)
print("Accuracy", ac) 
print('Accuracy: {0}'.format(accuracy_score(y_array, y_pred)))

它们彼此不同,我如何计算这个多标签问题的准确性或其他指标? 使用 sklearn 准确度指标有错吗?

准确度 0.9068711367973193

准确度:0.7134998676125521

【问题讨论】:

  • 我不明白y = [0,1,1,1]。可以取多个值吗?
  • y 是一个所有元素都有 4 个值的数组。这个问题是一个多标签分类问题。
  • @MonkeyDLuffy 想象一个人脸识别算法,它想查看视频中是否出现了卢卡斯、梅西、约翰和克里斯蒂娜。该算法将返回一个数组 y=[0, 1, 1, 1] 在 Macy、John 和 Christina(如果我们尊重我之前提到的人的先前顺序)实际出现在视频中的情况下,但 Lucas 没有t.

标签: pandas scikit-learn


【解决方案1】:

根据scikit-learn documentation for accuracy_score

对于多标签分类,此函数计算子集精度: 为样本预测的标签集必须完全匹配 y_true 中对应的标签集

这意味着每个标签看起来都类似于[0,0,1,0],并且对于一个单个正需要相同的匹配(因此 y_pred 也需要是[0,0,1,0]),以及任何不是t [0,0,1,0] 将导致 single 否定。

在您的手动功能中,您分别计算每个部分匹配: 如果 y_true 是 [0,0,1,0] 并且 y_pred 是 [0,1,0,0],则将其视为 2 个真阴性(位置 0 和 3)、1 个假阳性(位置 1)和 1 个假阴性(位置 2)。使用您用于准确度的公式,这将得到ac = (0+2)/(0+2+1+1),它提供 50% 的准确度,而sklearn.metrics.accuracy_score 将为 0%。

如果要手动复制 scikit-learn accuracy_score,则需要先检查 y_array[i] 的每个成员,然后才将其标记为 TP、TN、FP、FN 之一。

但是,由于您与多标签分类不一致,根据上面的链接,您可能需要查看 sklearn.metrics.jaccard_scoresklearn.metrics.hamming_losssklearn.metrics.zero_one_loss

【讨论】:

  • 谢谢你,这非常解释。我对准确性变得如此清楚。那么多标签问题中的其他指标是如何计算的呢?例如,f1 分数的召回率是如何计算的?我可以使用这段代码中的 tp tn fp fn 值吗?
  • @ŞevvalKahraman 我鼓励您查看scikit-learn.org/stable/modules/…(尤其是“3.3.2.9.2。多类和多标签分类”)。似乎这些指标是针对每个标签单独计算的,然后可以使用不同的方法进行总体平均(所有这些都在我提供的链接中进行了更详细的解释)。我应该指出一个更正,当标签不是互斥的(即当单个数据点可以有多个标签时)时,您的方法可能很有用
  • @ŞevvalKahraman 值得注意的是,如果您使用分类报告,这将按类别分解精度、召回率、f1 分数并包括平均值。
  • 谢谢你,这很有帮助,我尝试计算每个标签 f1_score 并取它们的平均值,结果不一样。这适用于所有 sklearn.metrics.f1_score(y_true=y_array, y_pred=y_pred, average='samples') 循环 -> sklearn.metrics.f1_score(y_true=y_array[:,i], y_pred=y_pred[:,i ]) 然后 /4,, 不一样 :(
  • @ŞevvalKahraman 我必须承认我可能超出了我的理解范围,但您似乎想要做的是average='macro'(即计算每个标签的指标,然后取平均值)。 'samples' 计算每个实例的指标,然后取平均值。您可以查看有关微观和宏观平均之间差异的 DataScience Stack 答案:datascience.stackexchange.com/questions/15989/…
猜你喜欢
  • 2020-11-26
  • 2016-08-05
  • 1970-01-01
  • 2020-07-06
  • 2020-10-02
  • 2017-06-26
  • 2011-09-28
  • 2018-03-25
  • 2022-12-10
相关资源
最近更新 更多