类的混淆矩阵子集无法正常工作

时间:2019-06-14 21:01:58

标签: machine-learning scikit-learn confusion-matrix

enter image description here enter image description here我已经在互联网上搜索了此问题的答案,包括撰写标题时的建议,但仍无济于事,希望有人可以提供帮助!

我正在尝试使用sci-kit学习构建混淆矩阵。这是基于keras模型的。

这很奇怪,因为我遇到以下问题:对于原始数据的训练和测试集...我可以按如下方式构造混淆矩阵(请注意,这是一个多标签问题,因此数据必须成为不同标签的子集。

以下工作正常:

cm = confusion_matrix(y_train[:,0:6].argmax(axis=1), trainpred[:,0:6].argmax(axis=1))

和6:18等...,直到所有类都成为子集。结果形成的混淆矩阵反映了keras模型的真实结果。

当我在完全看不见的数据上部署模型时,就会出现问题。

我通过调用model.predict()来部署模型,并如上所述获得结果。但是,现在我不能以相同的方式对混淆矩阵进行子集化。

代码cm = confusion_matrix等...即使指定0:6等,也会导致CM的输出尺寸错误。

因此,我使用了上面使用的代码,但修改了labels参数:

age[0,1,2,3,4]
organ[5,6,7,8]

cm = confusion_matrix(y_train[:,0:6].argmax(axis=1), trainpred[:,0:6].argmax(axis=1), labels=age)

第一个标签(1:5)可以正常工作...但是,下一个标签则不行!我在混淆矩阵中没有得到正确的值,并且匹配对于那里的矩阵也是不正确的。

将其放在上下文中:看不见的测试数据中有超过400个样本。

model.predict对大多数标签显示非常高的分类和正确分数。

调用CM = ytest [:,4:8] etc确实会生成4x4矩阵,但是其中有5个值,而不是400,并且其中的值没有正确匹配。

..另外,标签年龄为012345,将ytest设置为0:6会导致形成正确的混淆矩阵(我不确定为什么6必须包含在子集中...尽管如此,我已经尝试过同一问题的不同组合!

我一直在高低搜寻这个答案,因此非常感谢您的协助,因为它令人沮丧。我可以提供的任何其他代码/信息都将很高兴!!

非常感谢!

1 个答案:

答案 0 :(得分:0)

之所以发生这种情况,是因为您试图对生成的混淆矩阵进行子集化,但是实际上您必须使用指定的类标签手动生成一个新的混淆矩阵。如果您对A, B, C进行分类,则将获得3X3矩阵。如果要创建仅关注类A的矩阵,则其他类将成为false类,但是false positivefalse negative会发生变化,因此您不能仅采样初始矩阵。

这就是您实际显示的方式

import matplotlib.pytplot as plt
import seaborn as sns

def generate_matrix(y_true, predict, class_name):
    TP, FP, FN, TN = 0, 0, 0, 0
    for i in range(len(y_true)):
        if y_true[i] == class_name:
            if y_true[i] == predict[i]:
                TP += 1
            else:
                FN += 1
        else:
            if y_true[i] == predict[i]:
                TN += 1
            else:
                FP += 1
    return np.array([[TP, FP],
                     [FN, TN]])

# Plot new matrix
matrix = generate_matrix(actual_labels, 
                         predicted_labels, 
                         class_name = 'A')

这将为class A生成一个混淆矩阵。