Cálculo de precisión, recuperación y puntaje F en una sola pasada - python

Precisión, precisión, recuperación y puntuación f son medidas de la calidad de un sistema en sistemas de aprendizaje automático. Depende de una matriz de confusión de Verdadero / Falso Positivo / Negativo.

Dada una tarea de clasificación binaria, he intentado lo siguiente para obtener una función que devuelva precisión, precisión, recuperación y puntuación 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

Pero parece que he recorrido el conjunto de datos de forma redundante 4 veces para obtener los positivos / negativos verdaderos / falsos.

También el múltipletry-excepts para atrapar elZeroDivisionError Es un poco redundante.

Entonces, ¿cuál es la forma pitónica de obtener los recuentos de positivos / falsos positivos / negativos sin múltiples bucles a través del conjunto de datos?

¿Cómo atrapo pitónicamente elZeroDivisionError sin las múltiples excepciones de prueba?

También podría hacer lo siguiente para contar los positivos / negativos verdaderos / falsos en un bucle pero¿hay una forma alternativa sin el múltipleif?:

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta