我已经在互联网上搜索了此问题的答案,包括撰写标题时的建议,但仍无济于事,希望有人可以提供帮助!
我正在尝试使用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必须包含在子集中...尽管如此,我已经尝试过同一问题的不同组合!
我一直在高低搜寻这个答案,因此非常感谢您的协助,因为它令人沮丧。我可以提供的任何其他代码/信息都将很高兴!!
非常感谢!
答案 0 :(得分:0)
之所以发生这种情况,是因为您试图对生成的混淆矩阵进行子集化,但是实际上您必须使用指定的类标签手动生成一个新的混淆矩阵。如果您对A, B, C
进行分类,则将获得3X3矩阵。如果要创建仅关注类A
的矩阵,则其他类将成为false
类,但是false positive
和false 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
生成一个混淆矩阵。