Multiclass Classification und log_loss

Sep 05 2020

Ich hoffe, ich kann dies mit wenigen Codezeilen / Erklärungen klarstellen.

Ich habe eine 16K-Liste von Texten mit über 30 verschiedenen Klassen, die durch verschiedene Klassifikatoren geführt wurden. Meine Vorhersage und die Grundwahrheit stimmen im Durchschnitt mit 94% überein.

Ich bin jetzt, nachdem ich etwas extra gemessen habe (nicht sicher, was ich zusätzlich zu einem F1_score-Minimum messen soll, da ich noch lerne) und bin auf den log_loss von sklearn gestoßen, was dazu führt, dass ich verstehe, dass er zwischen 0 und 1 liegt. Wann lief gegen meine Vorhersage, aber die Ergebnisse sind 1,48xxx, was in der Tat höher ist.

Beim Versuch zu verstehen, was los war.

Ich habe das Ergebnis von ComplementNB.predict_proba untersucht, das für log_loss erforderlich ist, und der Wert stimmt mit dem meines Vorhersagearrays überein.

Unten ein Code:

from sklearn.metrics import log_loss

y = ... # This is my array of value that is my source of truth

labels = numpy.unique(y)
label_ary = [idx for gt in y for idx, lbl in enumerate(labels) if gt == lbl]

print(f'The log loss is {log_loss(label_ary, clf.predict_proba(X.toarray()))}')

Unabhängig davon, ob ich label_ary oder y verwende, erhalte ich unter beiden Umständen den gleichen Wert, was bedeutet, dass bereits eine Konvertierung innerhalb von log_loss erfolgt.

Ich bin mir nicht sicher, ob ich die Ergebnisse oder die Besonderheiten der Funktion falsch interpretiere.

Was mache ich falsch? Vielen Dank

Antworten

1 YuseqYaseq Sep 05 2020 at 22:17

Interpretierbarkeit des Protokollverlusts

Der Protokollverlust liegt nicht unbedingt zwischen dem Bereich [0; 1] - Es wird nur erwartet, dass die Eingabe in diesem Bereich liegt. Schauen Sie sich dieses Beispiel an:$$ y_{pred} = 0.1 \\ y_{true} = 1.0 \\ log\_loss = -(log(y_{pred}) * y_{true} + (1 - y_{true}) * log(1 - y_{pred})) = -(log(0.1) * 1.0) = 2.302 $$Im Extremfall kann der Protokollverlust sogar unendlich sein. Es ist also nichts Falsches an dem Code und es gibt auch nicht viele interessante Dinge, die Sie aus der Tatsache ableiten können, dass log_loss kleiner oder größer als 1 ist. Was Sie damit tun können, ist dasselbe wie mit jeder Verlustfunktion - vergleichen Sie es mit ein ähnliches Modell mit unterschiedlichen Hyperparametern und wählen Sie das Modell mit dem niedrigsten durchschnittlichen Verlust als Ihr bestes Modell (ein Prozess, der als Hyperparameteroptimierung bezeichnet wird).

Wann sollte man den Verlust einsetzen und wann wird f1 erzielt?

Let's say you have a dataset and a classification problem which you want to solve. You know that you can create a statistical model which returns probabilities of a given class. You also know that there is (hypothetically) an algorithm which classifies based on some heuristics which requires no training. You would like to know which of these is the best for your problem. What you do, if we simplify a little, is:

  1. Split your dataset to train, validation and test sets.
  2. Use your train set to train the model
  3. While training the model calculate loss for train and validation set in each epoch (if you're not using deep neural networks you can and should use cross validation).
  4. Zeichnen Sie den Verlust für Zug und Validierungssatz und prüfen Sie, ob Ihr Modell voreingenommen (hoher Zugverlust und hoher Validierungsverlust) oder überangepasst (niedriger Zugverlust und hoher Validierungsverlust) ist. Je geringer der Validierungsverlust, desto besser.
  5. Führen Sie 3. und 4. mehrmals für verschiedene Hyperparameter aus und wählen Sie einen mit dem geringsten Verlust an Validierungssätzen aus. Sie haben jetzt ein geschultes statistisches Modell.
  6. Verwenden Sie nun den f1-Score, um Ihr Modell mit dem Algorithmus zu vergleichen, den Sie ebenfalls kennen. Je höher die Punktzahl, desto besser. Beachten Sie, dass unter der Annahme, dass der Algorithmus Klassen und keine Wahrscheinlichkeiten zurückgibt, wenn er auch nur für ein Beispiel falsch ist, seine Protokollverlustfunktion gleich unendlich ist. Aus diesem Grund können wir den Protokollverlust nicht als Metrik verwenden, um diese beiden Methoden zu vergleichen.

In short, you should use loss as a metric during training/validation process to optimize parameters and hyperparameters and f1 score (and possibly many more metrics for example Area Under Curve) during test process to select the best method to solve your problem. This way it's possible to compare different methods to solve the problem - even ones which don't use machine learning at all.