Was ist die beste Vorgehensweise zum Trainieren und Bewerten eines Vorhersagealgorithmus für eine Zeitreihe?
Zum Lernen von Algorithmen, die im Batch-Modus trainiert werden, kann ein naiver Programmierer den Rohdatensatz [(sample, expected prediction),...]
direkt an die train()
Methode des Algorithmus weitergeben . Dies zeigt normalerweise eine künstlich hohe Erfolgsrate, da der Algorithmus effektiv "betrügt", indem zukünftige Stichproben verwendet werden, um Vorhersagen zu treffen, die auf früheren Stichproben gemacht wurden. Wenn Sie tatsächlich versuchen, das trainierte Modell zu verwenden, um neue Daten in Echtzeit vorherzusagen, wird es wahrscheinlich eine schreckliche Leistung erbringen, da es keine zukünftigen Daten mehr gibt, auf die Sie sich verlassen können.
Mein aktueller Ansatz ist es, zu trainieren und zu bewerten, wie Sie es in Echtzeit tun könnten. Für N chronologisch geordnete Trainingsmuster, bei denen jedes Muster ein Tupel ist, das aus dem Eingang A und dem erwarteten Vorhersage-Ausgang B besteht, gebe ich A in meinen Algorithmus ein und erhalte das tatsächliche Ergebnis C. Ich vergleiche dies mit B und zeichne den Fehler auf. Dann füge ich das Beispiel der lokalen "vergangenen" Teilmenge hinzu und trainiere ein neues Modell im Batch nur für die Teilmenge. Ich wiederhole diesen Vorgang dann für jedes Trainingsmuster.
Oder um es in Pseudocode zu setzen:
predictor = Predictor()
training_samples = []
errors = []
for sample in sorted(all_samples, key=lambda o: o.date):
input_data, expected_prediction = sample
# Test on current test slice.
actual_prediction = predictor.predict(input_data)
errors.append(expected_prediction == actual_prediction)
# Re-train on all "past" samples relative to the current time slice.
training_samples.append(sample)
predictor = Predictor.train(training_samples)
Dies scheint sehr gründlich zu sein, da es simuliert, was ein Benutzer tun müsste, wenn er bei jedem Zeitschritt eine Vorhersage treffen müsste, aber für einen großen Datensatz wäre dies natürlich furchtbar langsam, da Sie die Trainingszeit des Algorithmus multiplizieren (was für viele Algorithmen und große Datenmengen hoch ist) bei jeder Stichprobe.
Gibt es einen besseren Ansatz?