Hoher Rückruf - Geringe Präzision für unausgeglichenen Datensatz

10

Ich habe derzeit Probleme beim Analysieren eines Tweet-Datasets mit Support-Vektor-Maschinen. Das Problem ist, dass ich einen unausgeglichenen Binärklassen-Trainingssatz habe (5: 2); Dies wird voraussichtlich proportional zur tatsächlichen Klassenverteilung sein. Bei der Vorhersage erhalte ich eine geringe Genauigkeit (0,47) für die Minderheitsklasse im Validierungssatz. Rückruf ist 0,88. Ich habe versucht, mehrere Über- und Unterabtastungsmethoden (durchgeführt am Trainingssatz) zu verwenden, die die Genauigkeit nicht verbesserten, da der Validierungssatz ebenfalls unausgeglichen ist, um die tatsächliche Klassenverteilung widerzuspiegeln. Ich habe auch verschiedene Kosten in die Support-Vektor-Maschine implementiert, was geholfen hat. Jetzt scheint es, dass ich meine Leistung nicht mehr verbessern kann.

Hat jemand von Ihnen einen Rat, was ich tun könnte, um meine Präzision zu verbessern, ohne meinen Rückruf zu beeinträchtigen? Hat jemand eine Ahnung, warum ich viel mehr falsch positive als falsch negative Ergebnisse erhalte (positiv ist die Minderheitsklasse)?

Filippo Scopel
quelle
3
Zumindest ein Teil des Problems besteht darin, das Modell auf der Grundlage einer falschen Bewertungsregel zu bewerten.
Sycorax sagt Reinstate Monica
Haben Sie mit "Oversampling- und Under-Sampling-Methoden" SMOTE (Synthetic Minority Over-Sampling Technique) ausprobiert? Aus meiner Erfahrung heraus hat es meine Klassifizierungsrate der Minderheitsklasse für einen unausgeglichenen 300: 1-Datensatz verbessert.
Matthew Lau
Hallo Matthew, danke für deine Antwort. Ich habe mehrere Oversampling-Undersampling- und sogar Ensembling-Methoden ausprobiert, einschließlich aller Arten von SMOTE-Techniken.
Filippo Scopel
2
Da Sie Scikit verwenden, versuchen Sie es mit gradientenverstärkten Bäumen in Ihren Daten. Sie erhalten wahrscheinlich sofort eine bessere AUC mit präzisem Rückruf. Wie Sie hervorheben, sind SVCs für nichts anderes als sehr kleine Datensätze wirklich praktisch.
Rinspy
1
Hallo Filippo! Ich beschäftige mich derzeit mit genau dem gleichen Problem, das Sie beschreiben :-) Ich habe alle üblichen Dinge ausprobiert (Über- / Unterabtastung, SMOTE, Klassengewicht) und sogar mehrere verschiedene Lernende ausprobiert (SVM, Random Forest, vollständig verbundene neuronale Netze), aber der Effekt ist überall gleich: hoher Rückruf der Minderheitsklasse nach Anwendung von SMOTE oder Klassengewicht, aber sehr geringe Präzision. Haben Sie am Ende eine Lösung gefunden?
u_b

Antworten:

6

Hat jemand eine Ahnung, warum ich viel mehr falsch positive als falsch negative Ergebnisse erhalte (positiv ist die Minderheitsklasse)? Vielen Dank im Voraus für Ihre Hilfe!

Weil positiv die Minderheitsklasse ist. Es gibt viele negative Beispiele, die zu falsch positiven Ergebnissen führen können. Umgekehrt gibt es weniger positive Beispiele, die zu falsch negativen Ergebnissen werden könnten.

=T.P.(T.P.+F.N.)

Die Empfindlichkeit (True Positive Rate) bezieht sich auf die False Positive Rate (1-Spezifität), wie durch eine ROC-Kurve dargestellt. In einem Extremfall nennen Sie jedes Beispiel positiv und haben eine 100% ige Empfindlichkeit mit 100% FPR. Bei einem anderen nennen Sie kein Beispiel positiv und haben eine Empfindlichkeit von 0% mit einem FPR von 0%. Wenn die positive Klasse die Minderheit ist, verursacht selbst ein relativ kleiner FPR (den Sie möglicherweise haben, weil Sie einen hohen Rückruf = Empfindlichkeit = TPR haben) eine hohe Anzahl von FPs (weil es so viele negative Beispiele gibt).

Schon seit

=T.P.(T.P.+F.P.)

Selbst bei einem relativ niedrigen FPR wird das FP das TP überwältigen, wenn die Anzahl der negativen Beispiele viel größer ist.

Alternative,

C.+

Ö+

P.(Ö+|C.+)=P.(C.+|Ö+)P.(Ö+)P.(C.+)

P (O +) ist niedrig, wenn die positive Klasse klein ist.

Hat jemand von Ihnen einen Rat, was ich tun könnte, um meine Präzision zu verbessern, ohne meinen Rückruf zu beeinträchtigen?

Wie von @rinspy erwähnt, funktioniert GBC meiner Erfahrung nach gut. Es ist jedoch langsamer als SVC mit einem linearen Kernel, aber Sie können sehr flache Bäume erstellen, um es zu beschleunigen. Außerdem können weitere Funktionen oder Beobachtungen hilfreich sein (z. B. gibt es möglicherweise einige derzeit nicht analysierte Funktionen, die in allen aktuellen FP immer auf einen bestimmten Wert eingestellt sind).

Es kann sich auch lohnen, ROC-Kurven und Kalibrierungskurven zu zeichnen. Es kann vorkommen, dass der Klassifikator, obwohl er eine geringe Genauigkeit aufweist, zu einer sehr nützlichen Wahrscheinlichkeitsschätzung führen kann. Nur zu wissen, dass eine Festplatte eine um das 500-fache erhöhte Ausfallwahrscheinlichkeit aufweist, obwohl die absolute Wahrscheinlichkeit relativ gering ist, kann eine wichtige Information sein.

Eine geringe Genauigkeit bedeutet im Wesentlichen, dass der Klassifizierer viele falsch positive Ergebnisse zurückgibt. Dies ist jedoch möglicherweise nicht so schlimm, wenn ein falsches Positiv billig ist.

user0
quelle
2

Methoden zum Ausprobieren:

UnderSampling:

Ich schlage vor, Under-Sampling-Techniken zu verwenden und dann Ihren Klassifikator zu trainieren.

Imbalanced Learning bietet eine API für den Scikit-Lernstil für unausgeglichene Datensätze und sollte ein guter Ausgangspunkt für Stichproben und zum Ausprobieren von Algorithmen sein.

Bibliothek : https://imbalanced-learn.readthedocs.io/en/stable/

Rangbasierte SVM:

Dies hat gezeigt, dass sich der Rückruf für hochpräzise Systeme verbessert, und wird von Google zum Erkennen fehlerhafter Werbung verwendet. Ich empfehle es auszuprobieren.

Referenzpapier für SVM:

https://static.googleusercontent.com/media/research.google.com/de//pubs/archive/37195.pdf

Vibhu Jawa
quelle
1

Der Standardansatz wäre, Ihren Fehler basierend auf der Klassenhäufigkeit zu gewichten. Wenn Sie dies beispielsweise in Python mit sklearn getan haben:

model = sklearn.svm.SVC(C=1.0, kernel='linear', class_weight='balanced')
model.fit(X, y)
mprat
quelle
Hallo mprat, danke für deine Antwort. Ich habe bereits class_weight = balance verwendet.
Filippo Scopel