Temporal Fusion Transformer: Zeitreihenvorhersage mit Deep Learning – Vollständiges Tutorial

Erstellen Sie genaue und interpretierbare Vorhersagen

Erstellt mit DALLE [1]

Laut [2] gilt: Zeitfusionstransformator übertrifft alle bekannten Deep-Learning-Modelle für die Zeitreihenvorhersage.

Einschließlich eines vorgestellten Baum zur Steigerung des Farbverlaufs Modell für tabellarische Zeitreihendaten.

Aber was ist Temporal Fusion Transformer (TFT)[3] und warum ist es so interessant?

In diesem Artikel erläutern wir kurz die Neuheiten von Zeitfusionstransformator und darauf ein End-to-End-Projekt aufbauen Prognose des Energiebedarfs. Im Einzelnen werden wir Folgendes behandeln:

  • So bereiten Sie unsere Daten für das TFT-Format vor.
  • So erstellen, trainieren und evaluieren Sie das TFT-Modell.
  • So erhalten Sie Vorhersagen zu Validierungsdaten und Out-of-Sample-Vorhersagen.
  • Wie man rechnet Feature-Wichtigkeiten, Saisonalitätsmuster, und Robustheit bei extremen Ereignissen mit den eingebauten Modellen interpretierbare Aufmerksamkeit Mechanismus.

Lass uns eintauchen!

Eine ausführliche Analyse der Temporal Fusion Transformer-Architektur finden Sie in meinem vorherigen Artikel Artikel.

Temporal FVerwendung TTransformator (TFT) ist ein Transformer-basiertes Modell, das die Selbstaufmerksamkeit nutzt, um die komplexe zeitliche Dynamik mehrerer Zeitsequenzen zu erfassen.

TFT unterstützt:

  • Mehrere Zeitreihen: Wir können ein TFT-Modell anhand Tausender univariater oder multivariater Zeitreihen trainieren.
  • Multi-Horizont-Prognose: Das Modell gibt mehrstufige Vorhersagen einer oder mehrerer Zielvariablen aus – einschließlich Vorhersageintervallen.
  • Heterogene Merkmale: TFT unterstützt viele Arten von Funktionen, einschließlich zeitvarianter und statischer exogener Variablen.
  • Interpretierbare Vorhersagen: Vorhersagen können im Hinblick auf variable Bedeutung und Saisonalität interpretiert werden.

Eine dieser Eigenschaften ist einzigartig Zeitfusionstransformator. Wir werden dies im nächsten Abschnitt behandeln.

Zu den bemerkenswerten DL-Zeitreihenmodellen (z. B. DeepAR[4]) zeichnet sich TFT dadurch aus, dass es verschiedene Arten von Funktionen unterstützt. Diese sind:

  • Zeitlich variabel bekannt
  • Zeitlich variabel unbekannt
  • Zeitinvariant echt
  • Zeitinvariant kategorisch

Stellen Sie sich zum Beispiel vor, wir hätten eine Umsatzprognosefall:

Nehmen wir an, wir müssen den Verkauf von drei Produkten vorhersagen. Der num sales ist die Zielvariable. Der CPI index oder im number of visitors sind zeitlich variierend unbekannt Merkmale, da sie nur bis zum Vorhersagezeitpunkt bekannt sind. Jedoch, holidaysund special days sind zeitveränderlich bekannt Veranstaltungen.

Das product id is eine zeitinvariante (statische) Kategorialfunktion Besonderheit. Andere Merkmale, die numerisch und nicht zeitabhängig sind, wie z yearly_revenue kann kategorisiert werden als zeitinvariante real.

Bevor wir zu unserem Projekt übergehen, zeigen wir zunächst ein Mini-Tutorial, wie Sie Ihre Daten in konvertieren erweitertes Zeitreihenformat.

Hinweis: Alle Bilder und Abbildungen in diesem Artikel wurden vom Autor erstellt.

Für dieses Tutorial verwenden wir die TemporalFusionTransformer Modell aus dem PyTorch-Prognose Bibliothek und PyTorch Lightning:

pip installiere Torch Pytorch-Lightning pytorch_forecasting

