机器学习/深度学习指标:Precision,Recall 和 Accuracy
- 2019 年 10 月 11 日
- 笔记
分类问题是当前机器学习、深度学习领域最为常见的问题,各式各样的模型种类繁多。
如何评价这些模型的优劣呢?自然要做测试:
- 首先,准备好一些已知其真实分类的样本;
- 然后,用分类模型对它们进行分类;
- 最后,将分类模型预测(predict)或者推断(inference)的结果与实际情况相比较,以预测/推断结果与真实的符合程度为依据来评价分类模型的性能(performance)。
既然要判断程度,就必然会用到能够描述“多少”的数值型指标。今天我们就要介绍几种分类模型最常用的评价指标。
二分类模型的指标
我们先从最基础的二分类模型说起。
所有的二分类模型做预测/推断的结果都只能两个:阳性(Positive,即正例)和阴性(Negative,即负例)。
二分类模型最常用的指标是:精准率(Precision)和召回率(Recall)。
对于一个测试样本,它本身有一个真实分类(阳性或者阴性)。将其输入给二分类模型后,模型会给它打一个标签——要么阳性,要么阴性。
样本的真实分类和预测分类可能一致也可能不一致,总之会形成一个两两正交的情况,如下:
|
预测结果为阳性 (Positive) |
预测结果为阴性 (Negative) |
---|---|---|
预测结果是真实的 (True) |
TP:实际为Positive,也被预测为Positive的样本数 |
TN:实际为Negative,也被预测为Negative的样本数 |
预测结果是虚假的 (False) |
FP:实际为Negative,但被预测为Positive的样本数 |
FN:实际为Positive,但被预测为Negative的样本数 |
精准率:Precision=TP / (TP+FP),即在所有被预测为阳性的测试数据中,真正是阳性的比率。
召回率:Recall=TP / (TP+FN),即在所有实际为阳性的测试数据中,真正是阳性的比率。
为了综合这两个指标并得出量化结果,又发明了F1Score。
F1Score = 2*(Precision * Recall) / (Precision + Recall)
显然上面三个值都是越大越好,但往往在实际当中P和R是矛盾的,很难保证双高。
除了精准率和召回率,还有一个准确率(Accuracy),可以用来评估分类模型。
准确率指分类模型预测正确的结果在整体中的占比例。
Accuracy = 预测正确的样本数 / 所有样本数
二分类模型的Accuracy = (TP+TN) / (TP+TN+FP+FN) = (TP+TN) / Count(Samples)
多分类模型的指标
多分类模型的预测结果有多种类型,而不只是正例(阳性)和负例(阴性)两种。
虽然如此,前面说的Precision,Recall和Accuracy同样适用于多分类问题。
假设一个分类模型能预测N个分类:{Class1, Class2, …, ClassN}.
每一个特定的测试样本都有一个真实的分类,经过模型预测后,又会有一个预测分类。
假设样本x1的真实分类是Class1,它的预测结果有N种可能({Class1, Class2, …, ClassN}中的任何一个)。
但是不管预测结果如何,从预测与真实的符合程度来看,只有两种可能:预测正确(被预测为Class1),和预测错误(被预测为Class1之外的任何一类)。
当一个测试集全部被预测完之后,会有一些实际是Class1的样本被预测为其他类,也会有一些其实不是Class1的样本,被预测成Class1,这样的话就导致了下面这个结果:
|
预测结果为Class1(Positive) |
预测结果为非Class1(Negtive) |
---|---|---|
预测结果是真实的(True) |
Class1_TP:实际为Class1,也被预测为Class1的样本数 |
Class1_TN:实际不是Class1,也被测试为其他类(非Class1)的样本数 |
预测结果是虚假的(False) |
Class1_FP:实际不是Class1,但被预测为Class1的样本数 |
Class1_FN:实际为Class1,但被预测为其他类(非Class1)的样本数 |
根据上表,我们就可以计算:
Class1的精准率:Class1_Precision = Class1_TP/(Class1_TP+Class1_FP),即在所有被预测为Class1的测试数据中,预测正确的比率。
Class1的召回率:Class1_Recall = Class1_TP/(Class1_TP+Class1_FN),即在所有实际为Class1的测试数据中,预测正确的比率。
Class1的F1Score: Class1_F1Score = 2 * (Class1_Precision * Class1_Recall) / (Class1_Precision + Class1_Recall)
同理,Class1的准确率:Class1_Accuracy = (Class1_TP + Class1_TN) / count(Samples)
一个多分类模型指标计算的例子
下面我们用一个例子来说明一下多分类模型的几种指标的计算。具体数据如下表:
|
Actual_Class1 |
Actual_Class2 |
Actual_Class3 |
Total_Precdicted |
---|---|---|---|---|
Predicted_Class1 |
30 |
20 |
10 |
60 |
Predicted_Class2 |
50 |
60 |
10 |
120 |
Predicted_Class3 |
20 |
20 |
80 |
120 |
Total_Actual |
100 |
100 |
100 |
|
可以看出,分类器一共可分出三个类:Class1,Class2和Class3;测试样本一共有300个;测试样本中三个类是平均分布的。
然后,针对这三个类,我们用下面四种颜色分别标注出它们各自对应的TP,TN,FP和FN:
TP |
|
---|---|
TN |
|
FP |
|
FN |
|
Class1 |
Actual_Class1 |
Actual_Class2 |
Actual_Class3 |
---|---|---|---|
Predicted_Class1 |
30 |
20 |
10 |
Predicted_Class2 |
50 |
60 |
10 |
Predicted_Class3 |
20 |
20 |
80 |
Class1_TP = 30
Class1_TN = 60 + 10 + 20 + 80 = 170
Class1_FP = 20 + 10 = 30
Class1_FN = 50 + 30 = 70
Class1_Precision = 30 / 60 = 0.5
Class1_Recall = 30 / 100 = 0.3
Class1_Accurancy = (30 + 170) / 300 = 0.67
Class2 |
Actual_Class1 |
Actual_Class2 |
Actual_Class3 |
---|---|---|---|
Predicted_Class1 |
30 |
20 |
10 |
Predicted_Class2 |
50 |
60 |
10 |
Predicted_Class3 |
20 |
20 |
80 |
Class2_TP = 60
Class2_TN = 30 + 10 + 20 + 80 = 140
Class2_FP = 50 + 10 = 60
Class2_FN = 20 + 20 = 40
Class2_Precision = 60 / 120 = 0.5
Class2_Recall = 60 / 100 = 0.6
Class2_Accurancy = (60 + 140 ) / 300 = 0.67
Class3 |
Actual_Class1 |
Actual_Class2 |
Actual_Class3 |
---|---|---|---|
Predicted_Class1 |
30 |
20 |
10 |
Predicted_Class2 |
50 |
60 |
10 |
Predicted_Class3 |
20 |
20 |
80 |
Class3_TP = 80
Class3_TN = 30 + 20 + 50 + 60 = 160
Class3_FP = 20 + 20 = 40
Class3_FN = 10 + 10 = 20
Class3_Precision = 80 / 120 = 0.67
Class3_Recall = 80 / 100 = 0.8
Class3_Accurancy = (80 + 160) / 300 = 0.8
多分类模型的整体性能
当我们评估一个多分类模型的时候,一般不会用具体某一个类的Precision,Recall或者Accuracy去对其进行评价,而是会用一个数值来代表整体性能。
通常会用到的指标是整体准确率。我们可能会想,整体正确率就是对所有类的Accuracy求均值或者加权求均值。
但是实际上,有一个更直接更方面的方法:
Overall Accuracy = 各类被预测对了的样本数量的累加 / 样本总数 = sum (class_i_TP) / count(Samples)
比如上面的例子里,Overall Accuracy = (30 + 60 + 80) / 300 = 0.57
指标和数据绑定
需要注意的是,所有的性能指标:Precision,Recall,Accuracy等,都和具体的测试数据有关。
同样的模型,换一套测试数据后,很可能某一类,甚至所有类的P,R,A会有所变化。
有变化是一正常的,但如果这种变化超过了一定幅度,就要考虑是否存在bias或者overfitting的情况。