衡量机器学习模型的三大指标:准确率、精度和召回率。
倾向于使用准确率,是因为熟悉它的定义,而不是因为它是评估模型的最佳工具! 精度(查准率)和召回率(查全率)等指标对衡量机器学习的模型性能是非常基本的,特别是在不平衡分布数据集的案例中,在周志华教授的「西瓜书」中就特别详细地介绍了这些概念。
什么是分布不平衡的数据集?
倘若某人声称创建了一个能够识别登上飞机的恐怖分子的模型,并且准确率(accuracy)高达 99%。你相信吗?好了,有这么一个模型:将从美国机场起飞的所有乘客简单地标注为非恐怖分子。已知美国全年平均有 8 亿人次的乘客,并且在 2000-2017 年间共发现了 19 名恐怖分子,这个模型达到了接近完美的准确率——99.9999999%。尽管这个模型拥有接近完美的准确率,但是在这个问题中准确率显然不是一个合适的度量指标。
恐怖分子检测是一个不平衡的分类问题:我们需要鉴别的类别有两个——恐怖分子和非恐怖分子,其中一个类别代表了极大多数的数据点。
另一个不平衡分类问题出现在当疾病在公众中的发病率很低时的疾病监测。在这两种情况下,正例类别——疾病或恐怖分子,远远少于负例类别的数量。这种问题是数据科学中比较常见的例子,其中准确率并不是评估模型性能的很好的衡量标准。
直观地说,我们应该聚焦于正例(恐怖分子)的识别。
一、召回率
我们应该最大化的是统计学上称为召回率或查全率(recall)的衡量指标,或者是最大化模型找到数据集中所有相关案例的能力。
召回率=真正例/(真正例+假反例)。也就是正确判为恐怖分子占实际所有恐怖分子的比例。
你可能注意到了这个等式中的一些细节:如果我们将所有的个体都预测为恐怖分子,那么模型的召回率就是 1.0!因为预测所有人都是恐怖分子,自然包括了恐怖分子。分号上面terrorists correctly identified=全部恐怖分子数。分母terrorists incorrectly labeled as not terrorists=0。
这样我们就得到了一个完美的模型吗?
当然,不是!在我们想要最大化的指标之间存在一个权衡。在召回率的例子中,当召回率增大时,精度会减小。同样,将 100% 的乘客标记为恐怖分子的模型可能是不可用的。 统计学为我们提供了表达直觉的词汇:这个新的模型是低精度(precision)的,或者说较低的仅识别相关数据点的能力。
二、精度
精度=真正例/(真正例+假正例):也就是在所有判为恐怖分子中,真正的恐怖分子的比例。
现在我们可以看到,第一个模型给所有的个体标上了非恐怖分子的标签,这个模型是不能使用的。尽管它有着近乎完美的准确率,但是它的精度和召回率都是零,因为没有 TP(真正例)!
假设我们轻微地修改一下模型,然后将一个个体正确地识别为恐怖分子。现在,精度是 1(没有假正例,FP),但是召回率很低,因为实际上会有很多假反例(FN)。
假设我们走到了另一个极端,将所有的乘客标记为恐怖分子,召回率就会是 1——我们将抓住每一个恐怖分子,但是精度会特别低,我们最终会拘留很多无辜的人。换言之,随着精度的增加,召回率会降低,反之亦然。
三、精度—召回率权衡
1. 结合精度和召回率
在某些情况中,我们也许需要以牺牲另一个指标为代价来最大化精度或者召回率。
例如,在之前的例子中,在对患者进行随访检查的初步疾病筛查中,我们可能希望得到接近于 1 的召回率—我们想找到所有实际患病的患者。
如果随访检查的代价不是很高,我们可以接受较低的精度。然而,如果我们想要找到精度和召回率的最佳组合,我们可以使用 F1 score 来对两者进行结合。
2. 可视化精度和召回率
(1)混淆矩阵(confusion matrix):给定一个模型的预测标签时,它可以被用来快速计算精度和召回率。
二分类的混淆矩阵总共包含四个不同的结果:真正例(TP)、假正例(FP)、真反例(TN),以及假反例(FN)。
列表示真实值,行表示预测值。行和列的交叉点指的就是这四种结果。例如,如果我们将一个数据点预测为正例,但是它实际上是反例,那么这就是一个假正例。
(2)受试者特征曲线(ROC 曲线,Receiver Operating Characteristic curve):
ROC 曲线展示了当改变在模型中识别为正例的阈值时,召回率和精度的关系会如何变化。
为了将某个病人标记为患有某种疾病(一个正例标签),我们为每种疾病在这个范围内设置一个阈值,通过改变这个阈值,我们可以尝试实现合适的精度和召回率之间的平衡。如果我们有一个用来识别疾病的模型,我们的模型可能会为每一种疾病输出介于 0 到 1 之间的一个分数,为了将某个病人标记为患有某种疾病(一个正例标签),我们为每种疾病在这个范围内设置一个阈值,通过改变这个阈值,我们可以尝试实现合适的精度和召回率之间的平衡。
ROC 曲线在 Y 轴上画出了真正例率(TPR),在 X 轴上画出了假正例率 (FPR)。TPR 是召回率,FPR 是反例被报告为正例的概率。这两者都可以通过混淆矩阵计算得到。
1. 选择最佳的诊断界限值。ROC曲线越靠近左上角,试验的准确性就越高。最靠近左上角的ROC曲线的点是错误最少的最好阈值,其假阳性和假阴性的总数最少
2. 两种或两种以上不同诊断试验对算法性能的比较。在对同一种算法的两种或两种以上诊断方法进行比较时,可将各试验的ROC曲线绘制到同一坐标中,以直观地鉴别优劣,靠近左上角的ROC曲线所代表的受试者工作最准确。亦可通过分别计算各个试验的ROC曲线下的面积(AUC)进行比较,哪一种试验的 AUC最大,则哪一种试验的诊断价值最佳。
在阈值为 1.0 的情况下,我们将位于图的左下方,因为没有将任何数据点识别为正例,这导致没有真正例,也没有假正例(TPR = FPR = 0)。当降低阈值时,我们将更多的数据点识别为正例,导致更多的真正例,但也有更多的假正例 ( TPR 和 FPR 增加)。最终,在阈值 0.0 处,我们将所有数据点识别为正,并发现位于 ROC 曲线的右上角 ( TPR = FPR = 1.0 )。
举例:
假设我们手上有60个正样本,40个负样本,我们要找出所有的正样本,系统查找出50个,其中只有40个是真正的正样本,计算上述各指标。
- TP: 将正类预测为正类数 40
- FN: 将正类预测为负类数 20
- FP: 将负类预测为正类数 10
- TN: 将负类预测为负类数 30
准确率(accuracy) = 预测对的/所有 = (TP+TN)/(TP+FN+FP+TN) = 70%
精确率(precision) = TP/(TP+FP) = 80%
召回率(recall) = TP/(TP+FN) = 2/3
总结:
对于二分类问题:
-
真正例(TP):实际上是正例的数据点被标记为正例
-
假正例(FP):实际上是反例的数据点被标记为正例
-
真反例(TN):实际上是反例的数据点被标记为反例
-
假反例(FN):实际上是正例的数据点被标记为反例
召回率和精度衡量指标:
-
召回率(R):分类模型识别所有相关实例的能力
-
精度(P):分类模型仅仅返回相关实例的能力
-
F1 score:使用调和平均结合召回率和精度的指标
召回率和精度的可视化:
-
混淆矩阵:展示分类模型的真实和预测标签的对应结果。
-
受试者特征曲线(ROC 曲线):画出真正例率(TPR)和假正例率(FPR),并将此作为模型归类正例阈值的函数。
-
曲线下面积(AUC):基于 ROC 曲线下方的面积,计算分类模型总体性能的指标。