Der gesamte Prozess umfasst drei Dinge:

  1. Erstellen Sie einen Pandas-Datenrahmen mit unseren Zeitreihendaten.
  2. Wickeln Sie unseren Datenrahmen in einen TimeSeriesDataset Beispiel.
  3. Übergeben Sie uns TimeSeriesDataset Instanz zu TemporalFusionTransformer.

Das TimeSeriesDataset ist sehr nützlich, da es uns hilft anzugeben, ob Features zeitlich variabel oder statisch sind. Außerdem ist es das einzige Format, das TemporalFusionTransformer akzeptiert.

Lassen Sie uns einen minimalen Trainingsdatensatz erstellen, um zu zeigen, wie TimeSeriesDataset funktioniert:

Wir sollten unsere Daten wie folgt formatieren: Jedes farbige Kästchen stellt eine andere Zeitreihe dar, dargestellt durch seine group Wert.

Abbildung 1: Der Datenrahmen „sample_data pandas“.

Die wichtigste Spalte unseres Datenrahmens ist die time_idx — Es bestimmt die Reihenfolge der Proben. Wenn keine Beobachtungen fehlen, sollten die Werte um erhöht werden +1 für jede Zeitreihe.

Als nächstes packen wir unseren Datenrahmen in einen TimeSeriesDataset Beispiel:

Alle Argumente sind selbsterklärend: Die max_encoder_length definiert den Lookback-Zeitraum und max_prediction_length Gibt an, wie viele Datenpunkte vorhergesagt werden. In unserem Fall blicken wir drei Zeitschritte in die Vergangenheit zurück, um zwei Vorhersagen auszugeben.

Das TimeSeriesDataset Die Instanz dient nun als Datenlader. Lassen Sie uns einen Stapel drucken und prüfen, wie unsere Daten an TFT übergeben werden:

Dieser Stapel enthält die Trainingswerte [0,1] aus der ersten Zeitreihe (group 0) und die Testwerte[2,3,4]. Wenn Sie diesen Code erneut ausführen, erhalten Sie andere Werte, da die Daten standardmäßig gemischt werden.

Unser Projekt wird die verwenden Strom-Lastdiagramme20112014 [5] Datensatz von UCI. Das Notizbuch für dieses Beispiel kann unter heruntergeladen werden hier:

Dieser Datensatz enthält den Stromverbrauch (in kW) von 370 Kunden/Verbrauchern im 15-Minuten-Takt. Die Daten umfassen 4 Jahre (2011–2014).

Einige Verbraucher wurden nach 2011 erstellt, sodass ihr Stromverbrauch zunächst bei Null liegt.

Wir führen eine Datenvorverarbeitung gem [3]:

  • Aggregieren Sie unsere Zielvariable power_usage pro Stunde.
  • Finden Sie das früheste Datum für jede Zeitreihe, in der die Potenz ungleich Null ist.
  • Erstellen Sie neue Funktionen: month, day, hour und day_of_week.
  • Wählen Sie alle Tage dazwischen aus 2014–01–01 und 2014–09–07.

Lasst uns beginnen:

Daten herunterladen

wget https://archive.ics.uci.edu/ml/machine-learning-databases/00321/LD2011_2014.txt.zip
!entpacken
LD2011_2014.txt.zip

Datenvorverarbeitung

Jede Spalte repräsentiert einen Verbraucher. Am originellsten power_usage Werte sind 0.

Als nächstes aggregieren wir zu stündlichen Daten. Aufgrund der Größe und Komplexität des Modells trainieren wir unser Modell nur auf 5 Verbrauchern (für diejenigen mit Werten ungleich Null).

Jetzt bereiten wir unseren Datensatz für die vor TimeSeriesDataset Format. Beachten Sie, dass jede Spalte eine andere Zeitreihe darstellt. Daher „schmelzen“ wir unseren Datenrahmen, sodass alle Zeitreihen vertikal statt horizontal gestapelt werden. Dabei erstellen wir unsere neuen Features.

Der endgültige vorverarbeitete Datenrahmen wird aufgerufen time_df. Drucken wir den Inhalt aus:

Das time_df liegt jetzt im richtigen Format für vor TimeSeriesDataset. Wie Sie inzwischen erraten haben, ist die Granularität stündlich hours_from_start Variable wird die sein Zeitindex.

