目标检测中各种模型评估方法

1. 混淆矩阵

也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示.

混淆矩阵中:

  • 横轴是模型预测的类别数量统计,
  • 纵轴是数据真实标签的数量统计。
  • 对角线表示模型预测和数据标签一致的数目,所以对角线之和除以测试集总数就是准确率。对角线上数字越大越好,在可视化结果中颜色越深,说明模型在该类的预测准确率越高。

2. TP、TN、FP、FN解释说明

行表示预测的label值,列表示真实label值
TP:True Positive, 被判定为正样本,事实上也是正样本。
FP:False Positive,被判定为正样本,但事实上是负样本。
TN:True Negative, 被判定为负样本,事实上也是负样本。
FN:False Negative,被判定为负样本,但事实上是正样本。

伊索寓言:狼来了(精简版)

有一位牧童要照看镇上的羊群,但是他开始厌烦这份工作。为了找点乐子,他大喊道:“狼来了!”其实根本一头狼也没有出现。村民们迅速跑来保护羊群,但他们发现这个牧童是在开玩笑后非常生气。
[这样的情形重复出现了很多次。]
一天晚上,牧童看到真的有一头狼靠近羊群,他大声喊道:“狼来了!”村民们不想再被他捉弄,都待在家里不出来。这头饥饿的狼对羊群大开杀戒,美美饱餐了一顿。这下子,整个镇子都揭不开锅了。恐慌也随之而来。

我们做出以下定义:

“狼来了”是正类别。
“没有狼”是负类别。

使用一个 2x2 混淆矩阵来总结我们的“狼预测”模型,该矩阵描述了所有可能出现的结果(共四种):

langlaile

3. precision 和 recall 的计算

Accuracy:表示预测结果的精确度,预测正确的样本数除以总样本数。
precision: 准确率,又称为查准率,表示预测结果中,预测为正样本的样本中,正确预测为正样本的概率;
error rate: 错误率, 1 - 准确(分类)率
recall: 召回率,又称为查全率,表示在原始样本的正样本中,最后被正确预测为正样本的概率;

计算公式如下图:

精确率和召回率:一场拔河比赛,鱼与熊掌的关系
要全面评估模型的有效性,必须同时检查精确率和召回率。遗憾的是,精确率和召回率往往是此消彼长的情况。也就是说,提高精确率通常会降低召回率值,

在多分类中如最后经过一个softmax层得到的是某个概率最大值,然而对于二分类,往往把模型预测为某个对象的概率从高到低排序,并且和真实标签对应。

这时我们会设置某个阈值,大于这个阈值的分为正样本,反之为负样本。随着选取的阈值不同,得到的指标是不一样的。这时我们可以画P-R曲线。

4. P-R曲线、平均精度(Average-Precision,AP)

P-R曲线:选取不同阈值时对应的精度和召回画出来

总体趋势,精度越高,召回越低,当召回达到1时,对应概率分数最低的正样本,这个时候正样本数量除以所有大于等于该阈值的样本数量就是最低的精度值。

5. mAP评估方法介绍

mean average precision(MAP)

5.1. 平均精度(Average-Precision,AP):

P-R曲线围起来的面积,通常来说一个越好的分类器,AP值越高。
AP衡量的是学出来的模型在每个类别上的好坏,
mAP衡量的是学出的模型在所有类别上的好坏,得到AP后mAP的计算就变得很简单了,就是取所有AP的平均值。

5.2. AP的计算

此处参考的是PASCAL VOC CHALLENGE的计算方法。首先设定一组阈值,[0, 0.1, 0.2, …, 1]。然后对于recall大于每一个阈值(比如recall>0.3),我们都会得到一个对应的最大precision。这样,我们就计算出了11个precision。AP即为这11个precision的平均值。这种方法英文叫做11-point interpolated average precision。​
当然PASCAL VOC CHALLENGE自2010年后就换了另一种计算方法。新的计算方法假设这N个样本中有M个正例,那么我们会得到M个recall值(1/M, 2/M, …, M/M),对于每个recall值r,我们可以计算出对应(r’ > r)的最大precision,然后对这M个precision值取平均即得到最后的AP值。计算方法如下:​

