Temporal Fusion Transformer: Tidsserieprognoser med dyp læring — komplett veiledning

Lag nøyaktige og tolkbare spådommer

Opprettet med DALLE [1]

I følge [2], Temporal Fusion Transformator overgår alle fremtredende Deep Learning-modeller for tidsserieprognoser.

Inkludert en omtalt Gradientforsterkende tre modell for tabellformede tidsseriedata.

Men hva er det Temporal Fusion Transformer (TFT)[3] og hvorfor er det så interessant?

I denne artikkelen forklarer vi kort nyhetene til Temporal Fusion Transformator og bygge et ende-til-ende-prosjekt på Energibehovsprognoser. Konkret vil vi dekke:

  • Hvordan forberede dataene våre for TFT-formatet.
  • Hvordan bygge, trene og evaluere TFT-modellen.
  • Hvordan få spådommer på valideringsdata og spådommer utenfor utvalg.
  • Hvordan beregne funksjoner viktigheter, sesongmessige mønstre, og ekstreme hendelser robusthet ved hjelp av den innebygde modellen tolkbar oppmerksomhet mekanisme.

La oss dykke inn!

For en grundig analyse av Temporal Fusion Transformer-arkitekturen, sjekk min forrige Artikkel.

Temporalsk Fbruk Tranformer (TFT) er en transformatorbasert modell som utnytter selvoppmerksomhet for å fange den komplekse tidsmessige dynamikken til flere tidssekvenser.

TFT støtter:

  • Flere tidsserier: Vi kan trene en TFT-modell på tusenvis av univariate eller multivariate tidsserier.
  • Multi-Horizon Forecasting: Modellen gir ut flertrinnsprediksjoner av én eller flere målvariabler – inkludert prediksjonsintervaller.
  • Heterogene egenskaper: TFT støtter mange typer funksjoner, inkludert tidsvarianter og statiske eksogene variabler.
  • Tolkbare spådommer: Spådommer kan tolkes i form av variabel betydning og sesongvariasjon.

En av disse egenskapene er unik for Temporal Fusion Transformator. Vi vil dekke dette i neste avsnitt.

Blant bemerkelsesverdige DL-tidsseriemodeller (f.eks. DeepAR[4]), skiller TFT seg ut fordi den støtter ulike typer funksjoner. Disse er:

  • Tidsvarierende kjent
  • Tidsvarierende ukjent
  • Tidsuvarierende ekte
  • Tidsuvarierende kategorisk

Tenk deg for eksempel at vi har en salgsprognosesak:

La oss si at vi må forutsi salget av 3 produkter. De num sales er målvariabelen. De CPI index eller number of visitors er tidsvarierende ukjent funksjoner fordi de bare er kjent frem til prediksjonstid. Derimot, holidaysog special days er tidsvarierende kjent arrangementer.

De product id is en tidsinvariant (statisk) kategori trekk. Andre funksjoner som er numeriske og ikke tidsavhengige som f.eks yearly_revenue kan kategoriseres som tidsinvariant reell.

Før vi går over til prosjektet vårt, vil vi først vise en miniveiledning om hvordan du konverterer dataene dine til utvidet tidsserieformat.

OBS: Alle bilder og figurer i denne artikkelen er laget av forfatteren.

For denne opplæringen bruker vi TemporalFusionTransformer modell fra PyTorch-prognoser bibliotek og PyTorch Lightning:

pip installer fakkel pytorch-lightning pytorch_forecasting

Hele prosessen involverer 3 ting:

  1. Lag en panda-dataramme med tidsseriedataene våre.
  2. Pakk inn datarammen vår i en TimeSeriesDataset forekomst.
  3. Bestå vår TimeSeriesDataset eksempel til TemporalFusionTransformer.

De TimeSeriesDataset er veldig nyttig fordi det hjelper oss å spesifisere om funksjoner er tidsvarierende eller statiske. Dessuten er det det eneste formatet som TemporalFusionTransformer godtar.

La oss lage et minimalt opplæringsdatasett for å vise hvordan TimeSeriesDataset verk:

