二分类结果评价之TP、FP、TN、FN及准确率、精确率、召回率、F1得分的计算方式和python代码实现

1 混淆矩阵

  混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。在二分类场景里是一个2×2的矩阵,如下图所示:
  其中:

  • TP(True Positive):真正例,真值和预测值都是正例
  • FP(False Positive):假正例,真值是负例,预测值是正例
  • FN(False Negative):假负例,真值是正例,预测值是负例
  • TN(True Negative):真负例,真值和预测值都是负例
      
  • 2 常见指标

      在统计完二分类的结果后,还有一些常见的指标,用于对分类结果进行分析。这些指标包括:

      上述指标中,前四个直接通过混淆矩阵的统计结果进行计算即可,最后两个可以画出图来,计算的是曲线面积。对于前四个指标,其定义分别为:

  • Accuracy(准确率):对于给定的测试数据集,分类器正确分类的样本数与总样本数之比。
  • Precision(精确率):预测为正的样本中有多少是真正的正样本,它是针对我们预测结果而言的。Precision又称为查准率。
  • Recall(召回率):样本中的正例有多少被预测正确了, 它是针对我们原来的样本而言的。Recall又称为查全率。
  • F1:在上表中,P表示Precision,R表示Recall。F1得分相当于精确率和召回率的调和平均值,其中最佳值为1.0,最差值为0.0。
      
  • 3 实现代码

      下面是混淆矩阵和常见评价指标的计算代码:

    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计算方式

    来源:zeeq_

    物联沃分享整理
    物联沃-IOTWORD物联网 » 二分类结果评价之TP、FP、TN、FN及准确率、精确率、召回率、F1得分的计算方式和python代码实现

    发表评论