类 的混淆矩阵子集无法正常工作
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 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
生成混淆矩阵。
我正在尝试使用 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 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
生成混淆矩阵。