Modellauswahl und Kreuzvalidierung: Der richtige Weg

34

In CrossValidated gibt es zahlreiche Threads zum Thema Modellauswahl und Kreuzvalidierung. Hier sind ein paar:

Die Antworten auf diese Themen sind jedoch eher allgemein gehalten und heben hauptsächlich die Probleme hervor, die bei bestimmten Ansätzen zur Kreuzvalidierung und Modellauswahl auftreten.

Um die Dinge so konkret wie möglich zu machen , sagen wir zum Beispiel, dass wir mit einer SVM mit einem RBF-Kernel arbeiten: und das Ich habe einen Datensatz mit Features X und Beschriftungen y , und das möchte ichK(x,x)=(γ|xx|)2

  1. Finde die bestmöglichen Werte meines Modells ( undγC )
  2. Trainieren Sie die SVM mit meinem Datensatz (für die endgültige Bereitstellung)
  3. Schätzen Sie den Generalisierungsfehler und die Unsicherheit (Varianz) um diesen Fehler herum

Dazu würde ich persönlich eine Rastersuche durchführen, zB versuche ich jede mögliche Kombination von und . Der Einfachheit halber können wir die folgenden Bereiche annehmen:Cγ

  • C{10,100,1000}
  • γ{0.1,0.2,0.5,1.0}

Genauer gesagt, mit meinem vollständigen Datensatz mache ich Folgendes:

  1. Für jedes ( , ) Paar führe ich wiederholte Iterationen (z. B. 100 zufällige Wiederholungen) der fachen Kreuzvalidierung (z. B. ) in meinem Datensatz durch, dh ich trainiere meine SVM auf Falten und werte die aus Fehler in der linken Falte, der alle Faltungen durchläuft . Insgesamt sammle ich 100 x 10 = 1000 Testfehler.CγKK=10K-1K
  2. Für jedes solche ( , ) Paar berechne ich den Mittelwert und die Varianz dieser 1000 .CγμM,σM

Jetzt möchte ich das beste Modell (die besten Kernelparameter) auswählen, mit dem ich meine endgültige SVM für den vollständigen Datensatz trainieren würde. Mein Verständnis ist , dass das Modell der Wahl, die das hatte geringsten Fehler Mittelwert und die Varianz und wäre die richtige Wahl sein, und dass dieses Modell der sind sind meine besten Schätzungen der Generalisierungsfehler Bias des Modells und die Varianz beim Training mit den vollständigen Datensatz.σ M μ M σ MμMσMμMσM

ABER nachdem ich die Antworten in den obigen Threads gelesen habe, habe ich den Eindruck, dass diese Methode zur Auswahl der besten SVM für die Bereitstellung und / oder zur Abschätzung ihres Fehlers (Generalisierungsleistung) fehlerhaft ist und dass es bessere Möglichkeiten zur Auswahl der gibt beste SVM und meldet seinen Fehler. Wenn ja, was sind sie? Ich suche bitte eine konkrete Antwort.

Wie genau kann ich bei diesem Problem das beste Modell auswählen und den Generalisierungsfehler richtig einschätzen ?

Amelio Vazquez-Reina
quelle
Um die Dinge so konkret wie möglich zu machen, teilen Sie uns bitte mit: Wie viele statistisch unabhängige Fälle haben Sie in Ihrem Datensatz? Was ist die Zielfunktion, die Sie für die Optimierung auswerten / Welche Art von Fehlermaßnahme verwenden Sie? Beobachten Sie tatsächlich ein konsistentes Verhalten des gewählten Fehlermaßes über Ihr Parameterraster? Wenn Sie über Klassifizierung sprechen und Ihr Fehlermaß dies zulässt: Wie vergleichen sich die iterierten Kreuzvalidierungsergebnisse mit der Varianz, die Sie aufgrund der endlichen Stichprobengröße erwarten (aber nicht messen können)?
cbeleites unterstützt Monica
Ein Artikel, den Sie vielleicht interessant finden: optimalprediction.com/files/pdf/V2A5.pdf
user31256
2
+1 für sehr klare und detaillierte Fragen sowie für sehr relevante Fragen an die gesamte Data Science Community.
NickBraunagel

