Ich arbeite an einem Stimmungsanalyseproblem. Die Daten sehen folgendermaßen aus:
label instances
5 1190
4 838
3 239
1 204
2 127
Meine Daten sind also unausgeglichen, da 1190 instances
mit gekennzeichnet sind 5
. Für die Klassifizierung verwende ich den SVC von scikit . Das Problem ist, dass ich nicht weiß, wie ich meine Daten richtig ausgleichen soll, um die Präzision, den Rückruf, die Genauigkeit und den f1-Score für den Fall mit mehreren Klassen genau zu berechnen. Also habe ich folgende Ansätze ausprobiert:
Zuerst:
wclf = SVC(kernel='linear', C= 1, class_weight={1: 10})
wclf.fit(X, y)
weighted_prediction = wclf.predict(X_test)
print 'Accuracy:', accuracy_score(y_test, weighted_prediction)
print 'F1 score:', f1_score(y_test, weighted_prediction,average='weighted')
print 'Recall:', recall_score(y_test, weighted_prediction,
average='weighted')
print 'Precision:', precision_score(y_test, weighted_prediction,
average='weighted')
print '\n clasification report:\n', classification_report(y_test, weighted_prediction)
print '\n confussion matrix:\n',confusion_matrix(y_test, weighted_prediction)
Zweite:
auto_wclf = SVC(kernel='linear', C= 1, class_weight='auto')
auto_wclf.fit(X, y)
auto_weighted_prediction = auto_wclf.predict(X_test)
print 'Accuracy:', accuracy_score(y_test, auto_weighted_prediction)
print 'F1 score:', f1_score(y_test, auto_weighted_prediction,
average='weighted')
print 'Recall:', recall_score(y_test, auto_weighted_prediction,
average='weighted')
print 'Precision:', precision_score(y_test, auto_weighted_prediction,
average='weighted')
print '\n clasification report:\n', classification_report(y_test,auto_weighted_prediction)
print '\n confussion matrix:\n',confusion_matrix(y_test, auto_weighted_prediction)
Dritte:
clf = SVC(kernel='linear', C= 1)
clf.fit(X, y)
prediction = clf.predict(X_test)
from sklearn.metrics import precision_score, \
recall_score, confusion_matrix, classification_report, \
accuracy_score, f1_score
print 'Accuracy:', accuracy_score(y_test, prediction)
print 'F1 score:', f1_score(y_test, prediction)
print 'Recall:', recall_score(y_test, prediction)
print 'Precision:', precision_score(y_test, prediction)
print '\n clasification report:\n', classification_report(y_test,prediction)
print '\n confussion matrix:\n',confusion_matrix(y_test, prediction)
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".
sample_weight=sample_weight)
/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1172: 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".
sample_weight=sample_weight)
/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1082: 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".
sample_weight=sample_weight)
0.930416613529
Ich bekomme jedoch Warnungen wie diese:
/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1172:
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"
Wie kann ich mit meinen unausgeglichenen Daten richtig umgehen, um die Metriken des Klassifikators richtig zu berechnen?
python
machine-learning
nlp
artificial-intelligence
scikit-learn
new_with_python
quelle
quelle
average
im dritten Fall einen Parameter hinzufügen ?Antworten:
Ich denke, es gibt viel Verwirrung darüber, welche Gewichte für was verwendet werden. Ich bin mir nicht sicher, ob ich genau weiß, was dich stört, also werde ich verschiedene Themen behandeln, trage mich;).
Klassengewichte
Die Gewichte aus dem
class_weight
Parameter werden verwendet, um den Klassifikator zu trainieren . Sie werden bei der Berechnung der von Ihnen verwendeten Metriken nicht verwendet : Bei unterschiedlichen Klassengewichten sind die Zahlen einfach deshalb unterschiedlich, weil der Klassifizierer unterschiedlich ist.Grundsätzlich werden in jedem Scikit-Learn-Klassifikator die Klassengewichte verwendet, um Ihrem 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 machen, ist algorithmisch. Wenn Sie Details zur Funktionsweise von SVC wünschen und das Dokument für Sie keinen Sinn ergibt, können Sie dies gerne erwähnen.
Die Metriken
Sobald Sie einen Klassifikator haben, möchten Sie wissen, wie gut er funktioniert. Hier können Sie die Metriken verwenden Sie erwähnt:
accuracy
,recall_score
,f1_score
...Wenn die Klassenverteilung unausgeglichen ist, wird Genauigkeit normalerweise als schlechte Wahl angesehen, da Modelle, die nur die häufigste Klasse vorhersagen, hohe Punktzahlen erhalten.
Ich werde nicht alle diese Metriken detailliert beschreiben, aber beachten Sie, dass sie mit Ausnahme von
accuracy
natürlich auf Klassenebene angewendet werden: Wie Sie in diesemprint
Klassifizierungsbericht sehen können, werden sie für jede Klasse definiert. Sie stützen sich auf Konzepte wietrue positives
oderfalse negative
, bei denen definiert werden muss, welche Klasse die positive ist .Die Warnung
Sie erhalten diese Warnung, weil Sie den f1-Score, den Rückruf und die Präzision verwenden, ohne zu definieren, wie diese berechnet werden sollen! Die Frage könnte umformuliert werden: Wie geben Sie aus dem obigen Klassifizierungsbericht eine globale Zahl für den F1-Score aus? Du könntest:
avg / total
obige Ergebnis. Es wird auch als Makro- Mittelwertbildung bezeichnet.'weighted'
von scikit-learn wird der f1-Score durch die Unterstützung der Klasse gewichtet: Je mehr Elemente eine Klasse enthält, desto wichtiger ist der f1-Score für diese Klasse bei der Berechnung.Dies sind 3 der Optionen in Scikit-Learn. Die Warnung besagt, dass Sie eine auswählen müssen . Sie müssen also ein
average
Argument für die Bewertungsmethode angeben .Welche Sie wählen, hängt davon ab, wie Sie die Leistung des Klassifikators messen möchten: Beispielsweise berücksichtigt die Makro-Mittelung das Klassenungleichgewicht nicht, und der f1-Score der Klasse 1 ist genauso wichtig wie der f1-Score der Klasse 5. Wenn Sie jedoch eine gewichtete Mittelung verwenden, erhalten Sie für die Klasse 5 eine größere Bedeutung.
Die gesamte Argumentspezifikation in diesen Metriken ist in scikit-learn derzeit nicht sehr klar, sie wird in Version 0.18 laut den Dokumenten besser. Sie entfernen ein nicht offensichtliches Standardverhalten und geben Warnungen aus, damit Entwickler es bemerken.
Punktzahlen berechnen
Das Letzte, was ich erwähnen möchte (Sie können es gerne überspringen, wenn Sie sich dessen bewusst sind), ist, dass Punktzahlen nur dann von Bedeutung sind, wenn sie anhand von Daten berechnet werden, die der Klassifikator noch nie gesehen hat . Dies ist äußerst wichtig, da jede Bewertung, die Sie für Daten erhalten, die für die Anpassung des Klassifikators verwendet wurden, völlig irrelevant ist.
Hier ist eine Möglichkeit, dies zu tun, indem
StratifiedShuffleSplit
Sie eine zufällige Aufteilung Ihrer Daten (nach dem Mischen) erhalten, die die Etikettenverteilung beibehält.Hoffe das hilft.
quelle
class_weight={1:10}
bedeutet beispielsweise für Daten mit 3 Klassen?ValueError: The least populated class in y has only 1 member, which is too few. The minimum number of labels for any class cannot be less than 2.
. Es funktioniert gut mit dem Zugtest-Split, aber kann mir jemand helfen, warum ich diesen Fehler mit SSS erhalte? Vielen Dank.Viele sehr detaillierte Antworten hier, aber ich glaube nicht, dass Sie die richtigen Fragen beantworten. Soweit ich die Frage verstehe, gibt es zwei Bedenken:
1.
Sie können die meisten Bewertungsfunktionen in Scikit-Learn sowohl für Mehrklassenprobleme als auch für Einzelklassenprobleme verwenden. Ex.:
Auf diese Weise erhalten Sie für jede Klasse greifbare und interpretierbare Zahlen.
Dann...
2.
... können Sie feststellen, ob die unsymmetrischen Daten überhaupt ein Problem darstellen. Wenn die Bewertung für die weniger vertretenen Klassen (Klasse 1 und 2) niedriger ist als für die Klassen mit mehr Trainingsbeispielen (Klasse 4 und 5), wissen Sie, dass die unausgeglichenen Daten tatsächlich ein Problem darstellen, und können entsprechend handeln beschrieben in einigen der anderen Antworten in diesem Thread. Wenn jedoch in den Daten, für die Sie eine Vorhersage treffen möchten, dieselbe Klassenverteilung vorhanden ist, sind Ihre unausgeglichenen Trainingsdaten ein guter Vertreter der Daten, und daher ist die Unausgewogenheit eine gute Sache.
quelle
precision_recall_fscore_support
? Werden die Etiketten auf Bestellung gedruckt?average=None
die Beschriftungen fest und definieren Sie sie. Anschließend erhalten Sie für jede der angegebenen Beschriftungen die gesuchte Metrik.Gestellte Frage
Beantwortung der Frage „Welche Metrik sollte für die Klassifizierung mehrerer Klassen mit unausgeglichenen Daten verwendet werden?“: Makro-F1-Messung. Macro Precision und Macro Recall können ebenfalls verwendet werden, sind jedoch nicht so leicht zu interpretieren wie für die binäre Klassifizierung. Sie sind bereits in F-Measure integriert, und überschüssige Metriken erschweren den Methodenvergleich, die Parametereinstellung usw.
Mikro-Mittelung reagiert empfindlich auf Klassenungleichgewichte: Wenn Ihre Methode beispielsweise für die gängigsten Labels gut funktioniert und andere völlig durcheinander bringt, zeigen mikro-gemittelte Metriken gute Ergebnisse.
Die Mittelung der Gewichtung ist für unausgeglichene Daten nicht gut geeignet, da sie nach Anzahl der Etiketten gewichtet wird. Darüber hinaus ist es zu kaum interpretierbar und unbeliebt: Beispielsweise wird eine solche Mittelung in der folgenden sehr detaillierten Umfrage nicht erwähnt. Ich empfehle dringend, sie durchzusehen:
Anwendungsspezifische Frage
Um jedoch zu Ihrer Aufgabe zurückzukehren, würde ich zwei Themen untersuchen:
Häufig verwendete Metriken. Wie ich nach Durchsicht der Literatur schließen kann, gibt es zwei Hauptbewertungsmetriken:
( Link ) - Beachten Sie, dass die Autoren mit fast der gleichen Verteilung der Bewertungen arbeiten, siehe Abbildung 5.
( Link )
( Link ) - Sie untersuchen sowohl Genauigkeit als auch MSE, wobei letztere als besser angesehen werden
( Link ) - Sie verwenden Scikit-Learn für Evaluierungs- und Basisansätze und geben an, dass ihr Code verfügbar ist. Ich kann es jedoch nicht finden. Wenn Sie es brauchen, schreiben Sie einen Brief an die Autoren. Die Arbeit ist ziemlich neu und scheint in Python geschrieben zu sein.
Kosten für verschiedene Fehler . Wenn Sie mehr Wert darauf legen, grobe Fehler zu vermeiden, z. B. eine Bewertung von 1 bis 5 Sternen oder ähnliches vorzunehmen, schauen Sie sich MSE an. Wenn der Unterschied wichtig ist, aber nicht so sehr, versuchen Sie es mit MAE, da der Unterschied nicht quadratisch ist. Andernfalls bleiben Sie bei der Genauigkeit.
Über Ansätze, keine Metriken
Versuchen Sie es mit Regressionsansätzen, z. B. SVR , da diese Multiklassenklassifizierer wie SVC oder OVA SVM im Allgemeinen übertreffen.
quelle
Zunächst ist es etwas schwieriger, nur die Zählanalyse zu verwenden, um festzustellen, ob Ihre Daten unausgeglichen sind oder nicht. Zum Beispiel: 1 von 1000 positiven Beobachtungen ist nur ein Rauschen, ein Fehler oder ein Durchbruch in der Wissenschaft? Man weiß nie.
Es ist also immer besser, Ihr gesamtes verfügbares Wissen zu nutzen und seinen Status mit Bedacht zu wählen.
Okay, was ist, wenn es wirklich unausgeglichen ist?
Noch einmal - schauen Sie auf Ihre Daten. Manchmal finden Sie eine oder zwei Beobachtungen multipliziert mit hundert. Manchmal ist es nützlich, diese gefälschten Ein-Klassen-Beobachtungen zu erstellen.
Wenn alle Daten sauber sind, besteht der nächste Schritt darin, Klassengewichte im Vorhersagemodell zu verwenden.
Was ist also mit Metriken für mehrere Klassen?
Nach meiner Erfahrung wird normalerweise keine Ihrer Metriken verwendet. Es gibt zwei Hauptgründe.
Erstens: Es ist immer besser, mit Wahrscheinlichkeiten zu arbeiten als mit soliden Vorhersagen (denn wie sonst könnten Sie Modelle mit 0,9- und 0,6-Vorhersagen trennen, wenn beide dieselbe Klasse ergeben?)
Und zweitens: Es ist viel einfacher, Ihre Vorhersagemodelle zu vergleichen und neue zu erstellen diejenigen, die nur von einer guten Metrik abhängen.
Aus meiner Erfahrung könnte ich Logloss oder MSE empfehlen (oder nur quadratischen Fehler bedeuten).
Wie behebe ich sklearn-Warnungen?
Überschreiben Sie einfach (wie Yangjie bemerkte)
average
Parameter mit einem der folgenden Werte:'micro'
(Metriken global berechnen),'macro'
(Metriken für jedes Etikett berechnen) oder'weighted'
(wie Makro, jedoch mit automatischen Gewichten).Alle Ihre Warnungen wurden nach dem Aufrufen von Metrikfunktionen mit einem Standardwert angezeigt
average
,'binary'
der für die Vorhersage mehrerer Klassen ungeeignet ist.Viel Glück und viel Spaß beim maschinellen Lernen!
Bearbeiten:
Ich habe eine weitere Antwortempfehlung gefunden, um zu Regressionsansätzen (z. B. SVR) zu wechseln, denen ich nicht zustimmen kann. Soweit ich mich erinnere, gibt es nicht einmal eine Regression mit mehreren Klassen. Ja, es gibt eine Multilabel-Regression, die sehr unterschiedlich ist, und ja, es ist in einigen Fällen möglich, zwischen Regression und Klassifizierung zu wechseln (wenn die Klassen irgendwie sortiert sind), aber es ist ziemlich selten.
Was ich empfehlen würde (im Rahmen von Scikit-Learn), ist, ein anderes sehr leistungsfähiges Klassifizierungswerkzeug auszuprobieren: Gradientenverstärkung , Zufallswald (mein Favorit), KNeighbors und viele mehr.
Danach können Sie den arithmetischen oder geometrischen Mittelwert zwischen den Vorhersagen berechnen. Meistens erhalten Sie sogar noch bessere Ergebnisse.
quelle