Wie erhält man Hyperparameter in einer verschachtelten Kreuzvalidierung?

16

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:

Lassen Sie mich, um meine Verwirrung zu erklären, Schritt für Schritt durch die Modellauswahl mit der verschachtelten Kreuzvalidierungsmethode gehen.

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Schweres Atmen
quelle
1
+1 für das Notebook. Diese Frage ist auch für mich von Interesse und wird weiterverfolgt.
Arnold Klein

Antworten:

6

(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:

  • Ein (angepasstes / trainiertes) Modell aus einem angewandten Bereich ist für mich einsatzbereit. Das heißt, das Modell enthält alle Informationen, die zur Erstellung von Vorhersagen für neue Daten erforderlich sind. Das Modell enthält also auch die Hyperparameter . Wie Sie sehen werden, steht dieser Standpunkt in engem Zusammenhang mit dem nachstehenden Ansatz 2.
  • OTOH, Trainingsalgorithmus ist meiner Erfahrung nach in folgendem Sinne nicht gut definiert: Um das (angepasste) Modell zu erhalten, muss nicht nur die - nennen wir es "primäre Anpassung" - der "normalen" Modellparameter durchgeführt werden. aber auch die hyperparameter müssen fixiert werden. Aus meiner Anwendungsperspektive gibt es keinen großen Unterschied zwischen Parametern und Hyperparametern: Beide sind Teil des Modells und müssen während des Trainings geschätzt / entschieden werden.
    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

  1. 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.

  2. 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:

  • p
  • Es sei denn, es ist keine Entscheidung beteiligt, da alle Teilungen dieselben Parameter ergaben, wird dies die Unabhängigkeit in der äußeren Schleife aufheben: Die Testdaten jeder Teilung haben bereits die Entscheidung getroffen, welcher Parametersatz gewinnt, da es Trainingsdaten in allen anderen Teilungen waren und somit verwendet wurden um die Parameter zu optimieren.

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ötigt tunedmodel = train_tuned (trainingdata), kümmert sich auch dieser um die Fixierung der Hyperparameter.

train_tunedkann implementiert werden, indem z. B. ein Cross-Validation-basierter Optimierer um den Naked-Training-Algorithmus gewickelt wird train_naked.

train_tunedkann dann wie jeder andere Trainingsalgorithmus verwendet werden, der keine Hyperparametereingabe erfordert, z. B. kann seine Ausgabe tunedmodeleiner 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:

  • Das endgültige Modell in Ansatz 1 wird sein train_naked (all data, hyperparameters from optimization)
  • wohingegen Ansatz 2 verwendet 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 irisDatensatz. irisIn 150 Fällen wird SVM mit einem Raster von 2 x 2 Parametern (2 Kernel, 2 Größenordnungen für die Strafe C) 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:

> table (rbf1, rbf10)
         rbf10
rbf1      correct wrong
  correct     124     5
  wrong         0     3

> mcnemar.exact(rbf1, rbf10)

    Exact McNemar test (with central confidence intervals)

data:  rbf1 and rbf10
b = 5, c = 0, p-value = 0.0625
alternative hypothesis: true odds ratio is not equal to 1

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 umstellen

({'kernel': 'linear', 'C': 1}, 0.95238095238095233, 0.97674418604651159)
({'kernel': 'rbf', 'C': 1}, 0.95238095238095233, 0.98449612403100772)
({'kernel': 'linear', 'C': 1}, 1.0, 0.97727272727272729)
({'kernel': 'linear', 'C': 1}, 0.94444444444444442, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 0.94444444444444442, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 1.0, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 1.0, 0.96212121212121215)

Ansatz 2:

Hier clfist Ihr endgültiges Modell. Mit random_state = 2, rbf mit C = 1 gewinnt:

In [310]: clf.grid_scores_
[...snip warning...]
Out[310]: 
[mean: 0.97333, std: 0.00897, params: {'kernel': 'linear', 'C': 1},
 mean: 0.98000, std: 0.02773, params: {'kernel': 'rbf', 'C': 1},
 mean: 0.96000, std: 0.03202, params: {'kernel': 'linear', 'C': 10},
 mean: 0.95333, std: 0.01791, params: {'kernel': 'rbf', 'C': 10}]

(passiert ungefähr 1 in 5 mal, 1 in 6 mal linearund rbfmit C = 1sind auf Rang 1 gebunden)

cbeleites unterstützt Monica
quelle
4
Danke @cbeleites! Ich habe deine Antworten auch in anderen Threads gelesen und gehofft, du würdest meine Frage beantworten. Ihre Antwort ist sehr ausführlich, aber meine Frage konzentriert sich auf die Analyse der Ergebnisse eines verschachtelten Lebenslaufs. Ich bin mir immer noch nicht sicher, was ich tun soll, nachdem ich einen verschachtelten Lebenslauf erstellt habe. Sehen Sie sich das Notizbuch an, das ich erstellt habe (am Ende meines Beitrags), und erklären Sie dem Laien, was zu tun ist, da zwei verschiedene Sätze von Hyperparametern in einem verschachtelten Lebenslauf als optimal identifiziert wurden. Es ist ein sehr sehr kurzes Notizbuch, das verspreche ich!
Schweres Atmen
@HeavyBreathing Ich habe die Antwort gelesen und bin mir immer noch nicht sicher, was ich tun soll, nachdem ich einen verschachtelten Lebenslauf erstellt habe. Haben Sie das klar herausgefunden?
Stackunderflow
0

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:

Lassen Sie mich, um meine Verwirrung zu erklären, Schritt für Schritt durch die Modellauswahl mit der verschachtelten Kreuzvalidierungsmethode gehen.

  1. 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.
  2. 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. (Anmerkung: hier nehme ich an: Daten für innere Schleife = Trainingsdaten für äußere Schleife. Sie können fragen: warum? Antwort: /programming/42228735/scikit-learn-gridsearchcv-with-multiple-repetitions/ 42230764 # 42230764 lies den Antwortabschnitt von Vivek Kumar Schritt 4)
  3. Nachdem GSCV die "besten Parameter" in der inneren Schleife gefunden hat (nennen wir es "inner winner"), wird es mit dem in der äußeren Schleife festgelegten Test getestet, um eine Schätzung der Leistung zu erhalten (nennen wir es "outer_fold_score1").
  4. Die äußere Schleife wird dann auf die nächste Falte als Testsatz und der Rest als Trainingssatz aktualisiert (um den "inneren Gewinner" auf der äußeren Schleife zu bewerten). Der "innere Gewinner" wird erneut mit dem neuen Testsatz getestet (outer_fold_score2). Dann wird die äußere Schleife erneut auf die nächste Falte aktualisiert, bis die Schleife abgeschlossen ist. Die Punktzahlen aus jeder Falte (outer_fold_score 1,2 ..) sind Durchschnittswerte, um die Punktzahl des "inneren Gewinners" für die äußere Schleife (outer_score) zu erhalten.
  5. Die äußeree Schleife aktualisiert dann auf die nächste Falte als Test - Set und den Rest als Trainingssatz (die nächsten „inneren Gewinner“ zu finden, und 1- 4 Wiederholungen (beachten Sie, dass , wenn wir 1 wiederholen wir schaffen nicht die neuen K- fold, aber wir verwenden jedes Mal den gleichen äußeren Kfold.) Mit jedem der 1 bis 4 Zyklen erhalten wir einen "besten Parameter" (oder "inneren Gewinner") mit einem äußeren Wert. Derjenige mit dem besten äußeren Wert gewinnt den Gewinner

Argumentation:

  • Grundsätzlich betrifft Ihre Frage, dass es viele "Gewinnparameter" für die äußere Schleife gibt. Die Sache ist, dass du die äußere Schleife nicht abgeschlossen hast, um den "äußeren Gewinner" zu bewerten und zu finden. Dein vierter Schritt wertet nur den "inneren Gewinner" in der äußeren Schleife in einer Falte aus, aber du hast es nicht "geschleift". Daher muss ich es durch meinen 4. Schritt ersetzen - "Schleife" den Bewertungsschritt in der äußeren Schleife und erhalte die äußere Punktzahl (durch Mitteln)
  • Ihr fünfter Schritt hat die "Schleifen" -Aufgabe in der äußeren Schleife erledigt, aber nur, um einen weiteren "inneren Gewinner" zu bauen. Die "Bewertung" dieses "inneren Gewinners" in der äußeren Schleife wurde nicht wiederholt
Tuan Viet Nguyen
quelle
Beantwortet dies wirklich die Frage?
Michael R. Chernick
0


D Reihe von Vorverarbeitungstransformationen, Features und schließlich Hyperparameterwerten.

X,y
xXy

X,yX,y

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 .

AA
quelle