web-dev-qa-db-de.com

UndefinedMetricWarning: Der F-Score ist schlecht definiert und wird in Labels ohne vorhergesagte Stichproben auf 0,0 gesetzt

Ich bekomme diesen seltsamen Fehler:

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)`

aber dann wird der f-score beim ersten Mal gedruckt: 

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

Beim zweiten Mal gibt es die Punktzahl ohne Fehler. Warum das?

>>> 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

Warum gibt es auch eine nachfolgende 'precision', 'predicted', average, warn_for)-Fehlermeldung? Es gibt keine offene Klammer. Warum endet sie mit einer schließenden Klammer? Ich verwende sklearn 0.18.1 mit Python 3.6.0 in einer Conda-Umgebung unter Windows 10.

Ich habe auch hier angesehen und weiß nicht, ob es sich um denselben Fehler handelt. Dieser SO post hat auch keine Lösung.

23
Sticky

Wie in den Kommentaren erwähnt, werden einige Beschriftungen in y_true nicht in y_pred angezeigt. In diesem Fall wird das Label '2' niemals vorhergesagt:

>>> set(y_test) - set(y_pred)
{2}

Dies bedeutet, dass für dieses Label kein F-Score berechnet werden muss. Daher wird der F-Score für diesen Fall mit 0,0 bewertet. Da Sie einen Durchschnittswert der Punktzahl angefordert haben, müssen Sie berücksichtigen, dass eine Punktzahl von 0 in die Berechnung einbezogen wurde. Aus diesem Grund zeigt Ihnen scikit-learn diese Warnung.

Dies bringt mich dazu, dass Sie den Fehler kein zweites Mal sehen. Wie ich bereits erwähnt habe, ist dies ein warning, der anders behandelt wird als ein Fehler in Python. In den meisten Umgebungen wird standardmäßig eine bestimmte Warnung nur einmal angezeigt. Dieses Verhalten kann geändert werden:

import warnings
warnings.filterwarnings('always')  # "error", "ignore", "always", "default", "module" or "once"

Wenn Sie dies vor dem Importieren der anderen Module festlegen, wird die Warnung jedes Mal angezeigt, wenn Sie den Code ausführen. 

Es gibt keine Möglichkeit, diese Warnung beim ersten Mal zu sehen, abgesehen von der Einstellung von warnings.filterwarnings('ignore'). Was Sie can tun, entscheiden Sie, dass Sie sich nicht für die Bewertungen von Labels interessieren, die nicht vorhergesagt wurden, und dann explizit die Labels angeben, an denen Sie sind interessiert sind (was Labels sind) mindestens einmal vorhergesagt):

>>> metrics.f1_score(y_test, y_pred, average='weighted', labels=np.unique(y_pred))
0.91076923076923078

Die Warnung wird in diesem Fall nicht angezeigt.

44
Shovalt

Alternativ können Sie die folgenden Codezeilen verwenden

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

Dies sollte Ihre Warnung entfernen und Ihnen das gewünschte Ergebnis liefern

2

Die akzeptierte Antwort erklärt schon gut, warum die Warnung auftritt. Wenn Sie nur die Warnungen kontrollieren möchten, können Sie precision_recall_fscore_support verwenden. Es bietet ein (halboffizielles) Argument _warn_for_, mit dem die Warnungen stummgeschaltet werden können.

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

Wie bereits in einigen Kommentaren erwähnt, sollten Sie dies mit Vorsicht tun.

0
normanius

Wie in der Fehlermeldung angegeben, stammt die Methode, um den F-Score zu erhalten, aus dem "Classification" -Teil von sklearn - also von "Labels".

Haben Sie ein Regressionsproblem? Sklearn bietet eine "F-Score" -Methode für die Regression unter der Gruppe "Feature-Auswahl" an: http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_regression.html

Falls Sie ein Klassifizierungsproblem haben, scheint mir die Antwort von @ Shovalt richtig zu sein.

0
Tw UxTLi51Nus