Sollte die Merkmalsauswahl nur für Trainingsdaten (oder alle Daten) durchgeführt werden? Ich habe einige Diskussionen und Artikel wie Guyon (2003) und Singhi und Liu (2006) durchgearbeitet, bin mir aber immer noch nicht sicher, ob ich die richtige Antwort finden soll.
Mein Versuchsaufbau ist wie folgt:
- Datensatz: 50 gesunde Kontrollpersonen und 50 Patienten mit Krankheit (ca. 200 Merkmale, die für die Vorhersage von Krankheiten relevant sein können).
- Aufgabe ist es, Krankheiten anhand der verfügbaren Funktionen zu diagnostizieren.
Was ich tue ist
- Nehmen Sie den gesamten Datensatz und führen Sie die Funktionsauswahl (FS) durch. Ich behalte nur ausgewählte Funktionen zur weiteren Verarbeitung
- Aufteilen, um zu testen und zu trainieren, Zugklassifizierer anhand von Zugdaten und ausgewählten Funktionen. Wenden Sie dann den Klassifikator auf die Testdaten an (wiederum unter Verwendung nur ausgewählter Funktionen). Es wird eine einmalige Validierung verwendet.
- Klassifizierungsgenauigkeit erhalten
- Mittelwertbildung: 1) -3) N-mal wiederholen. (100).
Ich würde zustimmen, dass das Durchführen von FS für den gesamten Datensatz zu einer gewissen Verzerrung führen kann, aber meiner Meinung nach wird es während der Mittelwertbildung "gemittelt" (Schritt 4). Ist das korrekt? (Die Genauigkeitsvarianz beträgt )
1 Guyon, I. (2003) "Eine Einführung in die Variablen- und Merkmalsauswahl", The Journal of Machine Learning Research, Vol. 3, S. 1157-1182
2 Singhi, SK und Liu, H. (2006) "Feature Subset Selection Bias for Classification Learning", Fortsetzung von ICML '06 Proceedings der 23. internationalen Konferenz über maschinelles Lernen, S. 849-856
Nur als Ergänzung zu den Antworten hier habe ich zwei Links, die mir wirklich geholfen haben zu verstehen, warum dies kein gutes Verfahren ist:
http://nbviewer.jupyter.org/github/cs109/content/blob/master/lec_10_cross_val.ipynb
https://www.youtube.com/watch?v=S06JpVoNaA0
Bearbeiten: wie gewünscht eine kurze Erläuterung des Inhalts der Links:
Angenommen, ich trainiere einen Klassifikator und habe einen Datensatz von 1000 Proben mit jeweils 1 Million Merkmalen. Ich kann nicht alle verarbeiten, daher benötige ich weniger Funktionen (z. B. kann ich 300 Funktionen berechnen). Ich habe auch einen Testsatz mit 100 Proben, um meine tatsächliche Genauigkeit außerhalb der Probe genau abzuschätzen.
Wenn ich meine 1 Million Features auf 300 filtere, indem ich die Features mit der höchsten Korrelation zu den Zielen meines gesamten Datensatzes auswähle, mache ich einen Fehler (weil ich eine Überanpassung einführe, die später durch Cross Validation nicht erkannt werden kann). Mein durchgehaltenes Set zeigt dies, indem es einen schlechten Genauigkeitswert zurückspuckt.
Gemäß den obigen Links besteht die richtige Vorgehensweise darin, meinen Datensatz in einen Trainingssatz und einen Kreuzvalidierungssatz zu unterteilen und dann mein Modell (Herausfiltern von Funktionen usw.) basierend auf diesem Trainingssatz und der zugehörigen Lebenslaufbewertung zu optimieren. Wenn ich K-Folds verwende, muss ich jedes Mal, wenn ich einen Split / Fold mache, von Grund auf neu einstellen und dann die Ergebnisse mitteln.
Programmatisch machen Sie Folgendes:
Es ist wirklich wichtig, dass Sie das Feature-Engineering innerhalb der Schleife auf dem Unter-Trainingssatz Ti und nicht auf dem vollständigen Trainingssatz T1 durchführen.
Der Grund dafür ist, dass Sie beim Fit / Feature Engineer für Ti auf CVi testen, was für dieses Modell nicht sichtbar ist. Wenn Sie dagegen auf T1 passen / Feature Engineer sind, muss jeder Lebenslauf, den Sie auswählen, eine Teilmenge T1 sein. Sie sind also optimistisch voreingenommen, dh Sie passen zu viel, weil Sie an denselben Datenproben trainieren und testen.
Eine wirklich gute Antwort von StackExchange ist diese , die sie ausführlicher und anhand eines Beispiels für den Code erklärt. Sehen Sie dies auch als Nachtrag.
quelle
Der Efron-Gong "Optimismus" Bootstrap ist dafür sehr gut. Die Idee ist, alle verfügbaren Daten für die Entwicklung des Vorhersagemodells und alle Daten für die Schätzung der wahrscheinlichen zukünftigen Leistung desselben Modells zu verwenden. Und Ihre Stichprobengröße ist um den Faktor 100 zu klein, als dass ein Ansatz mit geteilten Stichproben funktionieren könnte.
Um den Bootstrap richtig zu verwenden, müssen Sie alle Schritte, die verwendet haben, programmieren und bei jedem Resample erneut wiederholen. Mit Ausnahme der Merkmalsauswahl ist hier ein gutes Beispiel: Interpretation eines logistischen Regressionsmodells mit mehreren PrädiktorenY
quelle