Evalml: Suprimir la advertencia sklearn UndefinedMetric de stdout (puntuación F1)

Creado en 2 mar. 2020  ·  6Comentarios  ·  Fuente: alteryx/evalml

A lo largo de los modelos de entrenamiento, recibo advertencias como esta.

Screen Shot 2020-03-02 at 4 54 36 PM

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

  1. Silencio total durante el proceso de búsqueda automática. reemplace la puntuación con 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 resultados
  2. Cree un mensaje de advertencia más limpio que no ocupe varias líneas
enhancement

Todos 6 comentarios

Sí, 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

¿Fue útil esta página
0 / 5 - 0 calificaciones