当前位置: 首页 > 知识库问答 >
问题:

Tensorflow,多标签混淆矩阵

钦景胜
2023-03-14

我试图弄清楚如何使用神经网络为多标签分类任务生成混淆矩阵。我之前设法使用函数“交集”计算准确性,因为对此我不关心任何排序。

intersection = tf.sets.set_intersection(predictions, labels)

然而,为了计算混淆矩阵,我确实关心预测/标签的索引顺序。由于标签的值始终相同(1,1或0.5,0.5),因此不可能按照较高/较低的值进行排序。

我想知道:

1)是否可以为多标签分类任务计算混淆矩阵?

2) 这将如何实施?

3)你如何处理预测两个标签都失败的情况?因为不可能知道哪个混淆属于哪个预测。

4) 函数tf排序背后的逻辑是什么。nn。top\u k()

下面我展示了我试图使用的代码示例。

import numpy as np
import tensorflow as tf
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix

Z = np.array([[7.0, 3.0, 5.0, 1.0, 0.0, 6.0],[2.0, 3.0, 4.0, 1.0, 3.25, 2.2], [2.0 , 5.0, 1.0, 7.0, 0.0, 8.0]])
Y = np.array([[0.5, 0, 0, 0.0, 0, 0.5],[0, 0.0, 0.5, 0, 0.5, 0], [0,0,0,0.5,0,0.5]])

_, predicted_softmax = tf.nn.top_k(tf.nn.softmax(Z), k = 2, sorted = False)
_ , labels = tf.nn.top_k(Y, k = 2, sorted = False)

with tf.Session() as sess:
    # reshape to (6,1) because there is 2 correct values per sample(2*3)
    print(predicted_softmax.eval().reshape(6,1))
    print(labels.eval().reshape(6,1))
    predicted = predicted_softmax.eval().reshape(6,1)
    labels_idx = labels.eval().reshape(6,1)

class_labels = np.arange(6)
cnf_matrix_train = confusion_matrix(labels_idx, predicted, labels = class_labels)

print(cnf_matrix_train)

我真的不明白为什么predicted\u softmax的输出是:

[[5] [0] [4] [2] [3] [5]] , 

在过去的两个任期里,我一直在期待着[5][3]。此输出没有任何逻辑。在文档中,如果认为排序=False,他们没有指定任何关于排序的内容,但我希望有一些一致的行为。

感谢任何帮助!


共有1个答案

宋飞掣
2023-03-14
  1. 是否可以为多html" target="_blank">标签分类任务计算混淆矩阵?

是和否。您只能为每个类计算TN(真阴性)、TP(真阳性)、FN(假阴性)、FP(假阳性)矩阵,并基于此导出一些其他度量。它不会向您显示一个特定的类是如何被误分类为另一个特定的类的,但只会显示它是如何被误分类的以及如何被误分类的(FN或FP)。

您可以简单地使用TensorFlow附加包中的MultiLabelConfusionMatrix。它为您提供了:每个类的2x2矩阵,包含TN、TP、FN和FP。

请注意,当前的实现似乎假设y\u pred和y\u true是二进制张量,即仅由0和1组成(转换为int)。

确切地你不能。

文件上说:

如果true则生成的k元素将按值降序排序。

例如,tf.nn.top_k([10, 3, 1, 11], k=3)可以返回[10,3,11](无顺序)。

排序时,tf.nn.top_k([10, 3, 1, 11], k=3)返回[11,10,3](降序)。

(为了清楚起见,请忽略一秒钟,它当然会返回张量,而不是常规列表)

 类似资料:
  • 我正在对实际数据和来自分类器的预测数据进行多标签分类。实际数据包括三类(c1、c2和c3),同样,预测数据也包括三类(c1、c2和c3)。数据如下 在多标签分类中,文档可能属于多个类别。在上述数据中,1表示文档属于特定类,0表示文档不属于特定类。 第一行Actual\u数据表示文档属于c1类和c2类,不属于c3类。类似地,第一行predicted\u数据表示文档属于类别c1、c2和c3。 最初我使

  • 我正在使用分类器的多类多标签输出。类的总数为14,实例可以关联多个类。例如: 我现在制作混淆矩阵的方式: 输出如下: 现在,我不确定sklearn的混淆矩阵是否能够处理多标签多类数据。谁能帮我一下吗?

  • 我正在y_test并y_pred混淆矩阵。我的数据用于多标签分类,因此行值是一种热编码。 我的数据有30个标签,但在输入混淆矩阵后,输出只有11行和列,这让我很困惑。我想我应该有一辆30X30的。 它们的格式是numpy数组。(y\u test和y\u pred是我使用dataframe.values将其转换为numpy数组的数据帧) y\U测试。形状 y_test y\u预测。形状 y\u预测

  • 我需要计算表示为多个热向量的标签和预测的混淆矩阵。sklearn似乎不支持这种情况。 这是我所拥有的一个例子。假设有三个类,和;目标/标签为: 因此,我们有标签矩阵: 预测是: 预测矩阵为: 我希望输出是一个混淆矩阵,大致如下所示: 我使用来估计分类精度。然而,尽管正在为此类标签的准确性而工作,但混淆矩阵不支持上述场景。是否有任何替代? 另一个问题似乎给出了三个混淆矩阵,这不是我要寻找的情况。

  • 我得到了混淆矩阵,但是因为我的实际数据集有很多分类类别,所以很难理解。 范例- 但是如何打印标签/列名以便更好地理解呢? 我甚至试过这个- 需要帮忙吗?

  • 假设我有一个具有n个级别的因子变量y,我有预测和实际结果。如何构造混淆矩阵? 对于n=2的情况,这个问题已经得到了回答。看见 R:如何为预测模型制作混淆矩阵? 我试过的 这就是我能走多远 现在这必须以矩阵的形式呈现。 出身背景 混淆矩阵具有水平标签“实际类别”和垂直标签“预测类别”。矩阵元素的计数如下所示: 元素(1,1)=实际类的计数数为A,预测类的计数数为A 元素(1,2)=实际类别为A,预测