Explorative Datenanalyse

Die Auswahl von 5 Verbrauchern/Zeitreihen ist nicht zufällig. Der power usage jeder Zeitreihe hat unterschiedliche Eigenschaften, wie zum Beispiel den Mittelwert:

time_df[['consumer_id','power_usage']].groupby('consumer_id').mean()

Lassen Sie uns den ersten Monat jeder Zeitreihe grafisch darstellen:

Abbildung 2: Der erste Monat aller 5 Zeitreihen/Konsumenten.

Es gibt keinen erkennbaren Trend, aber jede Zeitreihe weist leicht unterschiedliche Saisonalität und Amplitude auf. Wir können weiter experimentieren und Stationarität, Signalzerlegungen usw. überprüfen, aber in unserem Fall konzentrieren wir uns nur auf den Aspekt der Modellbildung.

Beachten Sie auch, dass andere Methoden zur Zeitreihenprognose wie z ARIMA muss einige Anforderungen erfüllen (z. B. muss die Zeitreihe zunächst stationär werden). Mit TFT können wir unsere Daten unverändert lassen.

Erstellen Sie DataLoader

In diesem Schritt übergeben wir unsere time_df zu den TimeSeriesDataSet Format, das äußerst nützlich ist, weil:

  • Es erspart uns das Schreiben unseres eigenen Dataloaders.
  • Wir können festlegen, wie TFT mit den Funktionen des Datensatzes umgeht.
  • Wir können unseren Datensatz problemlos normalisieren. In unserem Fall ist eine Normalisierung zwingend erforderlich, da sich alle Zeitsequenzen in ihrer Größe unterscheiden. Daher verwenden wir die GroupNormalizer jede Zeitreihe einzeln zu normalisieren.

Unser Modell verwendet ein Rückblickfenster von einer Woche (7*24), um den Stromverbrauch der nächsten 24 Stunden vorherzusagen.

Beachten Sie außerdem, dass die hours_from_start ist sowohl der Zeitindex als auch ein zeitveränderliches Merkmal. Der power_usage ist unsere Zielvariable. Zur Veranschaulichung ist unser Validierungssatz der letzte Tag:

Basismodell

Als nächstes kommt der Schritt, den fast jeder vergisst: Ein Basismodell. Insbesondere bei Zeitreihenprognosen werden Sie überrascht sein, wie oft ein naiver Prädiktor sogar ein ausgefalleneres Modell übertrifft!

Als naive Basis sagen wir die Stromverbrauchskurve des Vortages voraus:

Training des Temporal Fusion Transformer-Modells

Wir können unser TFT-Modell mit dem Vertrauten trainieren Trainer:innen Schnittstelle von PyTorch Lightning.

Beachten Sie die folgenden Dinge:

  • Wir nutzen die Frühes Stoppen Rückruf zur Überwachung des Validierungsverlusts.
  • Wir verwenden Tensorbrett um unsere Trainings- und Validierungsmetriken zu protokollieren.
  • Unser Modell verwendet Quantilverlust – eine spezielle Art von Verlust, der uns bei der Ausgabe der Vorhersageintervalle hilft. Weitere Informationen zur Quantilverlustfunktion finden Sie unter Überprüfen Sie diesen Artikel.
  • Wir verwenden 4 Aufmerksamkeitsköpfe, wie das Originalpapier.

Wir sind jetzt bereit, unser Modell zu erstellen und zu trainieren:

Das ist es! Nach 6 Epochen setzt EarlyStopping ein und stoppt das Training.

Laden und speichern Sie das beste Modell

Vergessen Sie nicht, Ihr Modell zu speichern. Obwohl wir es beizen können, ist die sicherste Option, die beste Epoche direkt zu speichern:

