Ich versuche, Random Forest Regression zum Erlernen von Scikits zu verwenden. Das Problem ist, dass ich einen sehr hohen Testfehler erhalte:
train MSE, 4.64, test MSE: 252.25.
So sehen meine Daten aus: (blau: echte Daten, grün: vorhergesagt):
Ich benutze 90% für das Training und 10% für den Test. Dies ist der Code, den ich verwende, nachdem ich mehrere Parameterkombinationen ausprobiert habe:
rf = rf = RandomForestRegressor(n_estimators=10, max_features=2, max_depth=1000, min_samples_leaf=1, min_samples_split=2, n_jobs=-1)
test_mse = mean_squared_error(y_test, rf.predict(X_test))
train_mse = mean_squared_error(y_train, rf.predict(X_train))
print("train MSE, %.4f, test MSE: %.4f" % (train_mse, test_mse))
plot(rf.predict(X))
plot(y)
Welche Strategien sind möglich, um meine Anpassung zu verbessern? Kann ich noch etwas tun, um das zugrunde liegende Modell zu extrahieren? Es scheint mir unglaublich, dass sich das Modell nach so vielen Wiederholungen desselben Musters mit neuen Daten so schlecht verhält. Habe ich überhaupt Hoffnung, diese Daten anzupassen?
Antworten:
Ich glaube, Sie verwenden ein falsches Werkzeug. Wenn Ihr gesamtes X dem Index entspricht, haben Sie im Grunde genommen eine abgetastete Funktion und versuchen, sie zu extrapolieren. Beim maschinellen Lernen dreht sich alles um die Interpolation der Geschichte. Es ist daher nicht verwunderlich, dass in diesem Fall ein spektakulärer Fehler auftritt.f: R → R
Was Sie brauchen, ist eine Zeitreihenanalyse (dh Extrahieren des Trends, Analysieren des Spektrums und Autoregressieren oder HMMing des Rests) oder Physik (dh Überlegen, ob es eine ODE gibt, die eine solche Ausgabe erzeugt, und versuchen, ihre Parameter über konservierte Größen anzupassen).
quelle
g
oderr
) und 2 Features (index
(zeitlich) undanimal
). Aus diesen Daten könnte ich mehrere Modelle zusammenstellen, die Merkmal 1 oder 2 (oder beiden gleich) mehr oder weniger Gewicht verleihen können. Die Kreuzvalidierung (unter der Annahme, dass genügend Daten vorliegen) sollte zu einem Modell führen, bei dem Merkmal 2 (Tier) eine geringere Bedeutung hat. Ich kann sehen, dass mein Modell die Daten überfüllt, aber ich denke immer noch, dass ich in der Lage sein sollte, ein Modell zu extrahieren, das diesem Muster folgt (weil sich das Verhalten nicht geändert hat), mit einem ausreichend großen Modellraum.Das größte Problem besteht darin, dass Regressionsbäume (und darauf basierende Algorithmen wie zufällige Wälder) stückweise konstante Funktionen vorhersagen und einen konstanten Wert für Eingaben liefern, die unter jedes Blatt fallen. Dies bedeutet, dass sie bei der Extrapolation außerhalb ihres Trainingsbereichs nur denselben Wert vorhersagen, den sie für den nächstgelegenen Punkt hätten, an dem sie Trainingsdaten hatten. @mbq ist richtig, dass es spezielle Tools zum Lernen von Zeitreihen gibt, die wahrscheinlich besser wären als allgemeine Techniken des maschinellen Lernens. Zufällige Wälder sind für dieses Beispiel jedoch besonders schlecht, und andere allgemeine ML-Techniken sind wahrscheinlich viel leistungsfähiger als das, was Sie sehen. SVMs mit nichtlinearen Kerneln sind eine Option, die in den Sinn kommt. Da Ihre Funktion periodisch aufgebaut ist, empfiehlt dies auch, den Frequenzbereich zu bearbeiten.
quelle
Dies ist ein Lehrbuchbeispiel für Datenüberanpassung. Das Modell eignet sich sehr gut für trainierte Daten, kollabiert jedoch bei allen neuen Testdaten. Dies ist eine der Strategien, um dies zu beheben: Führen Sie eine zehnfache Kreuzvalidierung der Trainingsdaten durch, um die Parameter zu optimieren.
Schritt 1. Erstellen Sie mithilfe der NM-Optimierung eine MSE-Minimierungsfunktion. Ein Beispiel könnte hier zu sehen sein: http://glowingpython.blogspot.de/2011/05/curve-fitting-using-fmin.html
Schritt 2. Innerhalb dieser Minimierungsfunktion besteht das Ziel darin, die MSE zu reduzieren. Erstellen Sie dazu eine zehnfache Aufteilung der Daten, wobei ein neues Modell in neunfachen Schritten gelernt und in der zehnten Stufe getestet wird. Dieser Vorgang wird zehnmal wiederholt, um die MSE bei jeder Faltung zu erhalten. Die aggregierte MSE wird als Ergebnis des Ziels zurückgegeben.
Schritt 3. Das Fmin in Python erledigt die Iterationen für Sie. Überprüfen Sie, welche Hyperparameter für die Feinabstimmung erforderlich sind (n_estimators, max_features usw.) und übergeben Sie sie an fmin.
Das Ergebnis sind die besten Hyperparameter, die die Möglichkeit einer Überanpassung verringern.
quelle
Einige Vorschläge:
nearest maximum
. Keine Ahnung, es könnte funktionieren oder auch nicht, du kannst es nur wissen, wenn du es testest :)quelle
quelle
Nachdem ich den obigen Beitrag gelesen habe, möchte ich eine andere Antwort geben.
Bei baumbasierten Modellen, z. B. zufälligen Gesamtstrukturen, können sie den Wert nicht über den Trainingssatz hinaus extrapolieren. Ich denke also nicht, dass es sich um ein Überanpassungsproblem handelt, sondern um eine falsche Modellierungsstrategie.
Was können wir also für die Vorhersage von Zeitreihen mit dem Baummodell tun?
Die Möglichkeit besteht darin, sie mit der linearen Regression zu kombinieren: zuerst die Zeitreihe abschneiden (oder den Trend mit der linearen Regression modellieren), dann das Residuum mit Bäumen modellieren (Residuen sind begrenzt, damit Baummodelle damit umgehen können).
Außerdem gibt es ein Baummodell, das mit einer linearen Regression kombiniert werden kann, die man als kubistisch bezeichnet. Es führt eine lineare Regression auf dem Blatt durch.
quelle
Wenn Sie nur innerhalb der Grenzen des Diagramms vorhersagen möchten, sollten Sie das Problem lösen, indem Sie die Beobachtungen vor dem Aufteilen des Datensatzes einfach nach dem Zufallsprinzip sortieren. Aus der dargestellten Extrapolation wird dann ein Interpolationsproblem.
quelle