Vi bør formatere dataene våre på følgende måte: Hver farget boks representerer en annen tidsserie, representert ved sin group verdi.

Figur 1: sample_data pandas-datarammen

Den viktigste kolonnen i datarammen vår er time_idx — den bestemmer rekkefølgen av prøvene. Hvis det ikke mangler observasjoner, bør verdiene øke med +1 for hver tidsserie.

Deretter pakker vi inn datarammen vår i en TimeSeriesDataset forekomst:

Alle argumenter er selvforklarende: The max_encoder_length definerer tilbakeblikksperioden og max_prediction_length angir hvor mange datapunkter som vil bli forutsagt. I vårt tilfelle ser vi tilbake 3 tidstrinn i fortiden for å gi 2 spådommer.

De TimeSeriesDataset instans fungerer nå som en datalaster. La oss skrive ut en batch og sjekke hvordan dataene våre sendes til TFT:

Denne batchen inneholder treningsverdiene [0,1] fra den første tidsserien (group 0) og testverdiene[2,3,4]. Hvis du kjører denne koden på nytt, vil du få andre verdier fordi dataene blandes som standard.

Prosjektet vårt vil bruke Elektrisitetsbelastningsdiagram20112014 [5] datasett fra UCI. Notatboken for dette eksemplet kan lastes ned fra her.:

Dette datasettet inneholder strømforbruket (i KW) til 370 klienter/forbrukere med en 15-minutters frekvens. Dataene strekker seg over 4 år (2011–2014).

Noen forbrukere ble opprettet etter 2011, så deres strømforbruk er i utgangspunktet null.

Vi gjør dataforbehandling iht [3]:

  • Aggreger målvariabelen vår power_usage etter time.
  • Finn den tidligste datoen for hver tidsserie der kraften ikke er null.
  • Lag nye funksjoner: month, day, hour og day_of_week.
  • Velg alle dager mellom 2014–01–01 og 2014–09–07.

La oss begynne:

Last ned data

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

Forbehandling av data

Hver kolonne representerer en forbruker. Mest innledende power_usage verdiene er 0.

Deretter aggregerer vi til timedata. På grunn av modellens størrelse og kompleksitet, trener vi modellen vår kun på 5 forbrukere (for de med verdier som ikke er null).

Nå forbereder vi datasettet vårt for TimeSeriesDataset format. Legg merke til at hver kolonne representerer en annen tidsserie. Derfor 'smelter' vi datarammen vår, slik at alle tidsserier stables vertikalt i stedet for horisontalt. I prosessen lager vi våre nye funksjoner.

Den endelige forhåndsbehandlede datarammen kalles time_df. La oss skrive ut innholdet:

De time_df er nå i riktig format for TimeSeriesDataset. Som du har gjettet nå, siden granulariteten er timebasert, er hours_from_start variabel vil være tidsindeks.

Utforskende dataanalyse

Valget av 5 forbrukere/tidsserier er ikke tilfeldig. De power usage av hver tidsserie har forskjellige egenskaper, for eksempel middelverdien:

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

La oss plotte den første måneden i hver tidsserie:

Figur 2: Den første måneden av alle 5 tidsserier/forbrukere.

Det er ingen merkbar trend, men hver tidsserie har litt forskjellig sesongvariasjon og amplitude. Vi kan eksperimentere videre og sjekke stasjonaritet, signaldekomponeringer og så videre, men i vårt tilfelle fokuserer vi kun på modellbyggingsaspektet.

Legg også merke til at andre tidsserieprognosemetoder som ARIMA må tilfredsstille noen få krav (for eksempel må tidsserien først bli stasjonær.) Med TFT kan vi la dataene våre være som de er.

Lag DataLoaders

I dette trinnet passerer vi vår time_df til TimeSeriesDataSet format som er utrolig nyttig fordi:

  • Det sparer oss for å skrive vår egen Dataloader.
  • Vi kan spesifisere hvordan TFT vil håndtere datasettets funksjoner.
  • Vi kan enkelt normalisere datasettet vårt. I vårt tilfelle er normalisering obligatorisk fordi alle tidssekvenser er forskjellige i størrelse. Derfor bruker vi GroupNormalizer for å normalisere hver tidsserie individuelt.

