1 前言
在前面谈逻辑归回的时候我们介绍了什么是混淆矩阵以及如何通过混淆矩阵来计算分类任务中常见的评估指标,包括准确率(Accuracy)、精确率(Precision)、召回率(Recall)和值。但是当时我们在介绍的时候只是介绍了二分类情况下的混淆矩阵以及计算方法。但是在多分类场景中,我们通常也会采用召回率或者值来作为评价指标。在接下来的这篇文章中,笔者将会对多分类场景中四项评估指标的计算进行介绍。
2 分类评估指标
在正式介绍多分类评估指标是,我们先来通过二分类任务巩固一下对于混淆矩阵的理解。
2.1 二分类任务
假定现在有一个二分类的任务,其中0
表示positive,1
表示negative。同时有如下所示的标签值和预测值:
xxxxxxxxxx
21y_true = [1, 0, 0, 0, 1, 1, 0, 0, 0, 0]
2y_pred = [1, 1, 1, 1, 1, 0, 0, 0, 0, 1]
2.1.1 混淆矩阵
由此,我们便能得到如下所示的一个混淆矩阵:
如何来读这个混淆矩阵呢?读的时候首先横向看,然后再纵向看。例如,读TP的时候,首先横向表示真实的正样本,其次是纵向表示预测的正样本,因此TP表示的就是将正样本预测为正样本,即预测正确。因此有:
- True Positive(TP):表示将正样本预测为正样本,即预测正确;
- False Negative(FN):表示将正样本预测为负样本,即预测错误;
- False Positive(FP):表示将负样本预测为正样本,即预测错误;
- True Negative(TN):表示将负样本预测为负样本,即预测正确;
那如果此时突然问你FP表示什么含义,又该怎么迅速的反映出来呢?我们知道FP(False Positive)从字面意思来看表示的是错误的正类,也就是说实际上它并不是正类,而是错误的正类,即实际上为负类。因此,FP表示的就是将负样本预测为正样本的含义。再看一个FN,其字面意思为错误的负类,也就是说实际上它表示的是正类,因此FN的含义就是将正样本预测为负样本。
2.1.2 指标定义
注:当中时称为值,同时也是用得最多的值。
可以看出准确率是最容易理解,即所有预测对的数量,除以总的数量。同时还可以看到,精确率计算的是预测对的正样本在整个预测为正样本中的比重,而召回率计算的是预测对的正样本在整个真实正样本中的比重。因此一般来说,召回率越高也就意味着这个模型寻找正样本的能力越强(例如在判断是否为癌细胞的时候,寻找正样本癌细胞的能力就十分重要),而则是精确率与召回率的调和平均。但值得注意的是,通常在绝大多数任务中并不会明确哪一类别是正样本,哪一类别又是负样本,所以对于每个类别来说都可以计算其各项指标(但是准确率只有一个):
- 准确率:
- 对于正样本
0
来说:
- 对于负样本
1
来说:
那如果我们要来衡量整体的精确率与召回率或者是值又该怎么处理呢?对于整体的评估值,常见的做法有两种:第一种是取算术平均;第二种是加权平均。
(1)算术平均
所谓算术平均就是等权重的对各类别的评估值进行累加求和。例如对于上述两个类别来说,其精确率、召回率和值分别为:
(2)加权平均
所谓加权平均就是以不同的加权方式来对各类别的评估值进行累加求和。这里我们只介绍一种用得最多的加权方式,即按照各类别样本数在总样本中的占比来进行加权。对于上述结果来说,加权后的精确率、召回率和值分别为:
2.2 多分类任务
假设有如下三分类任务的预测值与真实值:
xxxxxxxxxx
21y_true = [1, 1, 1, 0, 0, 0, 2, 2, 2, 2]
2y_pred = [1, 0, 0, 0, 2, 1, 0, 0, 2, 2]
2.2.1 混淆矩阵
根据上面的结果,我们可以得到如下所示的一个混淆矩阵:
由于是多分类,所以也就不止positive和negative了,那这个表该怎么读呢?方法还是同上面的一样,先横向看再总想看。例如第一个1
(淡绿色单元格),表示的就是将真实值0预测为0的个数(预测正确);接着右边的1
表示的就是将真实值0预测为1的个数;淡绿色单元格中的1表示的就是将真实值1预测为1的个数;淡绿色单元格中的2表示的就是将真实值2预测为2的个数。也就是说只有这个对角线上的值才表示模型预测正确的样本的数量。
2.2.2 指标计算
下面我们来开始对每个类别的各项指标进行一个计算。因为准确率只有一个,所以先来对其进行计算:
对于类别
0
来说:在上面我们说到,精确率计算的是预测对的正样本在整个预测为正样本中的比重。根据图2可知,对于类别
0
来说,预测对的正样本(类别0
)数量为1,而整个预测为正样本的数量为5。因此,类别0
对于的精确率为:同时,召回率计算的是预测对的正样本在整个真实正样本中的比重。根据图2可知,对于类别
0
来说,预测对的正样本(类别0
)数量为1,而整个真实正样本0
的个数为3(图2中第二行的3个1)。因此,对于类别0
来说其召回率为:因此,其值为:
对于类别
1
来说:对于类别
1
来说,预测对的正样本(类别1
)的数量为1,而整个预测为类别1
的样本数量为2。因此,其精确率为:同理,其召回率和值分别为:
对于类别
2
来说:
最后,对于三个类别来说其加权后的准确率、召回率和值分别为:
(1)算术平均
(2)加权平均
3 实现
对于这部分的代码实现,从上面的计算过程可以发现,最重要的就是要计算得到这个混淆矩阵。但其实这部分代码在之前的一篇文章中就已经介绍过了,在此就不重复。同时,我们可以直接借助sklearn中的classification_report
模块来完成所有的计算过程。
xxxxxxxxxx
151from sklearn.metrics import classification_report
2y_true = [1, 1, 1, 0, 0, 0, 2, 2, 2, 2]
3y_pred = [1, 0, 0, 0, 2, 1, 0, 0, 2, 2]
4print(classification_report(y_true, y_pred))
5
6# 输出结果:
7 precision recall f1-score support
8
9 0 0.20 0.33 0.25 3
10 1 0.50 0.33 0.40 3
11 2 0.67 0.50 0.57 4
12
13 accuracy 0.40 10
14 macro avg 0.46 0.39 0.41 10
15weighted avg 0.48 0.40 0.42 10
从结果可以看出,该模块对于每个类别的3项指标都进行了计算。同时,最后两行计算的就是各项指标的平均值,其中macro avg就是算术平均,而weighted avg就是上面介绍的加权平均。
4 总结
在这篇文章中,我们首先是回顾了二分类任务场景下的混淆矩阵,并且同时还重温了个各项指标的意义和计算公式;接着,笔者介绍了在多分类任务下的混淆矩阵以及对应各项指标的计算方法;最后还示例了如何通过sklearn中的classification_report
模块来完成所有的计算过程。
本次内容就到此结束,感谢您的阅读!如果你觉得上述内容对你有所帮助,欢迎关注并传播本公众号!若有任何疑问与建议,请添加笔者微信'nulls8'加群进行交流。青山不改,绿水长流,我们月来客栈见!
引用
[1]https://scikit-learn.org/stable/modules/model_evaluation.html#precision-recall-f-measure-metrics