机器学习模型评价指标整理
如何量化机器学习的模型性能?本文整理了机器学习模型性能度量指标,主要是我对这些指标的一些思考。这里说的“性能”指模型泛化(即预测)能力 performance,不是指在机器上运行消耗资源的多少。
1. recall & precision
最常见的指标有recall(召回率,查全率),precision(查准率)。“召回”一词来自制造业,比如某款汽车售卖到市场上后发现有安全问题需要回收,关心有没有把所有有问题的汽车都找到回收了,以及有没有误回收[1]。
另外还有准确率、精确率的叫法,各个地方翻译得不一样,中文的“博大精深”,在这里增加了不必要的麻烦,比如accuracy网络上大多称准确率,周志华《机器学习》书中称为“精度”,而网络上是将precision称为精确率。精确率、准确率本身也不够见名知义,本文将用英文单词叙述。我读研时是做程序静态分析的,用工具查找程序缺陷,在这个领域用的指标是漏报率(false negative rate)和误报率(false discovery rate,注意不叫 false positive rate),漏报率就是1-recall,误报率是1-precision,这两个名称能够见名知义。
维基百科上这张图总结得很全[2],红框中是常用的指标。
吐槽下图中的名称“第一类错误”、“第二类错误”,我最初是在大学上概率论课时见到它们的,有道选择题问某某错误是第一类还是第二类错误,到现在我也没记住哪个指false negative,哪个指false positive,也不想记住了,这个在编程中叫magic number。高数里类似反人类的还有“第一类间断点”、“第二类间端点”,“第一型积分”、“第二型积分”。
1.1 F1
比较两个模型性能时,往往其中一个的recall相对较高而precision相对较低,这也可以理解,召回的多了,可能增加误召回的几率。如果非要比较两个模型不可呢?就需要用一个指标比较两者,F1就是这样产生的。
F1定义为recall和precision的调和平均数,一个自然的问题就是为什么选择调和平均数而不是普通的平均数?甚至为什么不是平方平均数(也叫RMS, root mean square)、几何平均数?其实还真有用几何平均数的,上面图片中的 Fowlkes–Mallows index [3] 就是。这四种平均数我记得在高中学的,有个平均数不等式,不过一直没有记住哪个是哪个以及大小关系,在之后的工作中时常会碰到它们,比如音频audio level需要算PCM的平方平均数;评估视频编码效果的PSNR指标需要算残差的平方平均数。
问AI得知有个统一的形式叫“幂平均数”,这样就好记了。定义如下,值域在x和y之间,p越大,值越大。
- p趋近负无穷时是min(x, y)
- p取-1是调和平均数;
- p趋近0时是 $1^\infty $型极限,结果是几何平均数,求极限过程可以问下AI;
- p取1时是算术平均数;
- p取2时是平方平均数;
- p趋近正无穷时是max(x, y)。
这就明白了为什么用调和平均数或几何平均数,它们“偏向”于较小值,如果其中一个是0,结果则是0,而p大于0的平均数不是这样。
至于F1和Fowlkes–Mallows index的适用场景,网上只是说前者适用于分类(有监督),后者适用于聚类(无监督),不知道为什么,问了AI也只是一直说what没说why。这个问题 Why is the F-measure preferred for classification tasks? 下的回答认为是靠经验,我也赞同,没有太多理由,选择哪个指标主观性挺大的,这两个函数的图像长得差不多,只不过F1更“偏向”较小值,看起来更“瘦”一点。
这两幅图像是用ECharts画的,可以点击进去拖动旋转着看,如丝般顺滑,比Python plot UI上更好看,常见的图可以替代MATLAB了,值得一提的是,这个是国产的为数不多的优秀开源项目。
最后,F1可扩展到F-$\alpha$,$\alpha$代表precision和recall的权重比例,我觉得这个主观性比较大。
1.2 P-R曲线
P-R曲线的纵轴、横轴是precision、recall,如何获得这么多点呢?下面这篇文章[4]说得很清楚,我转载过来。两个指标越大越好,曲线围成的面积越大越好。
Inst#是样本序号,图中有20个样本。Class是ground truth 标签,p是positive样本(正例),n当然就是negative(负例) score是我的分类器对于该样本属于正例的可能性的打分。因为一般模型输出的不是0,1的标注,而是小数,相当于置信度。 然后设置一个从高到低的阈值y,大于等于阈值y的被我正式标注为正例,小于阈值y的被我正式标注为负例。 显然,我设置n个阈值,我就能得到n种标注结果,评判我的模型好不好使。 比如阈值0.9,只有第一个样本被我判断为正例,那么我的查准率precision就是100%,但是查全率recall就是10%。 阈值0.1,所有样本都被我判断为正例,查全率是100%,查准率就是50% 最后我能得到若干对precision,recall值(P,R) : (1, 0.1),… ,(0.5,1),将这若干对花在图上,再连接起来就是这个pr曲线了
2. recall & specificity
recall和precision没有考虑 true negative 的数量,它适用于大多数是negative(阴性)的场景,比如对一个社区的居民做肿瘤筛查,大多数人是健康的;对网民发布的内容做安全审核,大部分内容是安全的。而有的场景positive和negative量级差不多,可以用 specificity(true negative rate) 代替 precision 作为性能指标。
2.1 ROC曲线
ROC (Receiver operating characteristic) 曲线考虑的是 recall 和 specificity,但它定义的纵轴、横轴是recall、false positve rate(即 1 - specificity),我第一眼看到ROC曲线不太习惯,它是“反过来”画的,如果横轴是specificity,也就是把x变为1-x,沿x=1/2轴对称变换下,就和P-R曲线一样自然了。而且我觉得specificity和recall才是对应的,表示两个类别各自判别正确的比例,ROC适用于positive和negative“平等”的场景。
曲线下方的面积AUC (area under curve) 即积分的含义、曲线绘制方法和P-R曲线类似就不多说了。将上面的例子画出两个曲线,为了便于对比,第二个是Specificity-Recall曲线,与ROC曲线等价。P-R曲线往往不是单调的,而ROC是单调的,可以实操算下数据理解。
3. multi-class与multi-label模型
上面说的都是二分类任务,结果只有positive和negative,现实中常遇到 multi-class(多分类)任务,比如判断一张动物图片是猫、狗还是猪。评价方法可以看下[5] ,简而言之就是平等对待每类(与ROC类似),“降维”到二分类上,还是用上面的方法。每个分类指标计算后可以使用 macro-average(宏平均)最终算出一个分数,如果类别不均可加权。
还有multi-label(多标签)任务,比如判断一篇文章的类型,可能同时有“算法”、“存储”、“操作系统”几个标签。参考 [6] 。
参考资料:
[1] 汽车召回 https://www.samrdprc.org.cn/qczh/gnzhqc/
[2] 性能度量指标表格 https://en.wikipedia.org/wiki/Precision_and_recall#Definition
[3] 综述类 Classification assessment methods https://www.emerald.com/insight/content/doi/10.1016/j.aci.2018.08.003/full/html
[4] P-R曲线点的获取 https://cloud.tencent.com/developer/article/2039361
[5] multi-class https://zhuanlan.zhihu.com/p/147663370
[6] multi-label https://zhuanlan.zhihu.com/p/270458779
[7] 谷歌机器学习教程:https://developers.google.com/machine-learning/crash-course?hl=zh-cn
[8] 声压 https://en.wikipedia.org/wiki/Sound_pressure#Sound_pressure_level
[9] PCM audio level https://datatracker.ietf.org/doc/html/rfc6465#appendix-A.1