Was ist eine geeignete Strategie zur Aufteilung des Datensatzes?
Ich bitte um Feedback zu dem folgenden Ansatz (nicht zu den einzelnen Parametern wie test_size
oder n_iter
, aber wenn ich verwende X
, y
, X_train
, y_train
, X_test
, und in y_test
geeigneter Weise und wenn die Sequenz macht Sinn):
(Erweiterung dieses Beispiels aus der Scikit-Learn-Dokumentation)
1. Laden Sie den Datensatz
from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target
2. Aufteilen in Trainings- und Test-Set (zB 80/20)
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
3. Schätzer auswählen
from sklearn.svm import SVC
estimator = SVC(kernel='linear')
4. Wählen Sie den Kreuzvalidierungsiterator
from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)
5. Optimieren Sie die Hyperparameter
Anwenden des Kreuzvalidierungsiterators auf den Trainingssatz
from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)
6. Debug-Algorithmus mit Lernkurve
X_train
wird zufällig 10-mal in ein Training und ein Test-Set aufgeteilt ( n_iter=10
). Jeder Punkt auf der Trainings-Score-Kurve ist der Durchschnitt von 10 Scores, bei denen das Modell an den ersten i Trainingsbeispielen trainiert und bewertet wurde . Jeder Punkt in der Kreuzvalidierungs-Bewertungskurve ist der Durchschnitt von 10 Bewertungen, bei denen das Modell an den ersten i Trainingsbeispielen trainiert und an allen Beispielen des Testsatzes bewertet wurde.
from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()
plot_learning_curve () ist in der aktuellen Entwicklerversion von scikit-learn (0.15-git) enthalten.
7. Abschließende Bewertung des Testsatzes
classifier.score(X_test, y_test)
7a. Testüberanpassung in der Modellauswahl mit verschachtelter Kreuzvalidierung (unter Verwendung des gesamten Datensatzes)
from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)
Zusätzliche Frage: Ist es sinnvoll, Schritt 7 durch eine verschachtelte Kreuzvalidierung zu ersetzen? Oder sollte ein verschachtelter Lebenslauf als Ergänzung zu Schritt 7 angesehen werden?
(Der Code scheint mit der k-fachen Kreuzvalidierung in Scikit-Learn zu funktionieren, aber nicht mit Shuffle & Split. Er cv
muss oben geändert werden, damit der Code funktioniert.)
8. Trainieren Sie das endgültige Modell für den gesamten Datensatz
classifier.fit(X, y)
EDIT: Ich stimme jetzt der Überzeugung zu, dass Schritt 7a in dieser Reihenfolge nicht viel Sinn macht. Also würde ich das nicht übernehmen.
Antworten:
Ich bin nicht sicher, was Sie in Schritt 7a tun möchten. So wie ich es jetzt verstehe, ergibt es für mich keinen Sinn.
So verstehe ich Ihre Beschreibung: In Schritt 7 möchten Sie die Hold-out-Leistung mit den Ergebnissen einer Kreuzvalidierung vergleichen, die die Schritte 4 bis 6 umfasst (also ja, das wäre eine verschachtelte Konfiguration).
Die Hauptgründe, warum ich diesen Vergleich nicht für sinnvoll halte, sind:
Dieser Vergleich kann nicht zwei der Hauptquellen für überoptimistische Validierungsergebnisse aufdecken, die ich in der Praxis erlebe:
Datenlecks (Abhängigkeit) zwischen Trainings- und Testdaten, die durch eine hierarchische (auch als Cluster bezeichnete) Datenstruktur verursacht werden und bei der Aufteilung nicht berücksichtigt werden. In meinem Bereich haben wir in der Regel mehrere (manchmal Tausende) Ablesungen (= Zeilen in der Datenmatrix) desselben Patienten oder ein biologisches Replikat eines Experiments. Diese sind nicht unabhängig, daher muss die Aufteilung der Validierung auf Patientenebene erfolgen. Wenn jedoch ein solches Datenleck auftritt, haben Sie es sowohl in der Aufteilung für das Hold-Out-Set als auch in der Kreuzvalidierungsaufteilung. Hold-out wäre dann genauso optimistisch eingestellt wie Cross-Validation.
Vorverarbeitung der Daten in der gesamten Datenmatrix, wobei die Berechnungen nicht für jede Zeile unabhängig sind, sondern für die Berechnungsparameter für die Vorverarbeitung viele / alle Zeilen verwendet werden. Typische Beispiele wären zB eine PCA-Projektion vor der "tatsächlichen" Klassifizierung.
Dies würde sich wiederum sowohl auf Ihre Wartezeit als auch auf die äußere Kreuzvalidierung auswirken, sodass Sie sie nicht erkennen können.
Bei den Daten, mit denen ich arbeite, können beide Fehler leicht dazu führen, dass der Bruchteil der Fehlklassifizierungen um eine Größenordnung unterschätzt wird!
Wenn Sie sich auf diesen gezählten Bruchteil der Leistung von Testfällen beschränken, benötigen Modellvergleiche entweder eine extrem große Anzahl von Testfällen oder lächerlich große Unterschiede in der tatsächlichen Leistung. Der Vergleich von 2 Klassifikatoren mit unbegrenzten Trainingsdaten kann ein guter Anfang für das weitere Lesen sein.
Ein Vergleich der Modellqualität, die die innere Kreuzvalidierung für das "optimale" Modell und die äußere Kreuzvalidierung oder Hold-out-Validierung vorgibt, ist jedoch sinnvoll: Wenn die Diskrepanz hoch ist, ist es fraglich, ob Ihre Optimierung der Rastersuche funktioniert hat (was Sie möglicherweise getan haben) Varianz aufgrund der hohen Varianz des Leistungsmaßes). Dieser Vergleich ist einfacher, da Sie Probleme erkennen können, wenn Ihre innere Einschätzung im Vergleich zur anderen lächerlich gut ist. Wenn dies nicht der Fall ist, müssen Sie sich nicht so viele Gedanken über Ihre Optimierung machen. Aber in jedem Fall haben Sie, wenn Ihre äußere (7) Messung der Leistung ehrlich und solide ist, zumindest eine nützliche Schätzung des erhaltenen Modells, ob es optimal ist oder nicht.
Meiner Meinung nach ist das Messen der Lernkurve noch ein anderes Problem. Ich würde das wahrscheinlich separat behandeln, und ich denke, Sie müssen klarer definieren, wofür Sie die Lernkurve benötigen (benötigen Sie die Lernkurve für einen Datensatz des gegebenen Problems, der Daten und der Klassifizierungsmethode oder der Lernkurve?) für diesen Datensatz des gegebenen Problems, Daten und Klassifizierungsverfahrens) und eine Reihe weiterer Entscheidungen (z. B. wie mit der Modellkomplexität als Funktion der Trainingsstichprobengröße umgegangen werden soll? Erneut optimieren, feste Hyperparameter verwenden, festlegen Funktion zum Fixieren von Hyperparametern je nach Trainingssetgröße?)
(Meine Daten enthalten normalerweise so wenige unabhängige Fälle, dass die Messung der Lernkurve so genau ist, dass sie in der Praxis verwendet werden kann. Sie sind jedoch möglicherweise besser beraten, wenn Ihre 1200 Zeilen tatsächlich unabhängig sind.)
update: Was ist "falsch" am Beispiel von Scikit-Learn?
Erstens ist hier nichts falsch an verschachtelter Kreuzvalidierung. Die verschachtelte Validierung ist für die datengesteuerte Optimierung von größter Bedeutung, und die Kreuzvalidierung ist ein sehr leistungsfähiger Ansatz (insbesondere, wenn sie iteriert / wiederholt wird).
Ob überhaupt etwas falsch ist, hängt von Ihrer Sichtweise ab: Solange Sie eine ehrliche verschachtelte Validierung durchführen (wobei die äußeren Testdaten streng unabhängig bleiben), ist die äußere Validierung ein angemessenes Maß für die Leistung des "optimalen" Modells. Daran ist nichts auszusetzen.
Bei der Rastersuche dieser proportionalen Leistungsmessungen für die Hyperparameter-Optimierung von SVM können und können jedoch mehrere Dinge schief gehen. Grundsätzlich bedeutet dies, dass Sie sich (wahrscheinlich?) Nicht auf die Optimierung verlassen können. Trotzdem haben Sie eine ehrliche Einschätzung der Leistung des erhaltenen Modells, solange Ihr äußerer Split ordnungsgemäß durchgeführt wurde, auch wenn das Modell nicht das bestmögliche ist.
Ich werde versuchen, intuitive Erklärungen zu geben, warum die Optimierung Probleme bereiten kann:
Mathematisch / statistisch gesehen besteht das Problem bei den Proportionen darin, dass die gemessenen Proportionen aufgrund der endlichen Stichprobengröße einer großen Varianz unterliegen (abhängig auch von der tatsächlichen Leistung des Modells, ):p^ n p
Var(p^)=p(1−p)n
Sie brauchen lächerlich viele Fälle (zumindest im Vergleich zu der Anzahl der Fälle, die ich normalerweise haben kann), um die erforderliche Präzision (Bias / Varianz-Sinn) für die Schätzung des Erinnerungsvermögens und der Präzision (maschinelles Lernen, Leistungssinn) zu erreichen. Dies gilt natürlich auch für Verhältnisse, die Sie aus solchen Anteilen berechnen. Sehen Sie sich die Konfidenzintervalle für Binomialverhältnisse an. Sie sind schockierend groß! Oftmals größer als die tatsächliche Verbesserung der Leistung gegenüber dem Hyperparameter-Raster. Und statistisch gesehen ist die Gittersuche ein massives Mehrfachvergleichsproblem: Je mehr Punkte des Gitters Sie auswerten, desto höher ist das Risiko, eine Kombination von Hyperparametern zu finden, die für den von Ihnen bewerteten Zug / Test-Split versehentlich sehr gut aussieht. Das meine ich mit Skimming Varianz.
Man betrachte intuitiv eine hypothetische Änderung eines Hyperparameters, die langsam zu einer Verschlechterung des Modells führt: Ein Testfall nähert sich der Entscheidungsgrenze. Die Leistungskennzahlen für den „harten“ Anteil erkennen dies erst, wenn der Fall die Grenze überschreitet und auf der falschen Seite ist. Dann weisen sie jedoch sofort einen vollen Fehler für eine unendlich kleine Änderung des Hyperparameters zu.
Um eine numerische Optimierung durchführen zu können, muss sich das Leistungsmaß gut verhalten. Das heißt: Weder der sprunghafte (nicht stetig differenzierbare) Teil des verhältnismäßigen Leistungsmaßes noch die Tatsache, dass außer diesem Sprung tatsächlich auftretende Veränderungen nicht erkannt werden, sind für die Optimierung geeignet.
Richtige Bewertungsregeln werden auf eine Weise definiert, die für die Optimierung besonders geeignet ist. Sie haben ihr globales Maximum, wenn die vorhergesagten Wahrscheinlichkeiten mit den tatsächlichen Wahrscheinlichkeiten für jeden Fall übereinstimmen, um zu der fraglichen Klasse zu gehören.
Bei SVMs besteht das zusätzliche Problem, dass nicht nur die Leistungsmessungen, sondern auch das Modell auf diese unruhige Weise reagieren: Kleine Änderungen des Hyperparameters ändern nichts. Das Modell ändert sich nur, wenn die Hyperparameter so stark geändert werden, dass ein Fall entweder nicht mehr Support-Vektor ist oder Support-Vektor wird. Auch solche Modelle sind schwer zu optimieren.
Literatur:
Gneiting, T. & Raftery, AE: Streng korrekte Bewertungsregeln, Vorhersage und Schätzung, Journal of American Statistical Association, 102, 359-378 (2007). DOI: 10.1198 / 016214506000001437
Brereton, R .: Chemometrics for Pattern Recognition, Wiley, (2009).
weist auf das sprunghafte Verhalten der SVM in Abhängigkeit von den Hyperparametern hin.
Update II: Skimming Varianz
Was Sie sich im Modellvergleich leisten können, hängt natürlich von der Anzahl der unabhängigen Fälle ab. Lassen Sie uns hier eine schnelle und unsaubere Simulation des Risikos von Skimming-Abweichungen durchführen:
scikit.learn
sagt, dass sie 1797 in dendigits
Daten haben.dh alle Modelle haben die gleiche tatsächliche Leistung von beispielsweise 97% (typische Leistung für den
digits
Datensatz).Führen Sie Simulationen zum "Testen dieser Modelle" mit einer Stichprobengröße von 1797 Zeilen im Datensatz durch104
digits
Hier ist die Verteilung für die beste beobachtete Leistung:
Die rote Linie kennzeichnet die tatsächliche Leistung aller unserer hypothetischen Modelle. Im Durchschnitt beobachten wir nur 2/3 der wahren Fehlerrate für die scheinbar besten der 100 verglichenen Modelle (für die Simulation wissen wir, dass sie alle mit 97% korrekten Vorhersagen gleich gut abschneiden).
Diese Simulation ist offensichtlich sehr vereinfacht:
Im Allgemeinen erhöhen jedoch sowohl die geringe Anzahl unabhängiger Testfälle als auch die hohe Anzahl verglichener Modelle die Verzerrung. Das Papier von Cawley und Talbot liefert auch empirisch beobachtetes Verhalten.
quelle