Accuracy, precision, recall and f-score是机器学习系统中系统质量的度量。它取决于正确/错误肯定/否定的混淆矩阵。
给定一个二进制分类任务,我已经尝试了以下方法来获得返回精度,精度,召回率和f分数的函数:
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
的多个ZeroDivisionError
有点多余。那么,在数据集中不存在多个循环的情况下,获取True/False Positives/Negatives计数的pythonic方法是什么?
如何在没有多个try-except的情况下以Python方式捕获
ZeroDivisionError
? 我也可以执行以下操作以在一个循环中计算正确/错误肯定/否定,但是是否有一种无需多种
if
的替代方法? :for p,g in zip(predicted, gold):
if p==1 and g==1:
true_pos+=1
if p==0 and g==0:
true_neg+=1
if p==1 and g==0:
false_pos+=1
if p==0 and g==1:
false_neg+=1
最佳答案
最后,我将使用 collections.Counter
,大致使用所有if
进行的操作(您应该使用elif
,因为您的条件是互斥的):
counts = Counter(zip(predicted, gold))
然后例如
true_pos = counts[1, 1]
。首先,您(几乎)应该永远不要使用裸
except:
。如果您正在捕获ZeroDivisionError
,请编写except ZeroDivisionError
。您也可以考虑采用"look before you leap"方法,在尝试除法之前检查分母是否为0
。accuracy = (true_pos + true_neg) / float(len(gold)) if gold else 0