一般的二分类任务需要的评价指标有4个
- accuracy
- precision
- recall
- f1-score
四个指标的计算公式如下
计算这些指标要涉及到下面这四个概念,而它们又构成了混淆矩阵
- TP (True Positive)
- FP (False Positive)
- TN (True Negative)
- FN (False Negative)
这里我给出的混淆矩阵是按照sklearn-metrics-confusion_matrix的形式绘制的。
Negative中文译作阴性,一般指标签0;Positive中文译作阳性,一般指标签1。
True中文译作预测正确;False中文译作预测错误。
TN 预测正确(True)并且实际为阴性(Negative)即实际值和预测值均为Negative
TP 预测正确(True)并且实际为阳性(Positive)即实际值和预测值均为Positive
FN 预测错误(False)并且实际为阴性(Negative)即实际值为Negative,预测值为Positive
FP 预测错误(False)并且实际为阳性(Positive)即实际值为Positive,预测值为Negative
下面以实际代码为例进行介绍
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=3,第1,2,3个样本实际值为0且预测值为1
FP=2,第4,6个样本实际值为1且预测值为0
输出结果也和我们观察的一致
[[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作为研究对象。