目标检测中的评价指标F-score AP mAP ROC/AUC的理解和使用


  深度学习测试模型效果的时, 经常会使用一些特定的评价指标. 根据数据集的分布情况以及使用侧重的效果可以选择不同的指标进行评价. 一般常用的评价指标有F-score、mAP、ROC/AUC. 在介绍这三种评价指标之前首先了解下准确率、召回率、精准率、IOU等指标的概念和计算方式.

IOU、precision、 recall、 accurancy

  Precision,准确率/查准率。Recall,召回率/查全率。这两个指标分别以两个角度衡量分类系统的准确率。目标检测中计算查准率和召回率之前需要需要计算检测框的IOU值, 并根IOU值判断是否预测正确.

  1. IoU这一值,可以理解为系统预测出来的框与原来图片中标记的框的重合程度。 计算方法即检测结果Detection Result与 Ground Truth 的交集比上它们的并集,即为检测的准确率。
      IOU是这种Detect box和Ground truth的差异的指标:
       I O U = g r o u n d t r u t h ∩ D e t e c t T r u t h g r o u n d t r u t h ∪ D e t e c t T r u t h IOU=\frac{ground truth\cap Detect Truth}{ground truth\cup Detect Truth} IOU=groundtruthDetectTruthgroundtruthDetectTruth
      
       针对目标检测任务中会设定一个IOU threshold, 当预测的box和真实的box之间的IOU大于IOU threshold可以判定为预测正确, 反之预测错误.

  2. Precision针对的是某一类样本,如果没有说明类别,那么Precision是毫无意义的(有些地方不说明类别,直接说Precision,是因为二分类问题通常说的Precision都是正样本的Precision)。
    P r e c i s i o n = T P T P + F P Precision = \frac{TP}{TP+FP} Precision=TP+FPTP

  3. Recall和Precision一样,脱离类别是没有意义的。说道Recall,一定指的是某个类别的Recall。Recall表示某一类样本,预测正确的与所有Ground Truth的比例。
    R e c a l l = T P T P + F N Recall = \frac{TP}{TP+FN} Recall=TP+FNTP

  4. 准确率=预测正确的样本数/所有样本数,即预测正确的样本比例(包括预测正确的正样本和预测正确的负样本,不过在目标检测领域,没有预测正确的负样本这一说法,所以目标检测里面没有用Accuracy的)。
    A c c u r a n c y = T P + T N T P + F P + F N + T N Accurancy = \frac{TP+TN}{TP+FP+FN+TN} Accurancy=TP+FP+FN+TNTP+TN

PR曲线

Precision-recall曲线(PR曲线), PR曲线的横轴Recall也就是TPR,反映了分类器对正例的覆盖能力。而纵轴Precision的分母是识别为正例的数目,而不是实际正例数目。Precision反映了分类器预测正例的准确程度。那么,Precision-recall曲线反映了分类器对正例的识别准确程度和对正例的覆盖能力之间的权衡。对于随机分类器而言,其Precision固定的等于样本中正例的比例,不随recall的变化而变化。
多分类中每个类别可以绘制出一条PR曲线, 曲线中为依次改变置信度为10%-100%得到一组由precision和recall组成的坐标, 连接这些值就是PR曲线.

ROC曲线

ROC曲线,是以FPR为横轴、TPR为纵轴,衡量二分类系统性能的曲线。
T P R = T P T P + F N TPR = \frac{TP}{TP + FN} TPR=TP+FNTP
F P R = F P F P + T N FPR = \frac{FP}{FP+TN} FPR=FP+TNFP
  同样依次取置信度10%-100%, 会得到一组不同的FPR、TPR组成的坐标连接两者就能得到ROC曲线, ROC曲线与X轴围成的图形面积可以作为一个综合衡量指标,即AUC(Area Under Curve,曲线下面积)。AUC越大,曲线就越凸,分类器的效果也就越好。
  ROC曲线反映了分类器对正例的覆盖能力和对负例的覆盖能力之间的权衡。

F-score

F1分数,它被定义为查准率和召回率的调和平均数, 具体的计算方式为:

F 1 = 2 ∗ P r e c i s i o n ∗ R e c a l l P r e c i s i o n + R e c a l l F_1=2*\frac{Precision*Recall}{Precision+Recall} F1=2Precision+RecallPrecisionRecall

