Evalml: Sklearn UndefinedMetric-Warnung von stdout unterdrücken (F1-Score)

Erstellt am 2. März 2020  ·  6Kommentare  ·  Quelle: alteryx/evalml

Durch den Verlauf von Trainingsmodellen bekomme ich solche Warnungen

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

Mit so einem Anruf kann ich es gezielter auslösen

from evalml.objectives import F1

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

In Bezug auf die Handhabung. Hier ist was mir in den Sinn kommt

  1. Völlig stumm während des Automl-Suchvorgangs. Ersetzen Sie die Punktzahl durch nan oder die schlechteste mögliche Punktzahl für die Metrik. vielleicht speichern wir die Fehlermeldungen dann irgendwo im Ergebniswörterbuch
  2. Machen Sie eine sauberere Warnmeldung, die nicht mehrere Zeilen umfasst
enhancement

Alle 6 Kommentare

Ja, wir sollten das beheben. Im Allgemeinen sollten wir nicht zulassen, dass etwas auf stdout ausgegeben wird, es sei denn, unser Code tut dies.

Ich frage mich, ob das mit #311 zusammenhängt.

Ich denke, wir sollten Ihre beiden Vorschläge machen: diese sklearn stdout-Ausgabe unterdrücken und wenn möglich auch unsere eigene Warnmeldung schreiben.

@christopherbunn RE Sie erwähnen dies in der Besprechung, sollte dies als In

@christopherbunn @jeremyliweishih Ich habe noch etwas darüber gelesen und möchte, dass die Lösung hier zero_division=0.0 für alle unsere Präzisions- und f1-Ziele (binär und multiclass) festlegt.

Erläuterung
Präzision ist n_true_pos / (n_true_pos + n_false_pos) . Wenn das Modell also bei der fraglichen Datenaufteilung niemals ein bestimmtes Label vorhersagt, gibt es für dieses Label keine echten oder falschen positiven Ergebnisse, und daher erfolgt eine Division durch 0. Ähnliches gilt für f1.

Streit
Nehmen wir an, wir machen einen guten Job beim Ausbalancieren unserer Klassen (was wir derzeit nicht tun, aber ein separates Thema ist, #194 #457 ). Wenn dies der Fall ist, ist es sehr unwahrscheinlich, dass die Trainings- oder Validierungsaufteilungen wenige Instanzen einer bestimmten Klasse enthalten. Und wenn wir davon ausgehen können und das Modell immer noch keine Vorhersagen für ein bestimmtes Label macht, würde ich argumentieren, dass es ein schlechtes Modell ist, und deshalb sollten wir ihm die niedrigstmögliche Punktzahl geben, die sowohl für Präzision als auch für f1 0 ist.

Klingt gut?

Beispiel

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 macht für mich Sinn. Ich denke, das machen wir gerade, aber auch mit der Warnung (da es standardmäßig auf "warn" steht, das auf 0 gesetzt wird und auch Warnungen ausgibt)

@jeremyliweishih ja!

Holen Sie sich das von @christopherbunn, damit wir es diese Woche zusammenführen können, während er mit seinem Finale kämpft :)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen