¿Por qué scikitlearn dice que la puntuación de F1 está mal definida con FN mayor que 0?

sklearn.metrics un progtwig de python que llama a los métodos de sklearn.metrics para calcular la precisión y la puntuación de F1. Aquí está la salida cuando no hay una muestra predicha:

 /xxx/py2-scikit-learn/0.15.2-comp6/lib/python2.6/site-packages/sklearn/metr\ ics/metrics.py:1771: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. 'precision', 'predicted', average, warn_for) /xxx/py2-scikit-learn/0.15.2-comp6/lib/python2.6/site-packages/sklearn/metr\ ics/metrics.py:1771: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 due to no predicted samples. 'precision', 'predicted', average, warn_for) 

Cuando no hay una muestra predicha, significa que TP + FP es 0, por lo que

  • la precisión (definida como TP / (TP + FP)) es 0/0, no definida,
  • La puntuación F1 (definida como 2TP / (2TP + FP + FN)) es 0 si FN no es cero.

En mi caso, sklearn.metrics también devuelve la precisión como 0.8 y la recuperación como 0. Así que FN no es cero.

¿Pero por qué scikilearn dice que la F1 está mal definida?

¿Cuál es la definición de F1 utilizada por Scikilearn?

https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/classification.py

F1 = 2 * (precisión * recuperación) / (precisión + recuperación)

precisión = TP / (TP + FP) como acaba de decir si el predictor no predice una clase positiva en absoluto: la precisión es 0.

recuperación = TP / (TP + FN), en caso de que si el predictor no predice una clase positiva – TP es 0 – la recuperación es 0.

Así que ahora estás dividiendo 0/0.

Precisión, memoria, puntuación F1 y cálculo de precisión.

 - In a given image of Dogs and Cats * Total Dogs - 12 D = 12 * Total Cats - 8 C = 8 - Computer program predicts * Dogs - 8 5 are actually Dogs TP = 5 3 are not FP = 3 * Cats - 12 6 are actually Cats TN = 6 6 are not FN = 6 - Calculation * Precision = TP / (TP + FP) => 5 / (5 + 3) * Recall = TP / D => 5 / 12 * F1 = 2 * (Precision * Recall) / (Precision + Recall) * F1 = 0.5 * Accuracy = TP + TN / P + N * Accuracy = 0.55 

Referencia de Wikipedia