Au cours des modèles d'entraînement, je reçois des avertissements comme celui-ci
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
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ésultatsOuais, 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