Vår modell bruker et tilbakeblikkvindu på én uke (7*24) for å forutsi strømforbruket de neste 24 timene.

Legg også merke til at hours_from_start er både tidsindeksen og en tidsvarierende funksjon. De power_usage er vår målvariabel. For demonstrasjonens skyld er vårt valideringssett siste dag:

Grunnlinjemodell

Deretter trinnet som nesten alle glemmer: En grunnmodell. Spesielt i tidsserieprognoser vil du bli overrasket over hvor ofte en naiv prediktor utkonkurrerer selv en mer avansert modell!

Som en naiv grunnlinje spår vi strømforbrukskurven for dagen før:

Trening av Temporal Fusion Transformer-modellen

Vi kan trene vår TFT-modell ved å bruke det kjente Trener grensesnitt fra PyTorch Lightning.

Legg merke til følgende ting:

  • Vi bruker Tidlig stopp tilbakeringing for å overvåke valideringstapet.
  • Vi bruker Tensorbrett for å logge trenings- og valideringsberegningene våre.
  • Vår modell bruker Kvantiltap — en spesiell type tap som hjelper oss å gi ut prediksjonsintervallene. For mer om kvantiletap-funksjonen, sjekk denne artikkelen.
  • Vi bruker 4 oppmerksomhet hoder, som originalpapiret.

Vi er nå klare til å bygge og trene modellen vår:

Det er det! Etter 6 epoker starter EarlyStopping og stopper treningen.

Last inn og lagre den beste modellen

Ikke glem å lagre modellen din. Selv om vi kan sylte den, er det sikreste alternativet å lagre den beste epoken direkte:

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

For å laste modellen igjen, pakk ut model.zip og utfør følgende - bare husk den beste modellbanen:

Sjekk Tensorboard

Ta en nærmere titt på trenings- og valideringskurver med Tensorboard:

Modellevaluering

Få spådommer på valideringssettet og beregn gjennomsnittet P50 (kvantil median) tap:

De siste 2 tidsseriene har litt høyere tap fordi deres relative størrelse også er høy.

Plott spådommer på valideringsdata

Hvis vi passerer mode=raw spå() metode, får vi mer informasjon, inkludert spådommer for alle syv kvantilene. Vi har også tilgang til oppmerksomhetsverdiene (mer om det senere).

Ta en nærmere titt på raw_predictions variabel:

Vi bruker plot_prediction() å lage tomtene våre. Selvfølgelig kan du lage din egen tilpassede tomt - den plot_prediction() har den ekstra fordelen av å legge til oppmerksomhetsverdiene.

OBS: Vår modell forutsier de neste 24 datapunktene på en gang. Dette er ikke et rullende prognosescenario der en modell forutsier en enkelt verdi hver gang og "setter" alle spådommer sammen.

Vi lager en tomt for hver forbruker (5 totalt).

Figur 3: Spådommer om valideringsdata for MT_002
Figur 4: Spådommer om valideringsdata for MT_004
Figur 5: Spådommer om valideringsdata for MT_005
Figur 6: Spådommer om valideringsdata for MT_006
Figur 7: Spådommer om valideringsdata for MT_008

Resultatene er ganske imponerende.

Vår Temporal Fusion Transformator modellen var i stand til å fange oppførselen til alle 5 tidsseriene, både når det gjelder sesongvariasjon og størrelse!

Legg også merke til at:

  • Vi utførte ingen hyperparameterinnstilling.
  • Vi implementerte ingen fancy funksjonsteknikk.

I en påfølgende del viser vi hvordan vi kan forbedre modellen vår med hyperparameteroptimalisering.

Plott spådommer for en bestemt tidsserie

Tidligere plottet vi spådommer på valideringsdataene ved å bruke idx argument, som itererer over alle tidsserier i datasettet vårt. Vi kan være mer spesifikke og gi spådommer på en spesifikk tidsserie:

