Точность, точность, отзыв и f-оценка - это показатели качества системы в машинных системах. Это зависит от матрицы путаницы True/False Positives/Negatives.
Учитывая задачу двоичной классификации, я попробовал следующее получить функцию, которая возвращает точность, точность, отзыв и 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 раза, чтобы получить True/False Positives/Negatives.
Также несколько try-excepts
для захвата ZeroDivisionError
немного избыточны.
Итак, что такое pythonic способ получить подсчеты True/False Positives/Negatives без нескольких циклов через набор данных?
Как pythonically поймать ZeroDivisionError
без нескольких пробных исключений?
Я мог бы также сделать следующее, чтобы считать 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