混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。在二分类场景里是一个2x2的矩阵,如下图所示:
其中:
在统计完二分类的结果后,还有一些常见的指标,用于对分类结果进行分析。这些指标包括:
上述指标中,前四个直接通过混淆矩阵的统计结果进行计算即可,最后两个可以画出图来,计算的是曲线面积。对于前四个指标,其定义分别为:
下面是混淆矩阵和常见评价指标的计算代码:
import numpy as np
# 计算混淆矩阵
def compute_confusion_matrix(precited,expected):
part = precited ^ expected # 对结果进行分类,亦或使得判断正确的为0,判断错误的为1
pcount = np.bincount(part) # 分类结果统计,pcount[0]为0的个数,pcount[1]为1的个数
tp_list = list(precited & expected) # 将TP的计算结果转换为list
fp_list = list(precited & ~expected) # 将FP的计算结果转换为list
tp = tp_list.count(1) # 统计TP的个数
fp = fp_list.count(1) # 统计FP的个数
tn = pcount[0] - tp # 统计TN的个数
fn = pcount[1] - fp # 统计FN的个数
return tp, fp, tn, fn
# 计算常用指标
def compute_indexes(tp, fp, tn, fn):
accuracy = (tp+tn) / (tp+tn+fp+fn) # 准确率
precision = tp / (tp+fp) # 精确率
recall = tp / (tp+fn) # 召回率
F1 = (2*precision*recall) / (precision+recall) # F1
return accuracy, precision, recall, F1
最后,自己制造一点数据对上述代码进行测试,结果如下:
# 测试代码
precited = np.array([1,1,0,0,0,1,0,0,0,0,1,1,0,1,1,0])
expected = np.array([1,0,0,0,1,1,0,1,0,1,1,0,0,0,1,1])
tp, fp, tn, fn = compute_confusion_matrix(precited, expected)
print(f"TP: {tp}")
print(f"FP: {fp}")
print(f"TN: {tn}")
print(f"FN: {fn}")
accuracy, precision, recall, F1 = compute_indexes(tp, fp, tn, fn)
print(f"Accuracy: {accuracy}")
print(f"Precision: {precision}")
print(f"Recall: {recall}")
print(f"F1: {F1}")
# 输出结果
TP: 4
FP: 3
TN: 5
FN: 4
Accuracy: 0.5625
Precision: 0.5714285714285714
Recall: 0.5
F1: 0.5333333333333333
参考链接:
二分类器的常用评价指标
(python+离散)实现TP、TN、FP、FN
深度学习中:准确率,精确率,召回率,F1计算方式