Skip to content

Wie berechnet man Präzision, Recall, Genauigkeit und f1-Score für den Multiklassenfall mit Scikit Learn?

Nachdem wir in mehreren Repositories und Webseiten gesucht haben, haben wir am Ende die Auflösung gefunden, die wir Ihnen später zeigen werden.

Lösung:

Ich denke, es gibt eine Menge Verwirrung darüber, welche Gewichte für was verwendet werden. Ich bin mir nicht sicher, ob ich genau weiß, was Sie stört, also werde ich verschiedene Themen abdecken, haben Sie Geduld mit mir ;).

Klasse Gewichte

Die Gewichte aus dem class_weight Parameter werden verwendet, um den Klassifikator zu trainieren.
Sie werden nicht in der Berechnung einer der Metriken verwendet, die Sie verwenden: Bei unterschiedlichen Klassengewichten werden die Zahlen unterschiedlich sein, einfach weil der Klassifikator unterschiedlich ist.

Grundsätzlich werden in jedem scikit-learn-Klassifikator die Klassengewichte verwendet, um dem Modell mitzuteilen, wie wichtig eine Klasse ist. Das bedeutet, dass der Klassifikator während des Trainings zusätzliche Anstrengungen unternimmt, um die Klassen mit hohen Gewichten richtig zu klassifizieren.
Wie sie das tun, ist algorithmusspezifisch. Wenn Sie Einzelheiten über die Funktionsweise von SVC erfahren möchten und die Dokumentation für Sie keinen Sinn ergibt, können Sie dies gerne erwähnen.

Die Metriken

Wenn Sie einen Klassifikator haben, möchten Sie wissen, wie gut er arbeitet.
Hier können Sie die von Ihnen erwähnten Metriken verwenden: accuracy, recall_score, f1_score...

Wenn die Klassenverteilung unausgewogen ist, ist die Genauigkeit in der Regel eine schlechte Wahl, da Modelle, die nur die häufigste Klasse vorhersagen, hohe Punktzahlen erhalten.

Ich werde nicht auf alle diese Metriken eingehen, stelle aber fest, dass, mit Ausnahme von accuracynatürlich auf Klassenebene angewandt werden: wie man hier sehen kann print eines Klassifizierungsberichts sehen können, werden sie für jede Klasse definiert. Sie beruhen auf Konzepten wie true positives oder . false negative die es erforderlich machen, zu definieren, welche Klasse die positiv ist.

             precision    recall  f1-score   support

          0       0.65      1.00      0.79        17
          1       0.57      0.75      0.65        16
          2       0.33      0.06      0.10        17
avg / total       0.52      0.60      0.51        50

Die Warnung

F1 score:/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:676: DeprecationWarning: The 
default `weighted` averaging is deprecated, and from version 0.18, 
use of precision, recall or F-score with multiclass or multilabel data  
or pos_label=None will result in an exception. Please set an explicit 
value for `average`, one of (None, 'micro', 'macro', 'weighted', 
'samples'). In cross validation use, for instance, 
scoring="f1_weighted" instead of scoring="f1".

Sie erhalten diese Warnung, weil Sie den f1-Score, Recall und Precision verwenden, ohne zu definieren, wie sie berechnet werden sollen!
Die Frage könnte umformuliert werden: Wie geben Sie aus dem obigen Klassifizierungsbericht eine globale Zahl für den f1-Score?
Man könnte:

  1. Nehmen Sie den Durchschnitt des f1-Scores für jede Klasse: das ist die avg / total Ergebnis oben. Man nennt es auch Makro Mittelwertbildung.
  2. Berechnen Sie den f1-Score anhand der Gesamtzahl der wahr-positiven/falsch-negativen Ergebnisse usw. (Sie addieren die Anzahl der wahr-positiven/falsch-negativen Ergebnisse für jede Klasse). Aka Mikro Mittelwertbildung.
  3. Berechnen Sie einen gewichteten Durchschnitt des f1-Scores. Mit 'weighted' in scikit-learn wird der f1-Score nach der Unterstützung der Klasse gewichtet: je mehr Elemente eine Klasse hat, desto wichtiger ist der f1-Score für diese Klasse in der Berechnung.

Dies sind 3 der Optionen in scikit-learn, die Warnung ist dazu da, um Ihnen zu sagen eine auswählen muss. Du musst also eine average Argument für die Score-Methode angeben.

