web-dev-qa-db-fra.com

UndefinedMetricWarning: F-score est mal défini et étant fixé à 0,0 dans les étiquettes sans échantillons prédits

Je reçois cette erreur bizarre:

classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.
'precision', 'predicted', average, warn_for)`

mais ensuite, il affiche également le score f lors de ma première course: 

metrics.f1_score(y_test, y_pred, average='weighted')

La deuxième fois que je cours, il fournit le score sans erreur. Pourquoi donc?

>>> y_pred = test.predict(X_test)
>>> y_test
array([ 1, 10, 35,  9,  7, 29, 26,  3,  8, 23, 39, 11, 20,  2,  5, 23, 28,
       30, 32, 18,  5, 34,  4, 25, 12, 24, 13, 21, 38, 19, 33, 33, 16, 20,
       18, 27, 39, 20, 37, 17, 31, 29, 36,  7,  6, 24, 37, 22, 30,  0, 22,
       11, 35, 30, 31, 14, 32, 21, 34, 38,  5, 11, 10,  6,  1, 14, 12, 36,
       25,  8, 30,  3, 12,  7,  4, 10, 15, 12, 34, 25, 26, 29, 14, 37, 23,
       12, 19, 19,  3,  2, 31, 30, 11,  2, 24, 19, 27, 22, 13,  6, 18, 20,
        6, 34, 33,  2, 37, 17, 30, 24,  2, 36,  9, 36, 19, 33, 35,  0,  4,
        1])
>>> y_pred
array([ 1, 10, 35,  7,  7, 29, 26,  3,  8, 23, 39, 11, 20,  4,  5, 23, 28,
       30, 32, 18,  5, 39,  4, 25,  0, 24, 13, 21, 38, 19, 33, 33, 16, 20,
       18, 27, 39, 20, 37, 17, 31, 29, 36,  7,  6, 24, 37, 22, 30,  0, 22,
       11, 35, 30, 31, 14, 32, 21, 34, 38,  5, 11, 10,  6,  1, 14, 30, 36,
       25,  8, 30,  3, 12,  7,  4, 10, 15, 12,  4, 22, 26, 29, 14, 37, 23,
       12, 19, 19,  3, 25, 31, 30, 11, 25, 24, 19, 27, 22, 13,  6, 18, 20,
        6, 39, 33,  9, 37, 17, 30, 24,  9, 36, 39, 36, 19, 33, 35,  0,  4,
        1])
>>> metrics.f1_score(y_test, y_pred, average='weighted')
C:\Users\Michael\Miniconda3\envs\snowflakes\lib\site-packages\sklearn\metrics\classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.
  'precision', 'predicted', average, warn_for)
0.87282051282051276
>>> metrics.f1_score(y_test, y_pred, average='weighted')
0.87282051282051276
>>> metrics.f1_score(y_test, y_pred, average='weighted')
0.87282051282051276

Aussi, pourquoi y a-t-il un message d'erreur final 'precision', 'predicted', average, warn_for)? Il n'y a pas de parenthèse ouverte, alors pourquoi se termine-t-il par une parenthèse fermante? J'exécute sklearn 0.18.1 avec Python 3.6.0 dans un environnement Conda sous Windows 10.

J'ai aussi regardé ici et je ne sais pas si c'est le même bug. Ce SO post n’a pas de solution non plus.

23
Sticky

Sinon, vous pouvez utiliser les lignes de code suivantes

from sklearn.metrics import f1_score
metrics.f1_score(y_test, y_pred, labels=np.unique(y_pred))

Cela devrait supprimer votre avertissement et vous donner le résultat que vous vouliez

2

La réponse acceptée explique déjà bien pourquoi l'avertissement se produit. Si vous voulez simplement contrôler les avertissements, vous pouvez utiliser precision_recall_fscore_support . Il offre un argument (semi-officiel) _warn_for_ qui pourrait être utilisé pour mettre les avertissements en sourdine.

_(_, _, f1, _) = metrics.precision_recall_fscore_support(y_test, y_pred,
                                                        average='weighted', 
                                                        warn_for=Tuple())
_

Comme mentionné dans certains commentaires, utilisez-le avec précaution.

0
normanius

Comme l'indique le message d'erreur, la méthode utilisée pour obtenir le score F provient de la partie "Classification" de sklearn, d'où le terme "étiquettes".

Avez-vous un problème de régression? Sklearn fournit une méthode de "score F" pour la régression dans le groupe "sélection de caractéristiques": http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_regression.html

Au cas où vous auriez un problème de classification, la réponse de @ Shovalt me ​​semble correcte.

0
Tw UxTLi51Nus