Paper Reading - 基础系列 - 常用评价指标 ROC、PR、mAP

更多可见计算机视觉-Paper&Code - 知乎

目录

混淆矩阵 (Confusion Matrix)

查准率/精确率 Precision

召回率/检出率/查全率 Recall

过杀率 Kill Rate

漏杀率 Miss Kill Rate

PR曲线、mAP(Mean-Average-Precision)

ROC曲线(receiver operating characteristic curve)、AUC(Area under Curve)


写了这么多突然发现忘了最重要的一部分,如何评估模型,这篇文章就好好捋一捋常见的一些评价指标

混淆矩阵 (Confusion Matrix)

以图为准,准确率可以用混淆矩阵对角线之和除以总图片数量来计算。对角线上的数字越大越好,以二分类猫狗为例,猫=1正样本,狗=0

  • True positives: 简称为 TP,即正样本被正确识别为正样本,猫图->猫。
  • True negatives: 简称为 TN,即负样本被正确识别为负样本,狗图->狗。
  • False Positives: 简称为 FP,即负样本被错误识别为正样本,狗图->猫。
  • False negatives: 简称为 FN,即正样本被错误识别为负样本,猫图->狗。

真正率:True Positive Rate(TPR)也称为灵敏度(Sensitivity)、召回率;

TPR = TP /(TP + FN)

真负率:True Negative Rate(TNR)也称为特指度(specificity);

TNR = TN /(TN + FP)

假正率:False Positive Rate (FPR);

FPR = FP /(FP + TN)

假负率:False Negative Rate(FNR);

FNR = FN /(TP + FN)

查准率/精确率 Precision

定义为:预测为正的样本中有多少是真正的正样本(针对预测结果)。宁可漏过,也不杀错人,只要刀出鞘杀的人一定是坏的

TP / (TP+FP)

召回率/检出率/查全率 Recall

定义为:样本中的正例有多少被预测正确了(针对原始样本) 宁可错杀一千,不可放过一个 pr两个参数都是互相平衡

TP / (TP+FN)

过杀率 Kill Rate

定义为:当原样本是正常=0,但检测结果是异常=1,则为过杀。 被过杀的样本数占测试集中的正常样本数的比例

FN / (TP+FN)

漏杀率 Miss Kill Rate

定义为:当原样本是异常=0,但检测结果是正常=1,则为漏杀。 被漏杀的样本数占测试集中的异常样本数的比例

FP / (FP+TN)

PR曲线、mAP(Mean-Average-Precision)

PR曲线与ROC类似,通过改变识别阈值,得到对应的点。

PR 曲线聚焦于正例。类别不平衡问题中由于主要关心正例,所以在此情况下 PR 曲线被广泛认为优于 ROC 曲线。

AP就是 Precision-recall 曲线下面的面积,通常来说一个越好的分类器,AP 值越高。mAP是多个类别 AP 的平均值。这个 mean 的意思是对每个类的 AP 再求平均(与ROC类似),得到的就是 mAP 的值,mAP 的大小一定在 [0,1] 区间,越大越好。该指标是目标检测算法中最重要的一个。

ROC曲线(receiver operating characteristic curve)、AUC(Area under Curve

ROC曲线从高到低,依次将 Score 的值(或者自定义的[0,1]一系列预置)作为阈值 threshold,当测试样本属于正样本的概率大于或等于这个 threshold 时,我们认为它为正样本,否则为负样本。

每次选取一个不同的 threshold,我们就可以得到一组 FPR 和 TPR,即 ROC 曲线上的一点。 将这些点连接起来,就得到了 ROC 曲线。当 threshold 取值越多,ROC 曲线越平滑。曲线越接近左上角代表检测模型的效果越好。

当测试集中的正负样本的分布发生变化时,ROC 曲线可以保持不变。因为 TPR 聚焦于正例,FPR 聚焦于与负例。ROC成为一个比较均衡整体的评估方法

AOC则代表曲线下方蓝色的面积,可以用numpy中梯形积分方法进行计算。AUC 值本质上是一个概率值,当我们随机挑选一个正样本以及一个负样本,算法计算得到正样本的 Score 值大于负样本概率就是 AUC 值。AUC 值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类

同时可以使用约登指数。该方法的思想是找到横坐标与纵坐标差异最大的点,即是最佳阈值

fpr=FP /(FP + TN)
recall= TP /(TP + FN)
# 因为是负积分,所以要加个-
auc=-np.trapz(recall_col, fprs_col)
find_best_threshold(recall,fpr,np.range(0,1,0.1))
def find_best_threshold(TPR, FPR, threshold):
    y = TPR - FPR
    youden_index = np.argmax(y)  
    optimal_threshold = threshold[youden_index]
    point = [FPR[youden_index ], TPR[youden_index ]]
    return optimal_threshold, point

希望你没有被绕晕~

下面可以用code来举例

y = np.array([0, 1, 0, 1])   #实际值
scores = np.array([0.1, 0.6, 0.6, 0.5])  #预测值
取0.5为阈值,大于等于0.5为真值为1
则混淆矩阵为如图

猜你喜欢

转载自blog.csdn.net/weixin_43953700/article/details/124467576