Welche Methode Sie wählen, hängt davon ab, wie Sie die Leistung des Klassifizierers messen wollen: Bei der Makro-Mittelung wird beispielsweise das Ungleichgewicht zwischen den Klassen nicht berücksichtigt, und der f1-Score der Klasse 1 ist genauso wichtig wie der f1-Score der Klasse 5. Verwendet man jedoch die gewichtete Mittelwertbildung, so erhält die Klasse 5 mehr Bedeutung.

Die gesamte Argument-Spezifikation in diesen Metriken ist in scikit-learn im Moment nicht sehr klar, sie wird laut der Dokumentation in Version 0.18 besser werden. Sie entfernen einige nicht offensichtliche Standardverhalten und geben Warnungen aus, damit die Entwickler es bemerken.

Berechnung von Scores

Der letzte Punkt, den ich erwähnen möchte (Sie können ihn gerne überspringen, wenn er Ihnen bekannt ist), ist, dass Bewertungen nur dann sinnvoll sind, wenn sie aus Daten berechnet werden, die der Klassifikator noch nie gesehen hat.
Dies ist äußerst wichtig, da jede Bewertung, die man für Daten erhält, die bei der Anpassung des Klassifikators verwendet wurden, völlig irrelevant ist.

Hier ist eine Möglichkeit, dies zu tun, indem man StratifiedShuffleSplit, die eine zufällige Aufteilung der Daten (nach dem Mischen) ergibt, bei der die Label-Verteilung erhalten bleibt.

from sklearn.datasets import make_classification
from sklearn.cross_validation import StratifiedShuffleSplit
from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, classification_report, confusion_matrix

# We use a utility to generate artificial classification data.
X, y = make_classification(n_samples=100, n_informative=10, n_classes=3)
sss = StratifiedShuffleSplit(y, n_iter=1, test_size=0.5, random_state=0)
for train_idx, test_idx in sss:
    X_train, X_test, y_train, y_test = X[train_idx], X[test_idx], y[train_idx], y[test_idx]
    svc.fit(X_train, y_train)
    y_pred = svc.predict(X_test)
    print(f1_score(y_test, y_pred, average="macro"))
    print(precision_score(y_test, y_pred, average="macro"))
    print(recall_score(y_test, y_pred, average="macro"))    

Ich hoffe, das hilft.

Viele sehr detaillierte Antworten hier, aber ich glaube nicht, dass du die richtigen Fragen beantwortest. So wie ich die Frage verstehe, gibt es zwei Anliegen:

  1. Wie kann ich ein Mehrklassenproblem bewerten?
  2. Wie gehe ich mit unausgewogenen Daten um?

1.

Sie können die meisten Scoring-Funktionen in Scikit-Learn sowohl bei Mehrklassenproblemen als auch bei Einklassenproblemen verwenden. Ex.:

from sklearn.metrics import precision_recall_fscore_support as score

predicted = [1,2,3,4,5,1,2,1,1,4,5] 
y_test = [1,2,3,4,5,1,2,1,1,4,1]

precision, recall, fscore, support = score(y_test, predicted)

print('precision: {}'.format(precision))
print('recall: {}'.format(recall))
print('fscore: {}'.format(fscore))
print('support: {}'.format(support))

Auf diese Weise erhält man greifbare und interpretierbare Zahlen für jede der Klassen.

| Label | Precision | Recall | FScore | Support |
|-------|-----------|--------|--------|---------|
| 1     | 94%       | 83%    | 0.88   | 204     |
| 2     | 71%       | 50%    | 0.54   | 127     |
| ...   | ...       | ...    | ...    | ...     |
| 4     | 80%       | 98%    | 0.89   | 838     |
| 5     | 93%       | 81%    | 0.91   | 1190    |

Dann ...

2.

... können Sie feststellen, ob die unausgewogenen Daten überhaupt ein Problem darstellen. Wenn das Scoring für die weniger vertretenen Klassen (Klasse 1 und 2) niedriger ist als für die Klassen mit mehr Trainingsstichproben (Klasse 4 und 5), dann wissen Sie, dass die unausgewogenen Daten tatsächlich ein Problem darstellen, und Sie können entsprechend handeln, wie in einigen der anderen Antworten in diesem Thread beschrieben.
Wenn jedoch die gleiche Klassenverteilung in den Daten vorhanden ist, die Sie vorhersagen wollen, sind Ihre unausgewogenen Trainingsdaten ein guter Repräsentant der Daten, und daher ist die Unausgewogenheit eine gute Sache.

Frage gestellt

Antwort auf die Frage "Welche Metrik sollte für die Mehrklassenklassifikation mit unausgewogenen Daten verwendet werden?": Macro-F1-measure.
Makro-Präzision und Makro-Recall können auch verwendet werden, aber sie sind nicht so leicht zu interpretieren wie für die binäre Klassifizierung, sie sind bereits in F-measure enthalten, und überflüssige Metriken erschweren den Vergleich von Methoden, die Abstimmung von Parametern usw.

