A lo largo de los modelos de entrenamiento, recibo advertencias como esta.
Puedo activarlo más específicamente con una llamada como esta.
from evalml.objectives import F1
f1 = F1()
f1.score(y_predicted=[0, 0],
y_true=[0, 1])
En cuanto a formas de manejar. Esto es lo que me viene a la mente
nan
o la peor puntuación posible para la métrica. tal vez luego almacenemos los mensajes de error en algún lugar del diccionario de resultadosSí, deberíamos arreglar esto. En general, no deberíamos permitir que nada se imprima en la salida estándar a menos que nuestro código lo haga.
Me pregunto si esto está relacionado con el # 311.
Creo que deberíamos hacer ambas sugerencias: suprimir esta salida de sklearn stdout y también escribir nuestro propio mensaje de advertencia si es posible.
@christopherbunn RE mencionaste esto en la reunión, ¿debería marcarse como En progreso?
@christopherbunn @jeremyliweishih Leí un poco más sobre esto , y me gustaría que la solución aquí fuera establecer zero_division=0.0
para todos nuestros objetivos de precisión y f1 (binarios y multiclase).
Explicación
La precisión es n_true_pos / (n_true_pos + n_false_pos)
. Entonces, si el modelo nunca predice una etiqueta en particular en la división de datos en cuestión, no habrá ningún positivo verdadero o falso para esa etiqueta y, por lo tanto, habrá una división entre 0. Lo mismo ocurre con f1.
Argumento
Supongamos que hacemos un buen trabajo al equilibrar nuestras clases (que actualmente no lo hacemos, pero es un tema separado, # 194 # 457). Si es así, es muy poco probable que las divisiones de entrenamiento o validación contengan pocas instancias de una clase en particular. Y si podemos suponer eso, y el modelo todavía no hace predicciones para una etiqueta en particular, yo diría que es un modelo deficiente y, por lo tanto, deberíamos darle la puntuación más baja posible, que tanto para precisión como para f1 es 0.
¿Suena bien?
Ejemplo
In [38]: import numpy as np
In [39]: import sklearn.metrics
In [40]: y_true = np.array([0, 0, 0, 0, 1])
In [41]: y_pred = np.array([0, 0, 0, 0, 0])
In [42]: sklearn.metrics.precision_score(y_true, y_pred)
/Users/dylan.sherry/.pyenv/versions/3.8.2/envs/evalml/lib/python3.8/site-packages/sklearn/metrics/_classification.py:1272: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
Out[42]: 0.0
In [43]: sklearn.metrics.precision_score(y_true, y_pred, zero_division=0.0)
Out[43]: 0.0
@dsherry tiene sentido para mí. Creo que eso es lo que estamos haciendo en este momento, pero también con la advertencia (ya que de forma predeterminada es "advertir", que se establece en 0 y también publica advertencias).
@jeremyliweishih ¡sí!
Tomando esto de