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:
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?
Antworten:
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.)
quelle