考虑一个二分问题,即将实例分成正类(positive)或负类(negative)。对一个二分问题来说,会出现四种情况。如果一个实例是正类并且也被 预测成正类,即为真正类(True positive), 如果实例是负类被预测成正类,称之为假正类(False positive)。相应地,如果实例是负类被预测成负类,称之为真负类(True negative), 正类被预测成负类则为假负类(false negative)。
- TP:正确肯定的数目;
- FN:漏报,没有正确找到的匹配的数目;
- FP:误报,给出的匹配是不正确的;
- TN:正确拒绝的非匹配对数;
列联表如下表所示,1 代表正类,0 代表负类:
| | 预测 1 | 预测 0 |
|-|-|-|
| 实际 1| True Positive(TP)| False Negative(FN)|
| 实际 0|False Positive(FP)|True Negative(TN)|
从列联表引入两个新名词。其一是真正类率 (true positive rate ,TPR), 计算公式为
TPR=TP/(TP+FN)
刻画的是分类器所识别出的 正实例占所有正实例的比例。
另外一个是负正类率 (false positive rate, FPR), 计算公式为
FPR=FP/(FP+TN)
计算的是分类器错认为正类的负实例占所有负实例的比例。
还有一个真负类率(True Negative Rate,TNR),也称为 specificity,计算公式为
TNR=TN/(FP+TN)=1−FPR
精确率(正确率)和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量。其中精度是检索出相关文档数与检索出的文档总数的比率,衡量的是检索系统的查准率;召回率是指检索出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检索系统的查全率。
一般来说,Precision 就是检索出来的条目(比如:文档、网页等)有多少是准确的,Recall 就是所有准确的条目有多少被检索出来了,两者的定义分别如下:
- Precision = 提取出的正确信息条数 / 提取出的信息条数
- Recall = 提取出的正确信息条数 / 样本中的信息条数
为了能够评价不同算法的优劣,在 Precision 和 Recall 的基础上提出了 F1 值的概念,来对 Precision 和 Recall 进行整体评价。F1 的定义如下:
- F1值 = 正确率 * 召回率 * 2 / (正确率 + 召回率)
不妨举这样一个例子:
某池塘有 1400 条鲤鱼,300 只虾,300 只鳖。现在以捕鲤鱼为目的。撒一大网,逮着了 700 条鲤鱼,200 只虾,100 只鳖。那么,这些指标分别如下:
- 正确率 = 700 / (700 + 200 + 100) = 70%
- 召回率 = 700 / 1400 = 50%
- F1值 = 70% * 50% * 2 / (70% + 50%) = 58.3%
不妨看看如果把池子里的所有的鲤鱼、虾和鳖都一网打尽,这些指标又有何变化:
- 正确率 = 1400 / (1400 + 300 + 300) = 70%
- 召回率 = 1400 / 1400 = 100%
- F1值 = 70% * 100% * 2 / (70% + 100%) = 82.35%
由此可见,正确率是评估捕获的成果中目标成果所占得比例;召回率,顾名思义,就是从关注领域中,召回目标类别的比例;而 F 值,则是综合这二者指标的评估指标,用于综合反映整体的指标。
当然希望检索结果 Precision 越高越好,同时 Recall 也越高越好,但事实上这两者在某些情况下有矛盾的。比如极端情况下,我们只搜索出了一个结果,且是准确的,那么 Precision 就是 100%,但是 Recall 就很低;而如果我们把所有结果都返回,那么比如 Recall 是 100%,但是 Precision 就会很低。因此在不同的场合中需要自己判断希望 Precision 比较高或是 Recall 比较高。如果是做实验研究,可以绘制 Precision-Recall 曲线来帮助分析。
Precision 和 Recall 指标有时候会出现的矛盾的情况,这样就需要综合考虑他们,最常见的方法就是 F-Measure(又称为 F-Score)。
F-Measure 是 Precision 和 Recall 加权调和平均:
F=(a2+1)P⋅Ra2(P+R)
当参数α=1 时,就是最常见的 F1。因此,F1 综合了 P 和 R 的结果,当 F1 较高时则能说明试验方法比较有效。
ROC(Receiver Operating Characteristic)翻译为 "接受者操作特性曲线"。曲线由两个变量 1-specificity 和 Sensitivity 绘制. 1-specificity=FPR,即负正类率。Sensitivity 即是真正类率,TPR(True positive rate), 反映了正类覆盖程度。这个组合以 1-specificity 对 sensitivity, 即是以代价 (costs) 对收益(benefits)。
此外,ROC 曲线还可以用来计算 "均值平均精度"(mean average precision),这是当你通过改变阈值来选择最好的结果时所得到的平均精度(PPV)。
为了更好地理解 ROC 曲线,我们使用具体的实例来说明:
如在医学诊断中, 判断有病的样本。那么尽量把有病的揪出来是主要任务, 也就是第一个指标 TPR, 要越高越好。而把没病的样本误诊为有病的, 也就是第二个指标 FPR, 要越低越好。
不难发现, 这两个指标之间是相互制约的。如果某个医生对于有病的症状比较敏感, 稍微的小症状都判断为有病, 那么他的第一个指标应该会很高, 但是第二个指标也就相应地变高。最极端的情况下, 他把所有的样本都看做有病, 那么第一个指标达到 1, 第二个指标也为 1。
我们以 FPR 为横轴, TPR 为纵轴, 得到如下 ROC 空间。
我们可以看出, 左上角的点 (TPR=1,FPR=0), 为完美分类, 也就是这个医生医术高明, 诊断全对。点 A(TPR>FPR), 医生 A 的判断大体是正确的。中线上的点 B(TPR=FPR), 也就是医生 B 全都是蒙的, 蒙对一半, 蒙错一半; 下半平面的点 C(TPR<FPR), 这个医生说你有病, 那么你很可能没有病, 医生 C 的话我们要反着听, 为真庸医。上图中一个阈值, 得到一个点。现在我们需要一个独立于阈值的评价指标来衡量这个医生的医术如何, 也就是遍历所有的阈值, 得到 ROC 曲线。
还是一开始的那幅图, 假设如下就是某个医生的诊断统计图, 直线代表阈值。我们遍历所有的阈值, 能够在 ROC 平面上得到如下的 ROC 曲线。
曲线距离左上角越近, 证明分类器效果越好。
如上, 是三条 ROC 曲线, 在 0.23 处取一条直线。那么, 在同样的低 FPR=0.23 的情况下, 红色分类器得到更高的 PTR。也就表明, ROC 越往上, 分类器效果越好。我们用一个标量值 AUC 来量化它。
AUC 值为 ROC 曲线所覆盖的区域面积, 显然, AUC 越大, 分类器分类效果越好。
AUC = 1,是完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。
AUC 的物理意义:假设分类器的输出是样本属于正类的 socre(置信度),则 AUC 的物理意义为,任取一对(正、负)样本,正样本的 score 大于负样本的 score 的概率。
第一种方法: AUC 为 ROC 曲线下的面积, 那我们直接计算面积可得。面积为一个个小的梯形面积之和。计算的精度与阈值的精度有关。
第二种方法: 根据 AUC 的物理意义, 我们计算正样本 score 大于负样本的 score 的概率。取 NM(N 为正样本数, M 为负样本数) 个二元组, 比较 score, 最后得到 AUC。时间复杂度为 O(NM)。
第三种方法: 与第二种方法相似, 直接计算正样本 score 大于负样本的概率。我们首先把所有样本按照 score 排序, 依次用 rank 表示他们, 如最大 score 的样本, rank=n(n=N+M), 其次为 n-1。那么对于正样本中 rank 最大的样本, rank_max, 有 M-1 个其他正样本比他 score 小, 那么就有 (rank_max-1)-(M-1) 个负样本比他 score 小。其次为(rank_second-1)-(M-2)。最后我们得到正样本大于负样本的概率为
∑(allpositive)rank−M(M+1)M⋅N
时间复杂度为 O(N+M)。
[1] 机器学习指标大汇总: www.36dsj.com/archives/42…
[2] 机器学习算法常用指标总结: www.cnblogs.com/maybe2030/p…
来源: https://juejin.im/entry/5a3225f06fb9a045167d35fa