!zip -r model.zip lightning_logs/lightning_logs/version_1/*

Um das Modell erneut zu laden, entpacken Sie es model.zip und führen Sie Folgendes aus – merken Sie sich einfach den besten Modellpfad:

Überprüfen Sie Tensorboard

Schauen Sie sich die Trainings- und Validierungskurven mit Tensorboard genauer an:

Modellbewertung

Erhalten Sie Vorhersagen zum Validierungssatz und berechnen Sie den Durchschnitt P50 (Quantilmedian) Verlust:

Die letzten beiden Zeitreihen weisen einen etwas höheren Verlust auf, da ihre relative Größe ebenfalls hoch ist.

Plotvorhersagen zu Validierungsdaten

Wenn wir das bestehen mode=raw auf die vorhersagen() Methode erhalten wir weitere Informationen, einschließlich Vorhersagen für alle sieben Quantile. Wir haben auch Zugriff auf die Aufmerksamkeitswerte (dazu später mehr).

Schauen Sie sich das genauer an raw_predictions Variable:

Wir nutzen die plot_prediction() um unsere Grundstücke zu erstellen. Natürlich können Sie Ihr eigenes individuelles Grundstück erstellen – das plot_prediction() hat den zusätzlichen Vorteil, dass die Aufmerksamkeitswerte hinzugefügt werden.

Hinweis: Unser Modell sagt die nächsten 24 Datenpunkte voraus auf einmal. Dies ist kein rollierendes Prognoseszenario, bei dem ein Modell a vorhersagt Single ermittelt jedes Mal den Wert und fügt alle Vorhersagen zusammen.

Wir erstellen für jeden Verbraucher ein Diagramm (insgesamt 5).

Abbildung 3: Vorhersagen zu Validierungsdaten für MT_002
Abbildung 4: Vorhersagen zu Validierungsdaten für MT_004
Abbildung 5: Vorhersagen zu Validierungsdaten für MT_005
Abbildung 6: Vorhersagen zu Validierungsdaten für MT_006
Abbildung 7: Vorhersagen zu Validierungsdaten für MT_008

Die Ergebnisse sind durchaus beeindruckend.

Unsere Zeitfusionstransformator Das Modell konnte das Verhalten aller fünf Zeitreihen erfassen, sowohl hinsichtlich der Saisonalität als auch der Größenordnung!

Beachten Sie außerdem Folgendes:

  • Wir haben kein Hyperparameter-Tuning durchgeführt.
  • Wir haben keine ausgefallene Feature-Engineering-Technik implementiert.

In einem folgenden Abschnitt zeigen wir, wie wir unser Modell durch Hyperparameteroptimierung verbessern können.

Zeichnen Sie Vorhersagen für eine bestimmte Zeitreihe auf

Zuvor zeichnen wir Vorhersagen zu den Validierungsdaten mithilfe von auf idx Argument, das alle Zeitreihen in unserem Datensatz durchläuft. Wir können spezifischer sein und Vorhersagen für eine bestimmte Zeitreihe ausgeben:

Abbildung 7: Tagesvorhersage für MT_004 auf dem Trainingsset

In Abbildung 7, Wir planen den Tag im Voraus MT_004 Verbraucher für Zeitindex=26512.

Denken Sie an unsere Zeitindex-Kolumne hours_from_start beginnt bei 26304 und wir können Vorhersagen ab 26388 erhalten (weil wir früher eingestellt haben). min_encoder_length=max_encoder_length // 2 was gleich ist 26304 + 168//2=26388

Prognosen außerhalb der Stichprobe

Lassen Sie uns Vorhersagen außerhalb der Stichprobe erstellen, die über den endgültigen Datenpunkt der Validierungsdaten hinausgehen 2014–09–07 23:00:00

Wir müssen lediglich einen neuen Datenrahmen erstellen, der Folgendes enthält:

  • Die Anzahl der N=max_encoder_length vergangene Daten, die als Lookback-Fenster dienen – die Encoderdaten in der TFT-Terminologie.
  • Die zukünftigen Daten der Größe max_prediction_length für die wir unsere Vorhersagen berechnen wollen – die Decoder-Daten.

Wir können Vorhersagen für alle fünf unserer Zeitreihen oder nur für eine erstellen. Figure 7 zeigt die Out-of-Sample-Vorhersagen für Verbraucher MT_002:

Abbildung 7: Day-Ahead-Vorhersage für MT_002

Genaue Prognosen sind eine Sache, aber auch die Erklärbarkeit ist heutzutage von großer Bedeutung.

Und noch schlimmer ist es bei Deep-Learning-Modellen, die als Black Boxes gelten. Methoden wie z LIME und FORM kann (bis zu einem gewissen Grad) Erklärbarkeit bieten, funktioniert aber nicht gut für Zeitreihen. Außerdem handelt es sich um externe Post-hoc-Methoden, die nicht an ein bestimmtes Modell gebunden sind.

Zeitfusionstransformator bietet drei Arten der Interpretierbarkeit:

  • Saisonal gesehen: TFT nutzt seinen Roman Interpretierbare Mehrkopfaufmerksamkeit Mechanismus zur Berechnung der Wichtigkeit vergangener Zeitschritte.
  • Funktionstechnisch: TFT nutzt seine Variablenauswahlnetzwerk Modul zur Berechnung der Wichtigkeit jedes Merkmals.
  • Robustheit bei extremen Ereignissen: Wir können untersuchen, wie sich Zeitreihen bei seltenen Ereignissen verhalten

Wenn Sie mehr über das Innenleben von erfahren möchten Interpretierbare Mehrkopfaufmerksamkeit und Variables Auswahlnetzwerk, Schauen Sie sich meinen vorherigen Artikel an.

Saisonale Interpretierbarkeit

TFT untersucht die Aufmerksamkeitsgewichte, um die zeitlichen Muster über vergangene Zeitschritte hinweg zu verstehen.

Die grauen Linien in allen vorherigen Diagrammen stellen die Aufmerksamkeitswerte dar. Schauen Sie sich diese Plots noch einmal an – fällt Ihnen etwas auf? Figure 8 zeigt die Erkenntnisse von Figure 7 und berücksichtigt auch die Aufmerksamkeitswerte:

Abbildung 8: Tagesvorhersage für MT_001 mit angezeigten Saisonalitäten

Die Aufmerksamkeitswerte zeigen, wie wirkungsvoll diese Zeitschritte sind, wenn das Modell seine Vorhersage ausgibt. Die kleinen Spitzen spiegeln die tägliche Saisonalität wider, während die höheren Spitzen gegen Ende wahrscheinlich die wöchentliche Saisonalität implizieren.

Wenn wir die Aufmerksamkeitskurven über alle Zeitschritte und Zeitreihen mitteln (nicht nur über die 5, die wir in diesem Tutorial verwendet haben), erhalten wir die symmetrisch aussehende Form Figure 9 vom TFT-Papier:

Abbildung 9: Zeitliche Muster für Elektrizitätsdatensatz (Quelle)

Frage: Was nützt das? Können wir Saisonalitätsmuster nicht einfach mit Methoden wie ACF-Plots, Zeitsignalzerlegung usw. abschätzen?

Antworten: WAHR. Die Untersuchung der Aufmerksamkeitsgewichte von TFT bietet jedoch zusätzliche Vorteile:

  1. Wir können bestätigen, dass unser Modell die scheinbare saisonale Dynamik unserer Sequenzen erfasst.
  2. Unser Modell kann auch versteckte Muster aufdecken, da die Aufmerksamkeitsgewichte der aktuellen Eingabefenster alle vergangenen Eingaben berücksichtigen.
  3. Das Aufmerksamkeitsgewichtungsdiagramm ist nicht dasselbe wie ein Autokorrelationsdiagramm: Das Autokorrelationsdiagramm bezieht sich auf eine bestimmte Sequenz, während sich die Aufmerksamkeitsgewichte hier auf die Auswirkung jedes Zeitschritts konzentrieren, indem alle Kovariaten und Zeitreihen betrachtet werden.

Funktionsbezogene Interpretierbarkeit

Das Variablenauswahlnetzwerk Komponente von TFT kann das leicht abschätzen Feature-Wichtigkeiten:

Abbildung 10: Bietet wichtige Informationen zu Validierungsdaten

In Figure 10, fällt uns Folgendes auf:

  • Das hour und day_of_week haben starke Werte, sowohl als vergangene Beobachtungen als auch als zukünftige Kovariaten. Der Benchmark im Originalpapier kommt zu derselben Schlussfolgerung.
  • Das power_usage ist offensichtlich die einflussreichste beobachtete Kovariate.
  • Das consumer_id ist hier nicht sehr aussagekräftig, da wir nur 5 Verbraucher verwenden. Im TFT-Papier, in dem die Autoren alle 370 Verbraucher verwenden, ist diese Variable von größerer Bedeutung.

Hinweis: Wenn Ihre statische Gruppierungsvariable nicht wichtig ist, ist es sehr wahrscheinlich, dass Ihr Datensatz auch mit einem einzelnen Verteilungsmodell (wie ARIMA) genauso gut modelliert werden kann.

Erkennung extremer Ereignisse

Zeitreihen sind bekanntermaßen anfällig für plötzliche Änderungen ihrer Eigenschaften bei seltenen Ereignissen (auch als „…“ bezeichnet). Schocks).

Schlimmer noch, diese Ereignisse sind sehr schwer zu fassen. Stellen Sie sich vor, Ihre Zielvariable wird für einen kurzen Zeitraum volatil, weil eine Kovariate stillschweigend ihr Verhalten ändert:

Handelt es sich hierbei um zufälliges Rauschen oder um ein verstecktes, anhaltendes Muster, das unserem Modell entgeht?

Mit TFT können wir die Robustheit jedes einzelnen Merkmals über seinen Wertebereich hinweg analysieren. Leider weist der aktuelle Datensatz keine Volatilität oder seltene Ereignisse auf – diese sind eher in Finanz-, Verkaufsdaten usw. zu finden. Dennoch zeigen wir, wie man sie berechnet:

Bei einigen Features sind nicht alle Werte im Validierungsdatensatz vorhanden, daher zeigen wir nur die hour und consumer_id:

Abbildung 11: Vorhersagen im Vergleich zu tatsächlichen Werten (normalisierte Mittelwerte) pro Stunde
Abbildung 12: Vorhersagen im Vergleich zu tatsächlichen Werten (normalisierte Mittelwerte) auf Consumer_ID

In beiden Abbildungen sind die Ergebnisse ermutigend. In Figure 12, bemerken wir diesen Verbraucher MT_004 schneidet im Vergleich zu anderen Verbrauchern leicht ab. Wir könnten dies überprüfen, wenn wir den P50-Verlust jedes Verbrauchers mit seinem zuvor berechneten durchschnittlichen Stromverbrauch normalisieren.

Die grauen Balken geben die Verteilung jeder Variablen an. Eine Sache, die ich immer mache, ist herauszufinden, welche Werte eine niedrige Häufigkeit haben. Dann überprüfe ich, wie das Modell in diesen Bereichen funktioniert. Daher können Sie leicht erkennen, ob Ihr Modell das Verhalten seltener Ereignisse erfasst.

Im Allgemeinen können Sie diese TFT-Funktion verwenden, um Ihr Modell auf Schwachstellen zu untersuchen und mit der weiteren Untersuchung fortzufahren.

Wir können nahtlos verwenden Zeitfusionstransformator mit Opt So führen Sie eine Hyperparameter-Optimierung durch:

Das Problem besteht darin, dass TFT, da es sich um ein Transformer-basiertes Modell handelt, erhebliche Hardware-Ressourcen benötigt!

Zeitfusionstransformator ist zweifellos ein Meilenstein für die Time-Series-Community.

Das Modell erzielt nicht nur SOTA-Ergebnisse, sondern bietet auch einen Rahmen für die Interpretierbarkeit von Vorhersagen. Das Modell ist auch in der erhältlich Darts Python-Bibliothek, die auf der PyTorch Forecasting-Bibliothek basiert.

Schließlich, wenn Sie neugierig sind, mehr über die Architektur des zu erfahren Zeitfusionstransformator Im Detail überprüfen Sie die Begleitartikel auf dem Originalpapier.

Temporal Fusion Transformer: Zeitreihenvorhersage mit Deep Learning – Vollständiges Tutorial neu veröffentlicht von der Quelle https://towardsdatascience.com/temporal-fusion-transformer-time-series-forecasting-with-deep-learning-complete-tutorial-d32c1e51cd91?source= rss—-7f60cf5620c9—4 über https://towardsdatascience.com/feed

<!–

->

Zeitstempel:

Mehr von Blockchain-Berater