我已经训练了一个模型,该模型试图对图像中感兴趣的对象进行细分。我想通过确定网络输出的精度,召回率和f值来评估模型的性能。
我知道precision=tp/(tp+fp)
和recall=tp/(tp+fn)
。我发现sklearn.metrics
具有确定这些值的多种功能,但我似乎无法有效地使用这些功能。
起初,我编写了一个脚本,该脚本找到了tp
,fp
和fn
的值并返回了实际的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
我可以看到,但我认为该函数将根据大小差异自动确定fn
和fp
的值。
所以当数组大小不同时,如何确定这些指标。在某些示例中,ground_truth
具有10次检测,但是网络输出仅显示5
,因此在这种情况下,如何将fn
值合并到上述函数中?
谢谢
答案 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
条目。