Figur 7: Dagen fremover spådom for MT_004 på treningssettet

In Figur 7, vi planlegger dagen foran MT_004 forbruker for tidsindeks=26512.

Husk vår tidsindekseringskolonne hours_from_start starter fra 26304 og vi kan få spådommer fra 26388 og utover (fordi vi satte tidligere min_encoder_length=max_encoder_length // 2 som tilsvarer 26304 + 168//2=26388

Prognoser utenfor prøven

La oss lage spådommer utenfor utvalget, utover det endelige datapunktet for valideringsdata – som er 2014–09–07 23:00:00

Alt vi trenger å gjøre er å lage en ny dataramme som inneholder:

  • Antallet N=max_encoder_length tidligere datoer, som fungerer som tilbakeblikk-vinduet - koderdata i TFT-terminologi.
  • De fremtidige datoene for størrelse max_prediction_length som vi ønsker å beregne våre spådommer for - dekoderdata.

Vi kan lage spådommer for alle fem av tidsseriene våre, eller bare én. Figur 7 viser spådommer utenom utvalget for forbruker MT_002:

Figur 7: Dagsutsigelse for MT_002

Nøyaktig prognose er én ting, men forklarbarhet betyr også mye i dag.

Og det er enda verre for Deep Learning-modeller, som regnes som svarte bokser. Metoder som f.eks LIME og SHAP kan gi forklaring (til en viss grad), men fungerer ikke bra for tidsserier. I tillegg er de eksterne post-hoc-metoder og er ikke knyttet til en bestemt modell.

Temporal Fusion Transformator gir tre typer tolkbarhet:

  • Sesongmessig: TFT utnytter sin roman Tolkbar Multi-Head Attention mekanisme for å beregne betydningen av tidligere tidstrinn.
  • Funksjonsmessig: TFT utnytter sin Variabelt utvalgsnettverk modul for å beregne viktigheten av hver funksjon.
  • Ekstreme hendelser robusthet: Vi kan undersøke hvordan tidsserier oppfører seg under sjeldne hendelser

Hvis du ønsker å lære i dybden om den indre funksjonen til Tolkbar Multi-Head Attention og Variabelt utvalg nettverk, sjekk min forrige artikkel.

Sesongmessig tolkbarhet

TFT utforsker oppmerksomhetsvektene for å forstå de tidsmessige mønstrene på tvers av tidligere tidstrinn.

De grå linjene i alle tidligere plott representerer oppmerksomhetsskårene. Se på de tomtene igjen - merker du noe? Figur 8 viser funnene til Figur 7 og står også for oppmerksomhetspoengene:

Figur 8: Dagsutsigelse for MT_001 med sesongvariasjoner vist

Oppmerksomhetspoengene avslører hvor virkningsfulle disse tidstrinnene er når modellen gir ut sin prediksjon. De små toppene gjenspeiler den daglige sesongvariasjonen, mens den høyere toppen mot slutten trolig innebærer den ukentlige sesongvariasjonen.

Hvis vi snitter oppmerksomhetskurvene over alle tidstrinn og tidsserier (ikke bare de 5 vi brukte i denne opplæringen), vil vi få den symmetrisk utseende formen i Figur 9 fra TFT-papiret:

Figur 9: Temporal Patterns for Electricity dataset (kilde)

Spørsmål: Hva hjelper dette? Kan vi ikke ganske enkelt estimere sesongvariasjoner med metoder som ACF-plott, tidssignaldekomponering osv.?

Svar: Ekte. Å studere oppmerksomhetsvektene til TFT har imidlertid ekstra fordeler:

  1. Vi kan bekrefte at modellen vår fanger den tilsynelatende sesongmessige dynamikken i sekvensene våre.
  2. Modellen vår kan også avsløre skjulte mønstre fordi oppmerksomhetsvektene til gjeldende inndatavinduer tar hensyn til alle tidligere inndata.
  3. Plottet med oppmerksomhetsvekter er ikke det samme som et autokorrelasjonsplott: Autokorrelasjonsplottet refererer til en bestemt sekvens, mens oppmerksomhetsvektene her fokuserer på virkningen av hvert tidstrinn ved å se på tvers av alle kovariater og tidsserier.

Funksjonsmessig tolkning

De Variabelt utvalgsnettverk komponent av TFT kan enkelt anslå viktige funksjoner:

Figur 10: Har betydning for valideringsdata

In Figur 10, legger vi merke til følgende:

  • De hour og day_of_week har sterke skårer, både som tidligere observasjoner og fremtidige kovariater. Referansemålet i det originale papiret deler samme konklusjon.
  • De power_usage er åpenbart den mest virkningsfulle observerte kovariaten.
  • De consumer_id er ikke særlig viktig her fordi vi bruker kun 5 forbrukere. I TFT-avisen, der forfatterne bruker alle 370 forbrukerne, er denne variabelen mer signifikant.

OBS: Hvis den statiske grupperingsvariabelen din ikke er viktig, er det svært sannsynlig at datasettet ditt også kan modelleres like godt av en enkelt distribusjonsmodell (som ARIMA).

Deteksjon av ekstreme hendelser

Tidsserier er beryktet for å være mottakelige for plutselige endringer i egenskapene deres under sjeldne hendelser (også referert til som sjokk).

Enda verre, disse hendelsene er veldig unnvikende. Tenk deg om målvariabelen din blir flyktig i en kort periode fordi en kovariat i det stille endrer atferd:

Er dette tilfeldig støy eller et skjult vedvarende mønster som slipper unna modellen vår?

Med TFT kan vi analysere robustheten til hver enkelt funksjon på tvers av verdiområdet. Dessverre viser det nåværende datasettet ikke volatilitet eller sjeldne hendelser - det er mer sannsynlig at de finnes i finans-, salgsdata og så videre. Likevel vil vi vise hvordan du beregner dem:

Noen funksjoner har ikke alle verdiene sine i valideringsdatasettet, så vi viser bare hour og consumer_id:

Figur 11: Prediksjoner vs faktiske (normaliserte gjennomsnitt) på time
Figur 12: Prediksjoner vs faktiske (normaliserte midler) på consumer_id

I begge figurene er resultatene oppmuntrende. I Figur 12, legger vi merke til den forbrukeren MT_004 presterer litt dårligere sammenlignet med andre forbrukere. Vi kan bekrefte dette hvis vi normaliserer P50-tapet for hver forbruker med deres gjennomsnittlige strømforbruk som vi beregnet tidligere.

De grå søylene angir fordelingen av hver variabel. En ting jeg alltid gjør er å finne hvilke verdier som har lav frekvens. Deretter sjekker jeg hvordan modellen presterer i disse områdene. Derfor kan du enkelt oppdage om modellen din fanger oppførselen til sjeldne hendelser.

Generelt kan du bruke denne TFT-funksjonen til å undersøke modellen din for svakheter og fortsette til videre undersøkelse.

Vi kan sømløst bruke Temporal Fusion Transformator med Optuna for å utføre hyperparameterinnstilling:

Problemet er at siden TFT er en transformatorbasert modell, vil du trenge betydelige maskinvareressurser!

Temporal Fusion Transformator er utvilsomt en milepæl for Time-Series-fellesskapet.

Ikke bare oppnår modellen SOTA-resultater, men gir også et rammeverk for tolkbarhet av spådommer. Modellen er også tilgjengelig i Dart python-biblioteket, som er basert på PyTorch Forecasting-biblioteket.

Til slutt, hvis du er nysgjerrig på å lære om arkitekturen til Temporal Fusion Transformator i detalj, sjekk ledsagerartikkel på originalpapiret.

Temporal Fusion Transformer: Time Series Forecasting with Deep Learning — Komplett veiledning publisert på nytt fra kilde https://towardsdatascience.com/temporal-fusion-transformer-time-series-forecasting-with-deep-learning-complete-tutorial-d32c1e51cd91?source= rss—-7f60cf5620c9—4 via https://towardsdatascience.com/feed

<!–

->

Tidstempel:

Mer fra Blockchain-konsulenter