【发布时间】:2016-02-14 20:33:05
【问题描述】:
Accuracy, precision, recall and f-score 是机器学习系统中系统质量的度量。它取决于真/假阳性/阴性的混淆矩阵。
给定一个二元分类任务,我尝试了以下方法来获得一个返回准确率、精度、召回率和 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 捕捉ZeroDivisionError 有点多余。
那么在不通过数据集进行多次循环的情况下获取真/假阳性/阴性计数的 Python 方法是什么?
如何在没有多个 try-excepts 的情况下以 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
【问题讨论】:
标签: python list machine-learning try-except precision-recall