给定一个二进制分类任务,我尝试了以下方法来获得一个返回准确度、精确度、召回率和f-score的函数:gold = [1] + [0] * 9
predicted = [1] * 10
def evaluation(gold, predicted):
true_pos = sum(1 for p,g in zip(predicted, gold) if p==1 and g==1)
true_neg = sum(1 for p,g in zip(predicted, gold) if p==0 and g==0)
false_pos = sum(1 for p,g in zip(predicted, gold) if p==1 and g==0)
false_neg = sum(1 for p,g in zip(predicted, gold) if p==0 and g==1)
try:
recall = true_pos / float(true_pos + false_neg)
except:
recall = 0
try:
precision = true_pos / float(true_pos + false_pos)
except:
precision = 0
try:
fscore = 2*precision*recall / (precision + recall)
except:
fscore = 0
try:
accuracy = (true_pos + true_neg) / float(len(gold))
except:
accuracy = 0
return accuracy, precision, recall, fscore
但我似乎在数据集中重复循环了4次,以获得真/假阳性/阴性。在
另外,捕捉try-excepts的多个try-excepts有点多余。在
那么在不通过数据集进行多次循环的情况下,用什么样的python方法来获得真/假阳性/阴性计数?
如果没有多次尝试例外,我如何通过pythonic捕捉ZeroDivisionError?
我也可以用下面的方法来计算一个循环中的真/假阳性/阴性,但是有没有一种没有多重if的替代方法?:
^{pr2}$