Evalml: Supprimer l'avertissement sklearn UndefinedMetric de stdout (score F1)

Créé le 2 mars 2020  ·  6Commentaires  ·  Source: alteryx/evalml

Au cours des modèles d'entraînement, je reçois des avertissements comme celui-ci

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

Je suis capable de le déclencher plus spécifiquement avec un appel comme celui-ci

from evalml.objectives import F1

f1 = F1()
f1.score(y_predicted=[0, 0],
         y_true=[0, 1])

En termes de façons de gérer. Voici ce qui me vient à l'esprit

  1. Silence complet pendant le processus de recherche automatique. remplacez le score par nan ou le pire score possible pour la métrique. peut-être que nous stockons ensuite les messages d'erreur quelque part dans le dictionnaire des résultats
  2. Créez un message d'avertissement plus clair qui ne prend pas plusieurs lignes
enhancement

Tous les 6 commentaires

Ouais, on devrait arranger ça. En général, nous ne devrions pas autoriser l'impression de quoi que ce soit sur stdout à moins que notre code ne le fasse.

Je me demande si cela est lié à #311.

Je pense que nous devrions faire vos deux suggestions : supprimer cette sortie stdout de sklearn et également écrire notre propre message d'avertissement si possible.

@christopherbunn RE, vous l'avez mentionné lors de la réunion, cela devrait-il être marqué comme En cours ?

@christopherbunn @jeremyliweishih J'ai fait un peu plus de lecture à ce sujet , et j'aimerais que le correctif ici soit de définir zero_division=0.0 pour tous nos objectifs de précision et f1 (binaires et multiclasses).

Explication
La précision est de n_true_pos / (n_true_pos + n_false_pos) . Donc, si le modèle ne prédit jamais une étiquette particulière sur la division de données en question, il n'y aura pas de vrais ou de faux positifs pour cette étiquette, et donc il y aura une division par 0. Similaire est vrai pour f1.

Argument
Supposons que nous faisons un bon travail d'équilibrage de nos classes (ce que nous ne faisons pas actuellement, mais c'est un sujet séparé, #194 #457 ). Si tel est le cas, il est hautement improbable que les divisions de formation ou de validation contiennent peu d'instances d'une classe particulière. Et si nous pouvons supposer que, et que le modèle ne fait toujours aucune prédiction pour une étiquette particulière, je dirais que c'est un mauvais modèle, et donc nous devrions lui donner le score le plus bas possible, qui à la fois pour la précision et pour f1 est 0.

Ça sonne bien ?

Exemple

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 a du sens pour moi. Je pense que c'est ce que nous faisons en ce moment mais aussi avec l'avertissement (puisqu'il est par défaut "warn" qui met à 0 et publie également des avertissements)

@jeremyliweishih ouais !

Saisir ceci de @christopherbunn afin que nous puissions le fusionner cette semaine alors qu'il se

Cette page vous a été utile?
0 / 5 - 0 notes