目录
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
则混淆矩阵为如图