一文带你搞懂sklearn.metrics混淆矩阵

一般的二分类任务需要的评价指标有4个

  • accuracy
  • precision
  • recall
  • f1-score

四个指标的计算公式如下

accuracy = \frac{TP+TN}{TP+TN+FP+FN}

precision=\frac{TP}{TP+FP}

recall=\frac{TP}{TP+FN}

 F_1-score=\frac{2*precision*recall}{precision+recall}

计算这些指标要涉及到下面这四个概念,而它们又构成了混淆矩阵

  • TP (True Positive)
  • FP (False Positive)
  • TN (True Negative)
  • FN (False Negative)
混淆矩阵 预测值
0 1
实际值 0 TN FP
1 FN TP

这里我给出的混淆矩阵是按照sklearn-metrics-confusion_matrix的形式绘制的。

Negative中文译作阴性,一般指标签0;Positive中文译作阳性,一般指标签1。

True中文译作预测正确;False中文译作预测错误。

TN  预测正确(True)并且预测值为阴性(Negative)即实际值和预测值均为0

TP  预测正确(True)并且预测值为阳性(Positive)即实际值和预测值均为1

FN  预测错误(False)并且预测值为阴性(Negative)即实际值为1,预测值为0

FP  预测错误(False)并且预测值为阳性(Positive)即实际值为0,预测值为1

下面以实际代码为例进行介绍

from sklearn import metrics
print(metrics.confusion_matrix(y_true=[0, 0, 0, 1, 1, 1],
    y_pred=[1, 1, 1, 0, 1, 0]))

这里的y_true是实际值,y_pred是预测值,可以观察到

TN=0,没有样本实际值和预测值同时为0

TP=1,只有第5个样本实际值和预测值均为1

FN=2,第4,6个样本实际值为1且预测值为0

FP=3,第1,2,3个样本实际值为0且预测值为1

输出结果也和我们观察的一致

[[0 3]
 [2 1]]

编写函数根据混淆矩阵计算 accuracy, precision, recall, f1-score

def cal(array):
    tp = array[1][1]
    tn = array[0][0]
    fp = array[0][1]
    fn = array[1][0]
    a = (tp+tn)/(tp+tn+fp+fn)
    p = tp/(tp+fp)
    r = tp/(tp+fn)
    f = 2*p*r/(p+r)
    print(a,p,r,f)

使用编写的函数cal计算该混淆矩阵的四项指标,并与metric自带的分类报告(classification_report)函数的结果进行比较,这里第三个参数digits=4表示保留4位小数

cal([[0, 3],[2, 1]])
print(metrics.classification_report(y_true=[0, 0, 0, 1, 1, 1], y_pred=[1, 1, 1, 0, 1, 0], digits=4))

运行结果如下,可以发现两者的计算结果一致。

0.16666666666666666 0.25 0.3333333333333333 0.28571428571428575
              precision    recall  f1-score   support

           0     0.0000    0.0000    0.0000         3
           1     0.2500    0.3333    0.2857         3

    accuracy                         0.1667         6
   macro avg     0.1250    0.1667    0.1429         6
weighted avg     0.1250    0.1667    0.1429         6

这里需要补充说明一下,为什么0那一行和1那一行都有precision, recall, f1-score。

一般来说,我们通常计算的这三项指标均是把1视为阳性,把0视为阴性,以1作为研究对象。所以1那一行的三项指标的值和cal函数计算的结果一致。而0那一行表示把0作为研究对象。

猜你喜欢

转载自blog.csdn.net/qq_42276781/article/details/127953974