相应的Precision-Recall曲线(这条曲线是单调递减的)如下:

5.3. 计算代码

def compute_ap(gt_boxes, gt_class_ids,
               pred_boxes, pred_class_ids, pred_scores,
               iou_threshold=0.5):
    """Compute Average Precision at a set IoU threshold (default 0.5).

    Returns:
    mAP: Mean Average Precision
    precisions: List of precisions at different class score thresholds.
    recalls: List of recall values at different class score thresholds.
    overlaps: [pred_boxes, gt_boxes] IoU overlaps.
    """
    ## Trim zero padding and sort predictions by score from high to low
    gt_boxes = trim_zeros(gt_boxes)
    pred_boxes = trim_zeros(pred_boxes)
    pred_scores = pred_scores[:pred_boxes.shape[0]]
    indices = np.argsort(pred_scores)[::-1]
    pred_boxes = pred_boxes[indices]
    pred_class_ids = pred_class_ids[indices]
    pred_scores = pred_scores[indices]

    ## Compute IoU overlaps [pred_boxes, gt_boxes]
    overlaps = compute_overlaps(pred_boxes, gt_boxes)

    ## Loop through ground truth boxes and find matching predictions
    match_count = 0
    pred_match = np.zeros([pred_boxes.shape[0]])
    gt_match = np.zeros([gt_boxes.shape[0]])
    for i in range(len(pred_boxes)):
        ## Find best matching ground truth box
        sorted_ixs = np.argsort(overlaps[i])[::-1]
        for j in sorted_ixs:
            ## If ground truth box is already matched, go to next one
            if gt_match[j] == 1:
                continue
            ## If we reach IoU smaller than the threshold, end the loop
            iou = overlaps[i, j]
            if iou < iou_threshold:
                break
            ## Do we have a match?
            if pred_class_ids[i] == gt_class_ids[j]:
                match_count += 1
                gt_match[j] = 1
                pred_match[i] = 1
                break

    ## Compute precision and recall at each prediction box step
    precisions = np.cumsum(pred_match) / (np.arange(len(pred_match)) + 1)
    recalls = np.cumsum(pred_match).astype(np.float32) / len(gt_match)

    ## Pad with start and end values to simplify the math
    precisions = np.concatenate([[0], precisions, [0]])
    recalls = np.concatenate([[0], recalls, [1]])

    ## Ensure precision values decrease but don't increase. This way, the
    ## precision value at each recall threshold is the maximum it can be
    ## for all following recall thresholds, as specified by the VOC paper.
    for i in range(len(precisions) - 2, -1, -1):
        precisions[i] = np.maximum(precisions[i], precisions[i + 1])

    ## Compute mean AP over recall range
    indices = np.where(recalls[:-1] != recalls[1:])[0] + 1
    mAP = np.sum((recalls[indices] - recalls[indices - 1]) *
                 precisions[indices])

    return mAP, precisions, recalls, overlaps

参考文献:
+++ 分类之性能评估指标
++多标签图像分类任务的评价方法-mAP_花心大罗博_新浪博客

深度学习: mAP (Mean Average Precision) - CSDN博客
++目标检测(一)目标检测评价指标 大雁与飞机 - CSDN博客

6. 分类模型的评估方法-F分数(F-Score)

精确率(Precision)和召回率(Recall)评估指标,理想情况下做到两个指标都高当然最好,但一般情况下,Precision高,Recall就低,Recall高,Precision就低。

所以在实际中常常需要根据具体情况做出取舍,例如一般的搜索情况,在保证召回率的条件下,尽量提升精确率。而像癌症检测、地震检测、金融欺诈等,则在保证精确率的条件下,尽量提升召回率。

引出了一个新的指标F-score,综合考虑Precision和Recall的调和值

SCORE

  • β=1时,称为 F1-score或者 F1-Measure,这时,精确率和召回率都很重要,权重相同。
  • 当有些情况下,我们认为精确率更重要些,那就调整β的值小于1,
  • 如果我们认为召回率更重要些,那就调整β的值大于1。

F1指标(F1-score):F1-score表示的是precision和recall的调和平均评估指标。