Antworten:

20

Mein Artikel in JMLR geht genau auf diese Frage ein und zeigt, warum das in der Frage vorgeschlagene Verfahren (oder zumindest eines sehr ähnlichen) zu optimistisch voreingenommenen Leistungsschätzungen führt:

Gavin C. Cawley, Nicola LC Talbot, "Überanpassung bei der Modellauswahl und anschließende Auswahlverzerrung bei der Leistungsbewertung", Journal of Machine Learning Research, 11 (Jul): 2079–2107, 2010. ( www )

Der Schlüssel zum Erinnern ist, dass die Kreuzvalidierung eine Technik zum Schätzen der Generalisierungsleistung für eine Methode zum Generieren eines Modells ist und nicht für das Modell selbst. Wenn die Auswahl von Kernelparametern Teil des Prozesses zur Generierung des Modells ist, müssen Sie auch den Modellauswahlprozess über Kreuz validieren. Andernfalls erhalten Sie eine optimistisch voreingenommene Leistungsschätzung (wie bei dem von Ihnen vorgeschlagenen Verfahren).

Angenommen, Sie haben eine Funktion fit_model, die einen Datensatz mit den Attributen X und den gewünschten Antworten Y aufnimmt und das angepasste Modell für diesen Datensatz einschließlich der Optimierung von Hyperparametern (in diesem Fall Kernel und Regularisierungsparameter) zurückgibt. Diese Abstimmung von Hyperparametern kann auf viele Arten durchgeführt werden, zum Beispiel um den Kreuzvalidierungsfehler über X und T zu minimieren.

Schritt 1 - Passen Sie das Modell mit der Funktion fit_model an alle verfügbaren Daten an. Dies gibt Ihnen das Modell, das Sie im Betrieb verwenden werden.

Schritt 2 - Leistungsbewertung. Führen Sie eine wiederholte Gegenprüfung mit allen verfügbaren Daten durch. In jeder Falte werden die Daten in einen Trainingssatz und einen Testsatz aufgeteilt. Passen Sie das Modell mit dem Trainingsset an (zeichnen Sie Hyperparameterwerte für das angepasste Modell auf) und bewerten Sie die Leistung mit dem Testset. Verwenden Sie den Mittelwert über alle Testsätze als Leistungsschätzung (und betrachten Sie möglicherweise auch die Werteverteilung).

Schritt 3 - Variabilität der Hyperparametereinstellungen - Führen Sie eine Analyse der in Schritt 3 erfassten Hyperparameterwerte durch. Ich möchte jedoch darauf hinweisen, dass Hyperparameter nichts Besonderes sind, sondern lediglich Parameter des Modells, die geschätzt wurden (indirekt) ) aus den Daten. Sie werden aus rechnerischen / mathematischen Gründen eher als Hyperparameter als als Parameter behandelt, dies muss jedoch nicht der Fall sein.

Das Problem bei der Verwendung der Kreuzvalidierung besteht darin, dass die Trainings- und Testdaten keine unabhängigen Stichproben sind (da sie Daten gemeinsam nutzen), was bedeutet, dass die Schätzung der Varianz der Leistungsschätzung und der Hyperparameter wahrscheinlich verzerrt ist (d. H kleiner als es für wirklich unabhängige Datenproben in jeder Falte wäre). Anstelle einer wiederholten Kreuzvalidierung würde ich wahrscheinlich stattdessen Bootstrapping verwenden und die resultierenden Modelle einsacken, wenn dies rechnerisch machbar wäre.

Um eine unvoreingenommene Leistungsschätzung zu erhalten, muss jedes Verfahren, das Sie zum Generieren des endgültigen Modells (fit_model) verwenden, in jeder Falte des Kreuzvalidierungsverfahrens vollständig und unabhängig wiederholt werden.

