【问题标题】:Confidence thresholds on mean average precision calculation平均精度计算的置信阈值
【发布时间】:2021-11-27 18:12:35
【问题描述】:

PR 曲线阈值是否有任何规则,因为在 sklearn.metrics.average_precision 中,它们会自动根据概率/置信度创建阈值,如果我有这样的输入,可能会导致奇怪的结果:

y_true = np.array([0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
y_scores = np.array([ 0.7088982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

它将输出 mAP = 0.93333。 Sklearn 实现获得了这个数字,因为它自动使用 [0.7088982, 0] 作为阈值。当概率阈值为 0 时,所有零分数都将计为正数,从而导致高地图。这是正确的行为吗?

【问题讨论】:

    标签: scikit-learn


    【解决方案1】:

    关于您的示例的几个注意事项:

    • y_scores 的特性只有两个不同的值,它定义了threshold 的长度。正如您在source code 和 您可能在逻辑上暗示,thresholdy_scores 中不同值的数量定义。
    • 那么,您的论点是正确的,并且隐含在 threshold 所代表的内容中。实际上,如果分数大于或等于threshold, 该实例被分配给正类。因此,在 score=threshold=0 的情况下,您将仅根据您的y_true 获得真阳性(而平均精度是在每个阈值处实现的精度的加权平均值)。 还请查看here 以观察这一点

    元素 i 的精度值是 score >= thresholds[i]

    的预测精度

    降低召回值,使得元素 i 是具有 score >= thresholds[i]

    的预测的召回

    我还建议您查看here 以了解precisionrecallthreshold 是如何在precision_recall_curve() 中计算的。

    【讨论】:

    • 为了提供更多背景信息,我在 Github (github.com/you359/Keras-FasterRCNN) 上修改了一些旧的更快的 r-cnn 存储库。他们使用 sklearn 平均精度实现来计算 mAP 分数。当模型实际上表现非常糟糕时,我得到了相当不错的分数。它无法检测到大多数物体。结果表明,repo 将误报检测作为正检测,置信度为 0,以匹配 sklearn AP 函数输入。我最终编写了不同的实现,因为这个实现不知道图像中有多少基本事实。
    • 另外,我已经明白你的解释了。我提出了这个问题 bcz 我已经看到其他实现从 0 以上手动生成自己的阈值,因此 0 置信度分数始终计为负数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多