Ich habe die folgenden Beiträge zur geschachtelten Kreuzvalidierung gelesen und bin mir immer noch nicht 100% sicher, was ich mit der Modellauswahl mit geschachtelter Kreuzvalidierung tun soll:
- Verschachtelte Kreuzvalidierung für die Modellauswahl
- Modellauswahl und Kreuzvalidierung: Der richtige Weg
Lassen Sie mich, um meine Verwirrung zu erklären, Schritt für Schritt durch die Modellauswahl mit der verschachtelten Kreuzvalidierungsmethode gehen.
- Erstellen Sie mit K-Fold eine äußere CV-Schleife. Dies wird verwendet, um die Leistung der Hyperparameter zu schätzen, die jede innere CV-Schleife "gewonnen" haben.
- Verwenden Sie GridSearchCV, um eine innere CV-Schleife zu erstellen, in der GSCV in jeder inneren Schleife alle möglichen Kombinationen des Parameterraums durchläuft und den besten Parametersatz ausgibt.
- Nachdem GSCV die besten Parameter in der inneren Schleife gefunden hat, wird es mit dem Testsatz in der äußeren Schleife getestet, um eine Schätzung der Leistung zu erhalten.
- Die äußere Schleife wird dann als Testsatz und der Rest als Trainingssatz auf die nächste Falte aktualisiert und 1-3 werden wiederholt. Die insgesamt möglichen "Gewinn" -Parameter sind die Anzahl der in der äußeren Schleife angegebenen Falten. Wenn die äußere Schleife also 5-fach ist, erhalten Sie eine Leistungsschätzung eines Algorithmus mit 5 verschiedenen Sätzen von Hyperparametern, NICHT die Leistung eines bestimmten Satzes von Hyperparametern.
Dieser Ansatz wird auf der Beispielseite von SKLearn veranschaulicht: http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html
Frage: Wie ermitteln Sie nach 4. , welche Hyperparameter am besten funktionieren? Ich verstehe, dass Sie Ihren Algorithmus (z. B. logistische Regression, zufällige Gesamtstruktur usw.) mit dem vollständigen Datensatz am Ende trainieren möchten. Aber wie bestimmen Sie, welche Hyperparameter in Ihrer verschachtelten Kreuzvalidierung am besten funktionierten? Ich verstehe, dass für jede innere Schleife ein anderer Satz von Hyperparametern gewinnt. Und für die äußere Schleife erhalten Sie eine Schätzung Ihrer GridSearchCV-Leistung, aber Sie erhalten keinen bestimmten Satz von Hyperparametern. Woher wissen Sie bei der endgültigen Modellerstellung, welche Hyperparameter zu verwenden sind? Das ist die fehlende Logik, die ich von anderen Schritten nicht verstehen kann.
Vielen Dank im Voraus für alle Tipps, besonders wenn @Dikran Marsupial und @cbeleites mitmachen können!
Bearbeiten: Wenn Sie können, verwenden Sie bitte in Ihrer Antwort Begriffe wie "Algorithmus" und "Hyperparameter". Ich denke, eine Quelle der Verwirrung ist für mich, wenn Leute den Begriff "Modell" oder "Modellauswahl" verwenden. Ich bin verwirrt, ob sie über die Auswahl des zu verwendenden Algorithmus oder der zu verwendenden Hyperparameter sprechen.
Bearbeiten 2: Ich habe ein Notizbuch erstellt , das zwei Möglichkeiten für die verschachtelte Kreuzvalidierung zeigt. Der erste Weg ist der im SKLearn-Beispiel gezeigte und der andere längere, den ich geschrieben habe. Der in SKLearn gezeigte Weg enthüllt nicht die "gewinnenden" Hyperparameter, aber mein längerer Weg tut es. Die Frage bleibt aber gleich. Was mache ich jetzt, nachdem ich die verschachtelte Kreuzvalidierung abgeschlossen habe, auch wenn die Hyperparameter verfügbar sind? Wie Sie an den Hyperparametern am Ende des Notizbuchs erkennen können, variieren sie erheblich.
quelle
Antworten:
(Ich bin sicher, dass ich das meiste bereits in einer Antwort geschrieben habe - kann es aber momentan nicht finden. Wenn jemand über diese Antwort stolpert, verlinken Sie sie bitte). Ich sehe hier zwei leicht unterschiedliche Ansätze, die ich beide für sinnvoll halte.
Aber zuerst einige Begriffe:
Ich denke, der Unterschied zwischen ihnen hängt mit dem Unterschied zwischen jemandem zusammen, der neue Trainingsalgorithmen entwickelt und normalerweise eine Klasse von Trainingsalgorithmen zusammen mit einigen Steuerungsparametern (den Hyperparametern) beschreibt), die ohne Anwendungs- / Domänenkenntnisse nur schwer oder gar nicht zu beheben sind (oder zumindest nicht festlegen, wie sie entschieden / geschätzt werden sollen).
Ansatz 1: stabile Optimierungsergebnisse erfordern
Bei diesem Ansatz ist "Modelltraining" die Anpassung der "normalen" Modellparameter, und es werden Hyperparameter angegeben. Eine innere zB Kreuzvalidierung sorgt für die Hyperparameteroptimierung.
Der entscheidende Schritt / die entscheidende Annahme, um das Dilemma zu lösen, dessen Hyperparametersatz ausgewählt werden sollte, ist, dass die Optimierung stabil sein muss . Bei der Kreuzvalidierung zu Validierungszwecken wird davon ausgegangen, dass alle Ersatzmodelle dem endgültigen Modell (das mit demselben Trainingsalgorithmus ermittelt wurde, der auf den gesamten Datensatz angewendet wurde) hinreichend ähnlich sind , damit sie (untereinander wie auch mit dem endgültigen Modell) gleich behandelt werden können. Wenn diese Annahme zusammenbricht und
Die Ersatzmodelle sind untereinander immer noch gleich (oder gleichwertig), aber nicht mit dem endgültigen Modell. Wir sprechen von der bekannten pessimistischen Tendenz der Kreuzvalidierung.
Wenn auch das Ersatzmodell nicht gleich ist, haben wir Probleme mit der Instabilität .
Für die Optimierungsergebnisse der inneren Schleife bedeutet dies, dass bei stabiler Optimierung kein Konflikt bei der Auswahl von Hyperparametern besteht . Und wenn erhebliche Unterschiede zwischen den inneren Quervalidierungsergebnisse beobachtet wird, ist die Optimierung nicht stabil . Instabile Trainingssituationen haben weitaus schlimmere Probleme als nur die Entscheidung, welche der Hyperparameter ausgewählt werden soll, und ich würde wirklich empfehlen, in diesem Fall einen Schritt zurückzutreten und den Modellierungsprozess von vorne zu beginnen.
Hier gibt es jedoch eine Ausnahme: Es kann mehrere lokale Minima in der Optimierung geben, die aus praktischen Gründen zu gleicher Leistung führen. Es mag eine unnötig starke Anforderung sein, auch die Wahl unter ihnen für Stabilität zu haben - aber ich weiß nicht, wie ich aus diesem Dilemma herauskommen kann.
Beachten Sie, dass, wenn nicht alle Modelle den gleichen Gewinnparametersatz liefern, Sie hier keine Schätzungen der äußeren Schleife als Verallgemeinerungsfehler verwenden sollten:
Ansatz 2: Behandeln Sie Hyperparameter-Tuning als Teil des Modelltrainings
Dieser Ansatz verbindet die Perspektiven des "Trainingsalgorithmus-Entwicklers" und des angewandten Anwenders des Trainingsalgorithmus.
Der Entwickler des Trainingsalgorithmus stellt einen "nackten" Trainingsalgorithmus zur Verfügung
model = train_naked (trainingdata, hyperparameters)
. Wie es der Anwender benötigttunedmodel = train_tuned (trainingdata)
, kümmert sich auch dieser um die Fixierung der Hyperparameter.train_tuned
kann implementiert werden, indem z. B. ein Cross-Validation-basierter Optimierer um den Naked-Training-Algorithmus gewickelt wirdtrain_naked
.train_tuned
kann dann wie jeder andere Trainingsalgorithmus verwendet werden, der keine Hyperparametereingabe erfordert, z. B. kann seine Ausgabetunedmodel
einer Kreuzvalidierung unterzogen werden. Nun werden die Hyperparameter auf ihre Stabilität überprüft, so wie die "normalen" Parameter im Rahmen der Auswertung der Kreuzvalidierung auf Stabilität überprüft werden sollten.Dies ist genau das, was Sie in der verschachtelten Kreuzvalidierung tun und auswerten, wenn Sie die durchschnittliche Leistung aller Gewinnermodelle unabhängig von ihren einzelnen Parametersätzen ermitteln.
Was ist der Unterschied?
Wir haben möglicherweise unterschiedliche Endmodelle, die diese zwei Ansätze verfolgen:
train_naked (all data, hyperparameters from optimization)
train_tuned (all data)
und - da dies die Hyperparameter-Optimierung erneut für den größeren Datensatz ausführt - dies möglicherweise zu einem anderen Satz von Hyperparametern führt.Aber auch hier gilt die gleiche Logik: Wenn wir feststellen, dass das endgültige Modell wesentlich andere Parameter aufweist als die Kreuzvalidierungs-Ersatzmodelle, ist dies ein Symptom dafür, dass die Annahme 1 verletzt wird. Also meiner Meinung nach haben wir wieder keinen Konflikt, sondern eine Überprüfung, ob unsere (impliziten) Annahmen gerechtfertigt sind. Und wenn nicht, sollten wir sowieso nicht zu viel auf eine gute Schätzung der Leistung dieses endgültigen Modells setzen.
Ich habe den Eindruck (auch aufgrund der Anzahl ähnlicher Fragen / Verwirrungen hier im Lebenslauf), dass viele Leute bei Ansatz 1 an eine verschachtelte Kreuzvalidierung denken. Der Generalisierungsfehler wird jedoch in der Regel nach Ansatz 2 geschätzt letztes Modell auch.
Iris Beispiel
Zusammenfassung: Die Optimierung ist grundsätzlich sinnlos. Die verfügbare Stichprobengröße erlaubt keine Unterscheidung zwischen der Leistung eines der hier aufgeführten Parametersätze.
Aus anwendungstechnischer Sicht ist es jedoch unerheblich, welchen der 4 Parametersätze Sie wählen - was keine schlechte Nachricht ist: Sie haben ein vergleichsweise stabiles Parameterplateau gefunden. Hier kommt der Vorteil der ordnungsgemäßen verschachtelten Validierung des optimierten Modells: Während Sie nicht behaupten können, dass es das optimale Modell ist, können Sie dennoch behaupten, dass das Modell, das mit Ansatz 2 auf den gesamten Daten aufgebaut wurde, über Folgendes verfügt 97% Genauigkeit (95% Konfidenzintervall für 145 korrekte von 150 Testfällen: 92 - 99%)
Beachten Sie, dass auch Ansatz 1 nicht so weit entfernt ist, wie es scheint - siehe unten: Ihre Optimierung hat versehentlich einen vergleichsweise eindeutigen "Gewinner" aufgrund von Unentschieden übersehen (das ist tatsächlich ein weiteres sehr verräterisches Symptom des Stichprobengrößenproblems).
Obwohl ich nicht tief genug in SVMs bin, um zu "sehen", dass C = 1 hier eine gute Wahl sein sollte, würde ich mich für den restriktiveren linearen Kernel entscheiden. Während Sie die Optimierung durchgeführt haben, ist die Auswahl des Siegerparametersatzes auch dann kein Problem, wenn Sie sich darüber im Klaren sind, dass alle Parametersätze zu praktisch gleicher Leistung führen.
Überlegen Sie sich jedoch in Zukunft, ob Ihre Erfahrung grobe Schätzungen darüber liefert, mit welcher Leistung Sie rechnen können, und in etwa welches Modell eine gute Wahl wäre. Erstellen Sie dann dieses Modell (mit manuell festgelegten Hyperparametern) und berechnen Sie ein Konfidenzintervall für seine Leistung. Verwenden Sie diese Option, um zu entscheiden, ob Optimierungsversuche überhaupt sinnvoll sind. (Ich kann hinzufügen, dass ich hauptsächlich mit Daten arbeite, bei denen es nicht einfach ist, 10 unabhängige Fälle zu erhalten. Wenn Sie sich in einem Bereich mit großen unabhängigen Stichproben befinden, sehen die Dinge für Sie viel besser aus.)
lange Version:
Wie für das Beispiel ergibt sich aus dem
iris
Datensatz.iris
In 150 Fällen wird SVM mit einem Raster von 2 x 2 Parametern (2 Kernel, 2 Größenordnungen für die StrafeC
) berücksichtigt.Die innere Schleife besteht aus 129 (2x) und 132 (6x) Fällen. Der "beste" Parametersatz ist zwischen linearem oder rbf-Kernel unentschieden, beide mit C = 1. Die inneren Testgenauigkeiten liegen jedoch alle (einschließlich des immer verlierenden C = 10) innerhalb der beobachteten Genauigkeit von 94 - 98,5%. Der größte Unterschied, den wir in einer der Aufteilungen haben, ist 3 gegen 8 Fehler für rbf mit C = 1 gegen 10.
Das ist auf keinen Fall ein signifikanter Unterschied. Ich weiß nicht, wie ich die Vorhersagen für die einzelnen Fälle im Lebenslauf extrahieren soll, aber ich gehe sogar davon aus, dass die 3 Fehler geteilt wurden und das C = 10-Modell zusätzliche 5 Fehler gemacht hat:
Denken Sie daran, dass das 2 x 2-Raster 6 paarweise Vergleiche enthält, sodass wir auch mehrere Vergleiche korrigieren müssen.
Ansatz 1
In 3 der 4 äußeren Splits, in denen rbf den linearen Kernel "gewann", hatten sie tatsächlich die gleiche geschätzte Genauigkeit (ich denke, min bei Gleichheit gibt den ersten geeigneten Index zurück).
Das Raster auf
params = {'kernel':['linear', 'rbf'],'C':[1,10]}
Renditen umstellenAnsatz 2:
Hier
clf
ist Ihr endgültiges Modell. Mitrandom_state = 2
, rbf mit C = 1 gewinnt:(passiert ungefähr 1 in 5 mal, 1 in 6 mal
linear
undrbf
mitC = 1
sind auf Rang 1 gebunden)quelle
Ich habe Ihre Frage und die Antwort oben 2 Mal gelesen (1. Mal vor 3 Monaten). Ich bin interessiert und möchte auch den absolut geeigneten Weg finden, um eine Kreuzvalidierung für meine Daten durchzuführen. Nach langem Nachdenken und Lesen sehe ich, dass ich die Lücken gefunden habe, und hier ist meine Lösung:
Argumentation:
quelle
Alle Daten zur Auswahl der zu verwendenden Funktionen. Selbst wenn Sie die Kreuzvalidierung in Schritt 2 durchführen, haben die Funktionen daher bei jedem Kreuzvalidierungslauf bereits einige Informationen in der Testfalte gesehen und können sich diese merken. Das Ergebnis ist eine übermäßig optimistische Schätzung des Testfehlers , die als Merkmalsauswahlverzerrung bezeichnet wird . Um dies Ihrer Einschätzung nach zu berücksichtigen, müssten Sie den Merkmalsauswahlschritt in die Kreuzvalidierungsschleife von Schritt 2
einfügen . Okay, sind wir jetzt gut? Ist der beste Fehler in der Kreuzvalidierung mit dem Merkmalsauswahlschritt innerhalb der Schleife eine angemessene Schätzung des Generalisierungsfehlers?
Theoretisch lautet die Antwort immer noch neinDas Problem besteht darin, dass Ihre Hyperparameter so ausgewählt wurden, dass der Kreuzvalidierungsfehler in dem Ihnen zur Verfügung stehenden spezifischen Dataset minimiert wird. In gewissem Sinne passen Sie die Hyperparameter also an Ihre Daten an, wobei das Risiko besteht, dass sie zu stark angepasst werden wird Modellauswahlverzerrung genannt . Aber ist das in der Praxis ein Problem? Dies hängt von der jeweiligen Anwendung ab: Wenn der Datensatz klein und die Anzahl der zu optimierenden Hyperparameter relativ groß ist, kann es zu einer Überanpassung im Training kommen . Um dies bei der Schätzung des Generalisierungsfehlers zu berücksichtigen, würden Sie wie beschrieben eine verschachtelte Kreuzvalidierung anwenden, die Ihnen dann eine korrekte Schätzung Ihres Generalisierungsfehlers liefert.
Zur Beantwortung Ihrer letzten Frage wenden Sie die Prozedur (Schritt 1 + 2) einfach auf Ihren gesamten Datensatz an, nachdem Sie eine angemessene Schätzung Ihres Verallgemeinerungsfehlers beim Erstellen eines Modells mit einem festen Satz erhalten haben von Merkmalen und festgelegten Hyperparameterwerten, wobei jedoch zu berücksichtigen ist, dass der Fehler, den dieses Modell bei unsichtbaren Daten zu erwarten hat, die verschachtelte Kreuzvalidierungsschätzung ist .
quelle