Dikran Beuteltier
quelle
Das ist eine großartige Antwort. Wenn Sie sagen rather than repeated cross-validation you would go for bootstrapping- Was ist genau der Unterschied? In beiden Fällen werden die Daten mehrmals aufgeteilt trainund testanschließend trainiert trainund ausgewertet test, nicht wahr?
Josh
4
Bootstrapping (Sampling mit Ersatz) scheint eine natürlichere Methode zur Durchführung einer großen Anzahl von Neuabtastungen zu sein, da es eher zufällig als eine wiederholte Kreuzvalidierung ist. Für das Bootstrapping ist die Verwendung von Feinden mit Sackware eine nette Funktion, bei der der Out-of-Bag-Fehler als Leistungsschätzung dient. Es gibt keine große Auswahl zwischen den beiden.
Dikran Beuteltier
Thanks @Dikran - Ich habe mich gefragt, ob man unter der Annahme, dass man z. B. Bootstrapping verwendet, wie man ein gutes Modell unter Berücksichtigung des Mittelwerts und der Varianz zwischen den Wiederholungen auswählen würde . (dh welches Modellauswahlprotokoll würden Sie befolgen?). Diese Frage stellt genau diese Frage. Es wäre äußerst wertvoll, Ihre Beiträge zu diesem Thema zu erhalten!
Josh
@DikranMarsupial Können Sie eine Postleitzahl (z. B. Python oder R) für die Schritte 1-3 eingeben? Ich finde es viel einfacher, solche Prozeduren zu verstehen, wenn man konkreten Code sieht.
Tipp
1
Kernbotschaft: "Um eine unvoreingenommene Leistungsschätzung zu erhalten, muss jedes Verfahren, das Sie zum Generieren des endgültigen Modells (fit_model) verwenden, in jeder Falte des Kreuzvalidierungsverfahrens vollständig und unabhängig wiederholt werden." Diese genaue Botschaft wird auch in den Elementen des statistischen Lernens vermittelt (siehe Abschnitt 7.10.2): web.stanford.edu/~hastie/Papers/ESLII.pdf
NickBraunagel
0

γC

Eine Prozedur, die diese Hyperparameter optimiert und eine SVM mit diesen trainiert, ist auch nur ein Algorithmus für maschinelles Lernen . Anstatt nur die internen Parameter des SVM (die Unterstützungsvektoren) zu optimieren, werden auch die Hyperparameter optimiert.

Jetzt haben Sie zwei Probleme [die unabhängig voneinander gelöst werden können]:

Lesen Sie Cross-Validation-Missbrauch (Berichterstellung der Leistung für den besten Hyperparameterwert) , um sicherzustellen, dass Sie diese nicht verwechseln.


Eine spezifische (wahrscheinlich nicht optimale) Lösung für das konkrete Problem Ihrer Frage:

k = 5
loss_CV = zeros(k)
for i in 1:k 
    Xi_train, Xi_test = folds(X,k)[i]
    loss = zeros((3,3))
    for lambda in {0.1,0.2,0.5,1.0}
        for C in {10,100,1000}
            for j in 1:k
                Xj_train, Xj_test = folds(Xi_train,k)[j]
                model = SVM(Xj_train,lambda, C)
                loss[lambda,C] += test_error(model,Xj_test)
    lambda, C = argmax(loss)
    model = SVM(Xi_train,lambda, C)
    loss_CV += test_error(model,Xi_test)

loss = zeros((3,3))
for lambda in {0.1,0.2,0.5,1.0}
    for C in {10,100,1000}
        for j in 1:k
            Xj_train, Xj_test = folds(Xi_train,k)[j]
            model = SVM(Xj_train,lambda, C)
            loss[lambda,C] += test_error(model,Xj_test)
lambda, C = argmax(loss)
model = SVM(Xi_train,lambda, C)

Hier modelwäre Ihr "bestes Modell" und loss_CVeine "richtige Schätzung seines Generalisierungsfehlers" (obwohl nach oben voreingenommen, aber Sie können den Kuchen nicht haben und ihn auch essen).

Jan-Glx
quelle