Modellstapelung, Super Learner-Algorithmus
Ich habe vor kurzem angefangen, Ensembles in ML zu studieren, insbesondere Super Learner Algorithm. Um ehrlich zu sein, obwohl ich mehrere Artikel zu diesem Thema gelesen habe, bin ich ein bisschen verwirrt. Ich möchte Schritt für Schritt alles manuell erledigen, damit ich den Prozess wirklich verstehen kann.
Der Algorithmus wird normalerweise als die Folge der folgenden Schritte beschrieben:
- Trainieren Sie jeden der L-Basisalgorithmen auf dem Trainingssatz.
- Führen Sie für jeden dieser Lernenden eine k-fache Kreuzvalidierung durch und sammeln Sie die kreuzvalidierten Vorhersagewerte von jedem der L-Algorithmen.
- Die N kreuzvalidierten vorhergesagten Werte von jedem der L Algorithmen können kombiniert werden , um eine neue N x L Matrix zu bilden. Diese Matrix wird zusammen mit dem ursprünglichen Antwortvektor als "Level-One" -Daten bezeichnet. (N = Anzahl der Zeilen im Trainingssatz)
- Trainieren Sie den Metalearning-Algorithmus anhand der Daten der ersten Ebene.
- Das "Ensemble-Modell" besteht aus den L-Basis-Lernmodellen und dem Metalearning-Modell, die dann verwendet werden können, um Vorhersagen für einen Testsatz zu generieren.
Ich habe mehrere Fragen:
- Warum sind der erste und der zweite Schritt getrennt? Nehmen wir der Einfachheit halber an, dass ich keine Parameter einstellen muss. Bedeutet das, dass ich nur ein Modell , z. B. xgbTree , mit einem k-fachen Lebenslauf trainieren muss? Z.B:
tc_XGB <- trainControl(method = "cv", number = 5, savePred = TRUE)
fit_XGB <- train(x = input_x, y = input_y, method = "xgbTree",
trControl = train_control_final, tuneGrid = Grid_final)
Hinweis : input_xund input_ystammen aus einem Trainingsset.
- Der nächste Schritt besteht darin , die kreuzvalidierten vorhergesagten Werte zu sammeln . Sollte ich
fit_XGB $predalle kreuzvalidierten Vorhersagen verwenden und extrahieren und diese Aktion L-mal wiederholen (L - eine Reihe von Algorithmen)?
Ich würde sagen, dass mir alle nächsten Schritte mehr oder weniger klar sind. Ich habe einige Zweifel, aber ich kann wirklich nicht sagen, was an meiner Herangehensweise falsch ist.
Antworten
Frage 1
Ich denke, die Verwirrung ergibt sich aus der gängigen Praxis, die die Trennung unklar macht: "Trainiere ein Modell ... mit k-fachem Lebenslauf" ist eigentlich keine Sache. EIN$k$-fache Kreuzvalidierung erzeugt kein trainiertes Modell. In den meisten enthaltenen Hyperparameter-Tuning-Paketen caretwird jedoch automatisch ein endgültiges Modell für den gesamten Trainingssatz trainiert, nachdem die Kreuzvalidierung einen besten Hyperparametersatz ausgewählt hat. aus den Dokumenten :
Die Kombination mit der optimalen Resampling-Statistik wird als endgültiges Modell ausgewählt und der gesamte Trainingssatz wird verwendet, um ein endgültiges Modell anzupassen.
Also, caretmacht beide Schritte 1 und 2 für Sie.
Frage 2
Ja, das wird funktionieren. Siehe zB Wie funktioniert die Kreuzvalidierung im Zug (Caret) genau? .
Sie sagten, Sie wollten dies manuell tun, um zu verstehen, was gut ist. aber ich werde erwähnen, dass es ein Paket gibt, das erweitert wird caret, um all dies automatisch auszuführen : caretEnsemble.