(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
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:
- 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_tuned
kann implementiert werden, indem z. B. ein Cross-Validation-basierter Optimierer um den Naked-Training-Algorithmus gewickelt wird train_naked
.
train_tuned
kann dann wie jeder andere Trainingsalgorithmus verwendet werden, der keine Hyperparametereingabe erfordert, z. B. kann seine Ausgabe tunedmodel
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:
- 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 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 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 clf
ist 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 linear
und rbf
mit C = 1
sind auf Rang 1 gebunden)