举个例子:癌症检查数据样本有10000个,其中10个数据祥本是有癌症,其它是无癌症。假设分类模型在无癌症数据9990中预测正确了9980个,在10个癌症数据中预测正确了9个,此时真阳=9,真阴=9980,假阳=10,假阴=1。

那么:

Accuracy = (9+9980) /10000=99.89% 
Precision=9/19+10)= 47.36% 
F1-score=2×(47.36% × 90%)/(1×47.36%+90%)=62.07% 
F2-score=5× (47.36% × 90%)/(4×47.36%+90%)=76. 27%

分类模型的评估方法-F分数(F-Score) - CSDN博客

7. ROC曲线

  • TP(True Positive):指正确分类的正样本数,即预测为正样本,实际也是正样本。
  • FP(False Positive):指被错误的标记为正样本的负样本数,即实际为负样本而被预测为正样本,所以是False。
  • TN(True Negative):指正确分类的负样本数,即预测为负样本,实际也是负样本。
  • FN(False Negative):指被错误的标记为负样本的正样本数,即实际为正样本而被预测为负样本,所以是False。
  • TP+FP+TN+FN:样本总数。
  • TP+FN:实际正样本数。
  • TP+FP:预测结果为正样本的总数,包括预测正确的和错误的。
  • FP+TN:实际负样本数。
  • TN+FN:预测结果为负样本的总数,包括预测正确的和错误的。

FPR指实际负样本中被错误预测为正样本的概率。
真正例率 (TPR) 是召回率的同义词,因此定义如下:

TPR指实际正样本中被预测正确的概率。假正例率 (FPR) 的定义如下:

ROC(receiver operating characteristic),平面的横坐标是false positive rate(FPR)假阳率,纵坐标是true positive rate(TPR)真阳率。

7.1. ROC计算过程如下:

  • 首先每个样本都需要有一个label值,并且还需要一个预测的score值(取值0到1);
  • 然后按这个score对样本由大到小进行排序,假设这些数据位于表格中的一列,从上到下依次降序;
  • 现在从上到下按照样本点的取值进行划分,位于分界点上面的我们把它归为预测为正样本,位于分界点下面的归为负样本;
  • 分别计算出此时的TPR(Recall)=TP/P和FPR(1-SP)=FP/N,然后在图中绘制(FPR, TPR)点。
  • 从上往下逐个样本计算,最后会得到一条光滑的曲线 。

参考:
Understanding ROC curve

7.2. AUC计算

ROC曲线围住的面积,越大,分类器效果越好。
AUC(area under the curve)就是ROC曲线下方的面积,取值在0.5到1之间,因为随机猜测得到额AUC就是0.5。面积如下图所示,阴影部分即为AUC面积:

7.3. 计算代码

import numpy as np
import matplotlib.pyplot as plt

def plotROC(predScore, labels):
    point = (1.0, 1.0) #由于下面排序的索引是从小到大,所以这里从(1,1)开始绘制
    ySum = 0.0 
    numPos = np.sum(np.array(labels)==1.0)
    numNeg = len(labels)-numPos
    yStep = 1/np.float(numPos)
    xStep = 1/np.float(numNeg)
    sortedIndex = predScore.argsort() #对predScore进行排序,的到排序索引值
    fig = plt.figure()
    fig.clf()
    ax = plt.subplot(111)
    for index in sortedIndex.tolist()[0]:
        if labels[index] == 1.0: #如果正样本各入加1,则x不走动,y往下走动一步
            delX = 0
            delY = yStep;
        else:                   #否则,x往左走动一步,y不走动
            delX = xStep
            delY = 0
            ySum += point[1]     #统计y走动的所有步数的和
        ax.plot([point[0], point[0] - delX], [point[1], point[1] - delY],c='b')
        point = (point[0] - delX, point[1] - delY)
    ax.plot([0,1],[0,1],'b--')
    plt.xlabel('False positive rate'); plt.ylabel('True positive rate')
    plt.title('ROC Curve')
    ax.axis([0, 1, 0, 1])
    plt.show() 
    #最后,所有将所有矩形的高度进行累加,最后乘以xStep得到的总面积,即为AUC值
    print "the Area Under the Curve is: ", ySum * xStep

