准确率,精确率,召回率和 F1 分数 是机器学习系统中评估模型质量的指标。它基于 True/False Positives/Negatives 的混淆矩阵。
给定二元分类任务,我已尝试以下方法来获得一个能够返回准确率,精确率,召回率和 F1 分数的函数:
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次以获取真/假阳性/阴性。
此外,为了捕获ZeroDivisionError,多个try-except有点冗余。
那么,有没有Pythonic的方法可以在不通过数据集进行多次循环的情况下获取True/False Positives/Negatives的计数?
如何使用Pythonic方式捕获ZeroDivisionError而不使用多个try-except?
我也可以通过以下方式在一个循环中计算True/False Positives/Negatives,但是否有另一种不需要多个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