二分类混淆矩阵

概念讲解

x = local_labels[idx]
y = predicted[idx]

x是原本的标签,y是预测的标签
在这里插入图片描述
首字母T,F,表示模型是否预测正确(T表示正确)
次字母N,P,表示预测成了阴性还是阳性(一般认为1是阳性)

代码实现

test_dataset = TensorDataset(Test_data, Test_label)
test_cm_gen = DataLoader(test_dataset, batch_size=Batch_size, shuffle=False)

cm_test = np.array([[0, 0 ], [0, 0 ]])
print(type(cm_test))
print(cm_test.shape)

with torch.set_grad_enabled(False):
  for local_batch, local_labels in test_cm_gen:
    # Transfer to GPU
    local_batch, local_labels = local_batch.float().to(device), local_labels.long().to(device)

    outputs = model(local_batch)
    _, predicted = torch.max(outputs.data, 1)
    for idx in range(len(local_batch)):
      x = local_labels[idx]
      y = predicted[idx]#纵轴为预测值
      cm_test[x][y] += 1
print("绘制矩阵")
print('\n', cm_test)
tn = cm_test[0][0]
fn = cm_test[1][0]
fp = cm_test[0][1]
tp = cm_test[1][1]

pre = tp / (tp + fp) #精确率
recall = tp / (tp + fn) #召回率,又称 :敏感度
tnr = tn/(tn + fp) #特异度
acc = (tp + tn)/(tp + fp + tn + fn) 
F1 = (2*(pre * recall))/(pre + recall)

print("pre, recall,   acc,        tnr, F1")
print(pre, recall, acc, tnr, F1)

绘制热力图

#confusion_matrix
import numpy as np
import matplotlib.pyplot as plt
classes = ['0','1']
confusion_matrix = cm_test

plt.imshow(confusion_matrix, interpolation='nearest', cmap=plt.cm.Blues)  #按照像素显示出矩阵
plt.title('confusion_matrix')
plt.colorbar()
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes)
plt.yticks(tick_marks, classes)

thresh = confusion_matrix.max() / 2.
#iters = [[i,j] for i in range(len(classes)) for j in range((classes))]
#ij配对,遍历矩阵迭代器
iters = np.reshape([[[i,j] for j in range(2)] for i in range(2)],(confusion_matrix.size,2))
for i, j in iters:
    plt.text(j, i, format(confusion_matrix[i, j]))   #显示对应的数字

plt.ylabel('Real label')
plt.xlabel('Prediction')
plt.tight_layout()
plt.show()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HJ33_/article/details/120586242