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

Confusion matrix subset of classes not working properly

我在网上搜索了这个问题的答案,包括在写标题时的建议,但仍然无济于事,希望有人能提供帮助!

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

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

以下工作正常:

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

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

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

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

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

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

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 必须包含在子集中......尽管如此,我还是尝试了不同的组合来解决同一个问题!

我对这个答案进行了高低搜索,非常感谢您的帮助,因为它非常令人沮丧。任何更多 code/information 我可以提供 我会很乐意!!

非常感谢!

发生这种情况是因为您试图对生成的混淆矩阵进行子集化,但实际上您必须使用指定的 class 标签手动生成新的混淆矩阵。如果你 classes A, B, C 你会得到一个 3X3 矩阵。如果要创建仅关注 class A 的矩阵,其他 classes 将变为 false class,但 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 生成混淆矩阵。