Wie kann ein Algorithmus zur Vorhersage von Zeitreihen am besten bewertet werden?


7

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?


1
Sie können auch einen einzelnen Zug-Test-Split durchführen, bei dem der Testsatz rechtzeitig vom Trainingssatz weitergeleitet wird. Dies ist viel schneller, führt Sie aber auch eher in die Irre. Auch berücksichtigen die Auswirkungen der Prognosehorizont : ein Modell könnte sein , am besten bei der Vorhersage einen Schritt voraus, aber schlechter bei der Vorhersage 12 Schritte voraus.
Zach

Antworten:


10

Was Sie vorschlagen, wird in der Prognoseliteratur als "rollierender Ursprung" bezeichnet . Und ja, diese Methode zur Bewertung von Prognosealgorithmen ist sehr verbreitet.

Wenn Sie feststellen, dass die Leistung ein Engpass ist, können Sie Unterabtastungen durchführen. Verwenden Sie nicht jeden möglichen Ursprung. Verwenden Sie stattdessen beispielsweise jeden fünften möglichen Ursprung. (Stellen Sie sicher, dass Sie keine unerwünschten Verwechslungen zwischen Ihren unterabgetasteten Ursprüngen und der Saisonalität in die Daten einführen. Wenn Sie beispielsweise tägliche Daten verwenden, verwenden Sie nicht jeden siebten Tag als Ursprung, da Sie dann wirklich nur die Prognosequalität anhand bewerten Dienstags oder nur donnerstags etc.)

Andererseits müssen Sie Ihr Modell nicht jedes Mal, wenn Sie den Ursprung vorwärts rollen, von Grund auf neu trainieren. Beginnen Sie mit dem zuletzt trainierten Modell. (Aktualisieren Sie beispielsweise in Exponential Smoothing einfach Ihre Komponenten mit den neuen Daten seit dem letzten Training.) Dies sollte Ihre gesamte Trainingszeit drastisch verkürzen.


2
Ich habe auch gesehen, dass es Zeitreihen-Kreuzvalidierung heißt
Zach

Danke, ich dachte, dies sei ein bereits existierendes Konzept, aber ich kannte den formalen Namen nicht. Und ich stimme zu, Online-Training wird definitiv bevorzugt (und würde die Leistung erheblich verbessern), aber viele Algorithmen unterstützen dies nicht.
Cerin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.