【发布时间】:2019-02-24 18:16:28
【问题描述】:
我使用的是 Python 2.7。我有两个 tsv 数据文件,我读入两个字典,我想计算它们的recall 分数,所以我需要计算tp 和fn。
这些是我的字典的样子:
gold = {'A11':'cat', 'A22':'cat', 'B3':'mouse'}
results = {'A2':'cat', 'B2':'dog'}
我的代码主要是迭代gold字典,去掉gold字典key和resultskey末尾的数字。然后,检查键是否匹配以查找它们的值是否匹配以计算tp。但是,我的代码似乎总是增加fn。这是我的可运行代码:
from __future__ import division
import string
def eval():
tp=0 #true positives
fn=0 #false negatives
fp=0#false positives
gold = {'A11':'cat', 'A22':'cat', 'B3':'mouse'}
results = {'A2':'cat', 'B2':'dog'}
#iterate gold dictionary
for i,j in gold.items():
#remove the digits off gold keys
i_stripped = i.rstrip(string.digits)
#iterate results dictionary
for k,v in results.items():
#remove the digits off results keys
k_stripped = k.rstrip(string.digits)
# check if key match!
if i_stripped == k_stripped:
#check if values match then increment tp
if j == v:
tp += 1
#delete dictionary entries to avoid counting them again
del gold_copy[i]
del results_copy[k]
#get out of this loop we found a match!
break
continue
# NO match was found in the results, then consider it as fn
fn += 1 #<------ wrong calculations caused in this line
print 'tp = %.2f fn = %.2f recall = %.2f ' % (tp, fn, float(tp)/(tp+fn))
这是输出:
tp = 1.00 fn = 3.00 recall = 0.25
fn 不正确,应该是2 而不是3。如何阻止 fn 在每次迭代中递增?任何指导将不胜感激。
谢谢,
【问题讨论】:
-
把“contiue”改成“continue”会有帮助吗?
-
@bobbel 哈哈,这只是从 ide 复制代码时的拼写错误。但是,fn 仍然在每次迭代中递增
-
................
-
您很可能需要将控制 fn 增加的行放在 if 条件之一下
-
@jpobst 谢谢你的建议!现在问题更易读、更整洁了。
标签: python python-2.7 loops dictionary