Mikro-Mittelwerte reagieren empfindlich auf Klassenungleichgewicht: Wenn Ihre Methode z.B. für die häufigsten Labels gut funktioniert und andere völlig durcheinanderbringt, zeigen mikro-gemittelte Metriken gute Ergebnisse.

Die gewichtete Mittelwertbildung ist für unausgewogene Daten nicht gut geeignet, da sie nach der Anzahl der Bezeichnungen gewichtet. Außerdem ist sie zu schwer interpretierbar und unpopulär: In der folgenden sehr ausführlichen Übersicht, die ich dringend empfehle, durchzusehen, wird eine solche Mittelwertbildung nicht erwähnt:

Sokolova, Marina, und Guy Lapalme. "A systematic analysis of
performance measures for classification tasks." Information Processing
& Management 45.4 (2009): 427-437.

Anwendungsspezifische Frage

Aber um auf Ihre Aufgabe zurückzukommen, würde ich 2 Themen recherchieren:

  1. Metriken, die üblicherweise für deine spezifische Aufgabe verwendet werden - es erlaubt (a)
    Ihre Methode mit anderen zu vergleichen und zu verstehen, ob Sie etwas falsch machen
    und (b) dies nicht selbst zu erforschen und die Ergebnisse anderer
    die Ergebnisse eines anderen zu verwenden;
  2. Kosten der verschiedenen Fehler Ihrer Methoden - z.B.
    z.B. kann der Anwendungsfall Ihrer Anwendung auf 4- und 5-Sterne-Bewertungen beruhen
    Bewertungen - in diesem Fall sollte eine gute Metrik nur diese 2
    Labels.

Häufig verwendete Metriken.
Wie ich nach Durchsicht der Literatur feststellen kann, gibt es 2 Hauptbewertungsmetriken:

  1. Genauigkeit, die z.B. verwendet wird in

Yu, April, und Daryl Chang. "Multiclass Sentiment Prediction using
Yelp Business."

(Link) - beachten Sie, dass die Autoren mit fast der gleichen Verteilung der Bewertungen arbeiten, siehe Abbildung 5.

Pang, Bo, and Lillian Lee. "Seeing Stars: Exploiting class
Beziehungen für die Kategorisierung von Stimmungen in Bezug auf Bewertungsskalen
scales." Proceedings of the 43rd Annual Meeting on Association for
Computational Linguistics. Vereinigung für Computerlinguistik,
2005.

(Link)

  1. MSE (oder, seltener, mittlerer absoluter Fehler - MAE) - siehe z.B.,

Lee, Moontae, and R. Grafe. "Multiclass Sentiment Analysis with
restaurant reviews." Final Projects from CS N 224 (2010).

(Link) - sie untersuchen sowohl die Genauigkeit als auch den MSE, wobei sie letzteren für besser halten.

Pappas, Nikolaos, Rue Marconi, und Andrei Popescu-Belis. "Erläutern
the Stars: Weighted Multiple-Instance Learning for Aspect-Based
Sentiment Analysis." Proceedings of the 2014 Conference on Empirical
Methods In Natural Language Processing. No. EPFL-CONF-200899. 2014.

(Link) - sie verwenden scikit-learn für die Evaluierung und die Grundlinienansätze und geben an, dass ihr Code verfügbar ist.e; Ich kann ihn jedoch nicht finden, also wenn Sie ihn brauchen, schreiben Sie einen Brief an die Autoren, die Arbeit ist ziemlich neu und scheint in Python geschrieben zu sein.

Kosten der verschiedenen Fehler.
Wenn es dir mehr darum geht, grobe Fehler zu vermeiden, z.B. eine 1-Stern-Rezension einer 5-Stern-Rezension zuzuordnen oder ähnliches, dann schau dir MSE an;
Wenn der Unterschied wichtig ist, aber nicht so sehr, versuchen Sie MAE, da es nicht quadratisch diff;
Ansonsten bleiben Sie bei Accuracy.

Über Ansätze, nicht über Metriken

Versuchen Sie es mit Regressionsansätzen, z. B. SVR, da diese im Allgemeinen besser abschneiden als Multiklassenklassifizierer wie SVC oder OVA SVM.

Hier sind die Kommentare und Bewertungen

Sie können unsere Inhalte aufwerten, indem Sie mit Ihrer Dolmetschererfahrung helfen.



Nutzen Sie unsere Suchmaschine

Suche
Generic filters

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.