对于ROC曲线绘制中的参数,输入的第二个参数是类别标签(如,+1,-1形成的文件,每行表示一个样本的真实类别);第一个参数则是由模型训练出来的预测强度,如Adaboost对样本i预测的结果为0.67,对i+1个样本预测的结果是0.3,等等,每行一个,格式和classLabels一样。最后绘制ROC曲线的同时,也在输出ROC曲线下方的AUC面积。

参考:
What does AUC stand for and what is it?

Getting Title at 40:06

分类之性能评估指标

7.4. 选择最佳阈值

要选择最佳阈值,可以将roc曲线的每个点视为单独的分类器。这个小分类器使用得分作为+和 - 之间的边界(即,它被分类为+当前一个以上的所有点)取决于我们的数据集中的 pos/neg分数 - 在50%/ 50%的情况下平行于基线 - 您可以构建iso准确度线并以最佳准确度进行分析。
这里有一张照片可以说明这一点

参考:
ROC Analysis - ML Wiki
Understanding ROC curve

8. ROC与P-R对比

绘制ROC曲线和PR曲线都是选定不同阈值,从而得到不同的x轴和y轴的值,画出曲线。

ROC和PR曲线都被用于评估机器学习算法对一个给定数据集的分类性能,每个数据集都包含固定数目的正样本和负样本。

在ROC空间,ROC曲线越凸向左上方向效果越好。与ROC曲线左上凸不同的是,PR曲线是右上凸效果越好。

定理1:对于一个给定的包含正负样本的数据集,ROC空间和PR空间存在一一对应的关系,也就是说,如果recall不等于0,二者包含完全一致的混淆矩阵。我们可以将ROC曲线转化为PR曲线,反之亦然。

定理2:对于一个给定数目的正负样本数据集,一条曲线在ROC空间中比另一条曲线有优势,当且仅当第一条曲线在PR空间中也比第二条曲线有优势。(这里的“一条曲线比其他曲线有优势”是指其他曲线的所有部分与这条曲线重合或在这条曲线之下。)

图都来自论文An introduction to ROC analysis. Pattern recognition letters

  • (a)和(c)为ROC曲线,(b)和(d)为Precision-Recall曲线。
  • (a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果,
  • (c)和(d)是将测试集中负样本的数量增加到原来的10倍后,分类器的结果。
  • 可以明显的看出,ROC曲线基本保持原貌,而Precision-Recall曲线则变化较大。

从公式计算中可以看出,ROC曲线中真阳性率TPR的计算公式与P-R曲线中的召回率Recall计算公式是一样的,即二者是同一个东西在不同环境下的不同叫法。当正负样本差距不大的情况下,ROC曲线和P-R的趋势是差不多的,但是当负样本很多的时候,ROC曲线效果依然较好,但是P-R曲线效果一般

The Relationship Between Precision-Recall and ROC Curves

ROC和AUC介绍以及如何计算AUC

9. IOU(Intersection Over Union)

IOU用来衡量预测的物体框和真实框的重合程度,IoU (intersection over union)Union就是并集, intersection就是交集,简单来讲就是模型产生的目标窗口和原来标记窗口的交叠率。

检测结果(DetectionResult)与 Ground Truth 的交集比上它们的并集,即为检测的准确率 IoU :

蓝色的框是:GroundTruth
黄色的框是:DetectionResult
绿色的框是:DetectionResult ⋂GroundTruth
红色的框是:DetectionResult ⋃GroundTruth

当然最理想的情况就是 DR 与 GT 完全重合,即IoU=1
评价一个算法的时候,一种常见的方法是先设置一个IOU的阈值,只要算法找到的IOU大于这个阈值,就是一个有效的检测

10. 其他评价指标

预测的准确率:这涉及到模型正确地预测新的或先前没见过的数据的类 标号能力。

速度:涉及到产生和使用模型的计算花费。

强壮性:这涉及给定噪声数据或具有空缺值的数据,模型正确预测的能力。

可伸缩性:这涉及给定大量的数据,有效的构造模型的能力。

可解释性:这涉及学习模型提供的理解和洞察的层次。

数据挖掘分类算法的评价指标
精确率、召回率、F1 值、ROC、AUC 各自的优缺点是什么? - 知乎


技术交流学习,请加QQ微信:631531977
目录