sklearn - Überanpassungsproblem


8

Ich suche nach Empfehlungen, wie ich mein aktuelles Problem des maschinellen Lernens am besten lösen kann

Der Umriss des Problems und was ich getan habe, ist wie folgt:

  • Ich habe mehr als 900 Versuche mit EEG-Daten, wobei jeder Versuch 1 Sekunde lang ist. Die Grundwahrheit ist für jeden bekannt und klassifiziert Zustand 0 und Zustand 1 (40-60% Aufteilung)
  • Jeder Versuch durchläuft eine Vorverarbeitung, bei der ich die Leistung bestimmter Frequenzbänder filtere und extrahiere. Diese bilden eine Reihe von Merkmalen (Merkmalsmatrix: 913 x 32).
  • Dann benutze ich sklearn, um das Modell zu trainieren. cross_validation wird verwendet, wenn ich eine Testgröße von 0,2 verwende. Der Klassifikator ist mit dem rbf-Kernel auf SVC gesetzt, C = 1, gamma = 1 (ich habe verschiedene Werte ausprobiert)

Eine verkürzte Version des Codes finden Sie hier: http://pastebin.com/Xu13ciL4

Meine Probleme:

  • Wenn ich den Klassifikator verwende, um Beschriftungen für meinen Testsatz vorherzusagen, ist jede Vorhersage 0
  • Die Zuggenauigkeit beträgt 1, während die Genauigkeit des Testsatzes bei etwa 0,56 liegt
  • Mein Lernkurvendiagramm sieht folgendermaßen aus:

Geben Sie hier die Bildbeschreibung ein

Dies scheint hier ein klassischer Fall von Überanpassung zu sein. Es ist jedoch unwahrscheinlich, dass eine Überanpassung hier durch eine unverhältnismäßige Anzahl von Merkmalen zu Stichproben verursacht wird (32 Merkmale, 900 Stichproben). Ich habe eine Reihe von Maßnahmen ergriffen, um dieses Problem zu lösen:

  • Ich habe versucht, die Dimensionsreduktion (PCA) zu verwenden, falls dies daran liegt, dass ich zu viele Funktionen für die Anzahl der Stichproben habe, aber die Genauigkeitswerte und das Diagramm der Lernkurve sehen genauso aus wie oben. Wenn ich die Anzahl der Komponenten nicht auf unter 10 eingestellt habe, beginnt die Zuggenauigkeit zu sinken. Wird dies jedoch nicht erwartet, wenn Sie anfangen, Informationen zu verlieren?
  • Ich habe versucht, die Daten zu normalisieren und zu standardisieren. Die Standardisierung (SD = 1) ändert nichts an den Zug- oder Genauigkeitswerten. Durch das Normalisieren (0-1) sinkt meine Trainingsgenauigkeit auf 0,6.
  • Ich habe verschiedene C- und Gamma-Einstellungen für SVC ausprobiert, aber sie ändern keine der beiden Werte
  • Versucht mit anderen Schätzern wie GaussianNB, sogar Ensemble-Methoden wie Adaboost. Keine Änderung
  • Es wurde versucht, eine Regularisierungsmethode mit linearSVC explizit festzulegen, aber die Situation wurde nicht verbessert
  • Ich habe versucht, die gleichen Funktionen mit theano durch ein neuronales Netz zu führen, und meine Zuggenauigkeit liegt bei 0,6, der Test bei 0,5

Ich denke gerne weiter über das Problem nach, aber an dieser Stelle suche ich nach einem Anstoß in die richtige Richtung. Wo könnte mein Problem liegen und was könnte ich tun, um es zu lösen?

Es ist durchaus möglich, dass meine Funktionen nicht zwischen den beiden Kategorien unterscheiden, aber ich möchte einige andere Optionen ausprobieren, bevor ich zu diesem Schluss komme. Wenn sich meine Funktionen nicht unterscheiden, würde dies die niedrigen Testergebnisse erklären. Aber wie erhalten Sie in diesem Fall ein perfektes Trainingsset? Ist das möglich?


1
Wie sahen die Daten in 2 oder 3 Dimensionen aus, nachdem Sie PCA angewendet haben? Gab es auffällige Cluster? Welche Beispiele werden falsch klassifiziert, gibt es ein Muster?
image_doctor

Wie sehen die Leistungsspektren der Spuren aus? Wenn Sie die mittleren Spektren für jede Klasse darstellen, sehen sie anders aus. Wenn ja, wie und können Sie einen Klassifikator optimieren, um diesen Unterschied zu erfassen?
image_doctor

1) Können Sie uns das PCA-Cluster-Diagramm zeigen? 2) Haben Sie Entscheidungsbäume ausprobiert? Wenn die ursprünglichen Funktionen von Menschen überprüft werden können, können Sie möglicherweise einen Sinn dafür finden, wo etwas schief geht. Andernfalls (abgesehen von einem dummen Fehler von Ihrer Seite) scheinen Ihre Funktionen einfach nicht diskriminierend genug zu sein.
Lollercoaster

Sehr wahrscheinlich, dass die EEG-Daten nicht trennbar sind, aber haben Sie die Trainings- / Testsätze überprüft, um sicherzustellen, dass sie nicht voreingenommen sind (z. B. hat man nur positive Beispiele oder ist anders normalisiert)?
Jamesmf

1
Können Sie die Daten irgendwo posten? Entweder "allData" oder "features_all" (ohne Normalisierung und PCA).
stmax

Antworten:


1

Um zu sehen, ob SVM überhaupt ein Signal erfassen kann, versuchen Sie, Ihre Daten auszugleichen: Erstellen Sie Trainings- und Testsätze, die zu genau 50% aus positiven und zu 50% aus negativen Stichproben bestehen (dh durch zufällige Unterabtastung einer größeren Stichprobe). Standardisieren Sie auch die Daten (subtrahieren Sie den Mittelwert und dividieren Sie durch die Standardabweichung).

(Zum Ausgleichen können Sie versuchen, den Parameter class_weight in sklearn zu ändern, aber wir haben festgestellt, dass die manuelle Methode (Unterabtastung) besser funktioniert.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.