【问题标题】:How to determine the precision, recall and f-measure of my binary segmentation task?如何确定我的二元分割任务的精度、召回率和 f 度量?
【发布时间】:2019-02-28 04:05:04
【问题描述】:

我已经训练了一个模型,该模型尝试在图像中分割感兴趣的对象。我想通过确定网络输出的精度、召回率和 f 度量来评估我的模型的性能。

我知道precision=tp/(tp+fp)recall=tp/(tp+fn)。我发现sklearn.metrics 有多个函数来确定这些值,但我似乎无法有效地使用这些函数。

起初,我编写了一个脚本,找到了 tpfpfn 值并返回了实际的 int 数字,因此例如在一个示例中,我有 2 个对基本事实感兴趣的对象,但是网络检测到 4 个感兴趣的对象,因此这些将我的值置于:

tp = 2, fp = 2 and fn = 0

现在我不能使用这些,因为 sklearn.metrics 期望数组作为输入,所以我重写了我的脚本以提供以下数组:

gt_array = [1, 1]
pred_array = [1, 0, 1, 0]

因为其中两个预测是正确的,而另外两个是错误分类的对象。

如果我把这个交给函数:

metrics.classification_report(gt_array, pred_array)

metrics.precision_recall_fscore_support(gt_array, pred_array,average='binary')

我得到错误:

{ValueError}Multi-label binary indicator input with different numbers of labels

我可以看到,但我假设该函数会根据大小差异自动确定 fnfp 值。

那么当我有不同大小的数组时,如何确定这些指标。在某些示例中,ground_truth 有 10 次检测,但网络输出仅显示 5,那么在这种情况下,如何将 fn 值合并到上述函数中?

谢谢

【问题讨论】:

  • 那么,您如何将1 分配给您的池中每个有趣的对象,否则分配0。比你拥有相同长度的y_truey_pred 并且你可以继续使用 sklearn 函数
  • 由于误报和误报,它们的长度不同。如果基本事实表明该样本中重新发送了两个对象,并且网络检测到 4 个,那么其中 2 个是误报。这会导致不同长度的数组

标签: python classification


【解决方案1】:

您的问题是您未能定义正确操作的指标。将列表的每个索引视为感兴趣对象的 ID#——“感兴趣”由 基本事实或模型标记。每个列表必须涵盖所有个对象。

对于您的情况,您有四个对象;让我们让真正的项目 0 和 1。你的列表应该是这样的:

gt_array   = [1, 1, 0, 0]    # First two items are of interest; not the others.
pred_array = [1, 1, 1, 1]    # All four items are of interest.

这不仅仅是将gt 列表填零到pred 的长度的问题;您还需要匹配已识别的对象。例如,考虑一个只有两个感兴趣的项目的图像:一只猫和一只狗。预测模型识别了四个项目:狗、天空、墙、草。现在,您已经标记了 五个 个对象,但只有一个是正确的:

#            cat dog sky wall grass
gt_array   = [1,  1,  0,  0,    0]    # First two items are of interest
pred_array = [0,  1,  1,  1,    1]    # one FN, three FP, one TP

在您的过程中需要注意的另一件事是您没有纳入真正的否定。如果您打算计算任何需要第四类的东西,您必须定义一种测量自然过滤器的好方法(那个地方是 booooooorinnngg!)。我建议你忽略它:试图衡量忽略事物的质量是一个滑坡。


classification_report 有两个参数:基本事实和预测。您似乎误解了预测向量。你的预测器对所有四个对象都说“有趣”,所以这个向量都是1s。基本事实是 [1, 1, 0, 0](按我的顺序),因为只有前两个是真正有趣的。

您正在尝试自己进行比较。那不是你的工作;这是classification_report 为您所做的一部分。您的模型预测对象,因此您的预测列表中有四个 1 条目。

【讨论】:

  • 感谢您的回答。所以在我的情况下,gt 显示 2 个对象,pred 显示 4 个对象。那么我的gt 将是[1,1,0,0]pred 将是[1,0,1,0]。但是,如果网络无法检测到所有对象并且在这样的gt 数组中将大于pred,该怎么办。我根本没有考虑真正的否定,因为它们没有计入precision 和召回方程。所以我不必担心。
  • 为什么pred 会是[1, 0, 1, 0]
  • 我的回答包括pred无法识别所有对象的情况;这就是为什么“猫”插槽是0
  • 对不起,如果我误解了,我正在使用距离度量来确定 tpfp 之间的区别。所以 pred 将是 [1,0,1,0] 因为第一个和第三个索引是 tp 而第二个和第四个是 fp
  • 或者,如果我理解正确,在我的情况下,我的 pred 应该是 [1,1,0,0],因为这两个基本事实已与其他两个对象 fp 一起被正确识别
猜你喜欢
  • 2011-11-01
  • 2020-06-22
  • 2017-09-28
  • 2019-11-27
  • 2012-09-16
  • 2021-02-11
  • 2016-06-19
  • 2022-01-06
  • 2019-12-14
相关资源
最近更新 更多