如何确定二进制分割任务的精度,召回率和f度量?

时间:2019-02-27 18:15:54

标签: python classification

我已经训练了一个模型,该模型试图对图像中感兴趣的对象进行细分。我想通过确定网络输出的精度,召回率和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 :(得分: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 接受两个参数:基本事实和预测。您似乎误解了预测向量。您的预测变量对所有四个对象都说“有趣”,因此向量就是所有1。基本真理是[1,1,0,0](按照我的顺序),因为只有前两个才是真正有趣的。

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