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

09-07 15:23