当业务需求, 需要给予准确率和召回率不同的权重的时候可以使用 F β F_\beta Fβ

F β = ( 1 + β 2 ) ∗ P r e c i s i o n ∗ R e c a l l β 2 P r e c i s i o n + R e c a l l F_\beta=(1+\beta^2)*\frac{Precision*Recall}{\beta^2Precision+Recall} Fβ=(1+β2)β2Precision+RecallPrecisionRecall

q其中 F 2 F_2 F2 F 0 . 5 F_0.5 F0.5在统计学中经常使用, 并且 F 2 F_2 F2分数中, 召回率权重大于查准率, 而 F 0 . 5 F_0.5 F0.5分数则刚好相反.

多分类中F-score是先计算每个类别的F-score然后在求平均

AP、mAP

与AUC相似,AP就是PR曲线与X轴围成的图形面积.
对于连续的PR曲线,有:语句为 A P = ∫ 0 1 P R d r AP= \int_{0}^{1}PR\text{d}r AP=01PRdr
对于离散的PR曲线,有:
A P = ∑ k = 1 n P ( k ) Δ r ( k ) AP= \sum_{k=1}^nP(k)\Delta r(k) AP=k=1nP(k)Δr(k)
在多个分类中, 可以通过求平均得到mAP
m A P = ∑ q = 1 Q A P ( q ) Q mAP = \frac{\sum_{q=1}^QAP(q)}{Q} mAP=Qq=1QAP(q)

验证指标的选择

  一般在查全率和查准率上有偏向的时候, 会选用F-SCORE, 例如推荐系统中,如果希望更精准的了解客户需求,避免推送用户不感兴趣的内容,precision 就更加重要;在疾病检测的时候,我们不希望查漏任何一项疾病,这时 recall(TPR) 就更重要。当两者都需要考虑时,F-score 就是一种参考指标。
  当面临数据 class imbalance 问题,即正负样本比例失衡,而且测试数据中的正负样本的分布也可能随着时间变化。根据计算公式可以推知,在测试数据出现imbalance 时 ROC 曲线能基本保持不变,而 PRC 则会出现大变化, 此时选用AUC指标作为评价指标会更理想.

例如yolov3中出现下来的指标

除了AP以外还有其他的评价指标. 其中:
A P 50 AP_{50} AP50: IOU阈值为0.5时AP测量值
A P 75 AP_{75} AP75: IOU阈值为0.75时AP测量值
A P s AP_{s} APs: 像素面积小于 3 2 2 32^2 322的目标框的AP测量值
A P M AP_{M} APM: 像素面积在 3 2 2 − 9 6 2 32^2-96^2 322962之间目标框的AP测量值
A P L AP_{L} APL: 像素面积大于 9 6 2 96^2 962的目标框的AP测量值

好的,针对您的问题,以下是一份逻辑回归预测模型的代码示例: ```python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, roc_curve import matplotlib.pyplot as plt # 1. 数据读取与处理 data = pd.read_csv('data.csv') X = data.drop('target', axis=1) y = data['target'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 2. 模型训练 model = LogisticRegression() model.fit(X_train, y_train) # 3. 模型预测 y_pred = model.predict(X_test) y_prob = model.predict_proba(X_test)[:, 1] # 4. 模型评价 accuracy = accuracy_score(y_test, y_pred) precision = precision_score(y_test, y_pred) recall = recall_score(y_test, y_pred) f1 = f1_score(y_test, y_pred) auc = roc_auc_score(y_test, y_prob) # 5. ROC曲线绘制 fpr, tpr, thresholds = roc_curve(y_test, y_prob) plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % auc) plt.plot([0, 1], [0, 1], 'k--') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('ROC Curve') plt.legend(loc="lower right") plt.show() # 6. 输出结果 print('Accuracy:', accuracy) print('Precision:', precision) print('Recall:', recall) print('F1-score:', f1) print('AUC:', auc) ``` 这份代码使用了Pandas库读取了名为"data.csv"的数据集,并将其分成训练集和测试集,使用Scikit-learn库的LogisticRegression类进行模型训练和预测,最后通过Scikit-learn库指标函数计算了预测结果的准确率、精确率、召回率、F1-scoreAUC指标,同时绘制了ROC曲线。 需要注意的是,上述代码仅作为示例,具体实现需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值