概念讲解
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()