一般的二分类任务需要的评价指标有4个
四个指标的计算公式如下




计算这些指标要涉及到下面这四个概念,而它们又构成了混淆矩阵
| 混淆矩阵 | 预测值 | ||
| 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作为研究对象。