多标签分类问题的度量计算



我需要学习这个函数如何处理多标签问题。

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

该数据集中有4个标签,y_array是实数,y_pred是预测数组。y是这样的;[0,1,1,1],[1,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.713499876125521

根据scikit学习准确性文档_score:

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

这意味着每个标签看起来都像[0,0,1,0],并且对于单曲阳性需要完全匹配(因此y_pred也需要是[0,0,1,0](,而任何不是[0,0,1,0]的标签都将导致歌曲阴性。

在手动功能中,您可以分别计算每个部分匹配:如果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 accurcy_score,你需要首先检查y_array[i]的每个成员,然后将其标记为TP、TN、FP、FN中的一个。

然而,鉴于您正在处理多标签分类,根据上面的链接,您可能需要查看sklearn.metrics.jaccard_score、sklearn.meterics.hamming_loss或sklearn.mmetrics.zero_one_loss

最新更新