Temporal Fusion Transformer: Time Series Forecasting with Deep Learning — Komplet selvstudium

Skab nøjagtige og fortolkelige forudsigelser

Oprettet med DALLE [1]

Ifølge [2], Temporal Fusion Transformer udkonkurrerer alle fremtrædende Deep Learning-modeller til tidsserieprognoser.

Herunder en fremhævet Gradient Boosting Tree model for tabelformede tidsseriedata.

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

I denne artikel forklarer vi kort nyhederne vedr Temporal Fusion Transformer og bygge et ende-til-ende-projekt på Energibehovsprognose. Konkret vil vi dække:

  • Sådan forbereder du vores data til TFT-formatet.
  • Hvordan man bygger, træner og evaluerer TFT-modellen.
  • Sådan får du forudsigelser om valideringsdata og forudsigelser uden for stikprøven.
  • Sådan beregnes træk betydninger, sæsonbestemte mønstre, , ekstreme hændelser robusthed ved hjælp af de indbyggede modeller fortolkelig opmærksomhed mekanisme.

Lad os dykke ind!

For en dybdegående analyse af Temporal Fusion Transformer-arkitekturen, tjek min forrige artikel.

Temporalsk Fusion Transender (TFT) er en transformer-baseret model, der udnytter selvopmærksomhed til at fange den komplekse tidsmæssige dynamik i flere tidssekvenser.

TFT understøtter:

  • Flere tidsserier: Vi kan træne en TFT-model på tusindvis af univariate eller multivariate tidsserier.
  • Multi-Horizon Forecasting: Modellen udsender forudsigelser i flere trin af en eller flere målvariable - inklusive forudsigelsesintervaller.
  • Heterogene egenskaber: TFT understøtter mange typer funktioner, herunder tidsvarierende og statiske eksogene variable.
  • Tolkelige forudsigelser: Forudsigelser kan tolkes i forhold til variabel betydning og sæsonbestemt.

Et af disse træk er unikt for Temporal Fusion Transformer. Vi vil dække dette i næste afsnit.

Blandt bemærkelsesværdige DL-tidsseriemodeller (f.eks. DeepAR[4]), skiller TFT sig ud, fordi den understøtter forskellige typer funktioner. Disse er:

  • Tidsvarierende kendt
  • Tidsvarierende ukendt
  • Tidsinvariant ægte
  • Tidsinvariant kategorisk

Forestil dig for eksempel, at vi har en salgsprognosesag:

Lad os sige, at vi skal forudsige salget af 3 produkter. Det num sales er målvariablen. Det CPI index eller number of visitors er tidsvarierende ukendt funktioner, fordi de kun er kendt indtil forudsigelsestid. Imidlertid, holidays, special days er tidsvarierende kendt begivenheder.

product id is en tidsinvariant (statisk) kategori funktion. Andre funktioner som er numeriske og ikke tidsafhængige som f.eks yearly_revenue kan kategoriseres som tids-invariant reel.

Inden vi går videre til vores projekt, vil vi først vise en mini-tutorial om, hvordan du konverterer dine data til udvidet tidsserieformat.

Bemærk: Alle billeder og figurer i denne artikel er skabt af forfatteren.

Til denne tutorial bruger vi TemporalFusionTransformer model fra PyTorch-prognose bibliotek og PyTorch Lightning:

pip installer fakkel pytorch-lightning pytorch_forecasting

Hele processen involverer 3 ting:

  1. Opret en panda-dataramme med vores tidsseriedata.
  2. Pak vores dataramme ind i en TimeSeriesDataset instans.
  3. Bestå vores TimeSeriesDataset instans til TemporalFusionTransformer.

TimeSeriesDataset er meget nyttig, fordi den hjælper os med at specificere, om funktioner er tidsvarierende eller statiske. Plus, det er det eneste format, der TemporalFusionTransformer accepterer.

Lad os oprette et minimalt træningsdatasæt for at vise hvordan TimeSeriesDataset virker:

Vi bør formatere vores data på følgende måde: Hver farvet boks repræsenterer en anden tidsserie, repræsenteret ved dens group værdi.

Figur 1: sample_data pandas datarammen

Den vigtigste kolonne i vores dataramme er time_idx — det bestemmer rækkefølgen af ​​prøver. Hvis der ikke mangler observationer, bør værdierne stige med +1 for hver tidsserie.

Dernæst pakker vi vores dataramme ind i en TimeSeriesDataset eksempel:

Alle argumenter er selvforklarende: Den max_encoder_length definerer tilbagebliksperioden og max_prediction_length angiver, hvor mange datapunkter der forudsiges. I vores tilfælde ser vi tilbage 3 tidstrin i fortiden for at udskrive 2 forudsigelser.

TimeSeriesDataset instans fungerer nu som en dataindlæser. Lad os udskrive en batch og tjekke, hvordan vores data vil blive videregivet til TFT:

Denne batch indeholder træningsværdierne [0,1] fra den første tidsserie (group 0) og testværdierne[2,3,4]. Hvis du kører denne kode igen, får du andre værdier, fordi dataene blandes som standard.

Vores projekt vil bruge Elektricitetsbelastningsdiagrammer20112014 [5] datasæt fra UCI. Notesbogen til dette eksempel kan downloades fra link.:

Dette datasæt indeholder strømforbruget (i KW'er) for 370 klienter/forbrugere med en 15-minutters frekvens. Dataene strækker sig over 4 år (2011–2014).

Nogle forbrugere blev oprettet efter 2011, så deres strømforbrug i første omgang er nul.

Vi laver dataforbehandling iflg [3]:

  • Aggreger vores målvariabel power_usage i timen.
  • Find den tidligste dato for hver tidsserie, hvor strømstyrken ikke er nul.
  • Opret nye funktioner: month, day, hour , day_of_week.
  • Vælg alle dage mellem 2014–01–01 , 2014–09–07.

Lad os begynde:

Download data

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

Dataforarbejdning

Hver kolonne repræsenterer en forbruger. Mest indledende power_usage værdier er 0.

Dernæst aggregerer vi til timedata. På grund af modellens størrelse og kompleksitet træner vi kun vores model på 5 forbrugere (for dem med værdier, der ikke er nul).

Nu forbereder vi vores datasæt til TimeSeriesDataset format. Bemærk, at hver kolonne repræsenterer en anden tidsserie. Derfor 'smelter' vi vores dataramme, så alle tidsserier stables lodret i stedet for vandret. I processen skaber vi vores nye funktioner.

Den endelige forbehandlede dataramme kaldes time_df. Lad os udskrive indholdet:

time_df er nu i det rigtige format til TimeSeriesDataset. Som du har gættet nu, da granulariteten er timetal, er den hours_from_start variabel vil være tidsindeks.

Udforskende dataanalyse

Valget af 5 forbrugere/tidsserier er ikke tilfældigt. Det power usage af hver tidsserie har forskellige egenskaber, såsom middelværdien:

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

Lad os plotte den første måned af hver tidsserie:

Figur 2: Den første måned af alle 5 tidsserier/forbrugere.

Der er ingen mærkbar tendens, men hver tidsserie har lidt forskellig sæsonvariation og amplitude. Vi kan yderligere eksperimentere og kontrollere stationaritet, signalnedbrydninger og så videre, men i vores tilfælde fokuserer vi kun på modelbygningsaspektet.

Bemærk også, at andre tidsserieprognosemetoder f.eks ARIMA skal opfylde nogle få krav (f.eks. skal tidsserierne først blive stationære.) Med TFT kan vi lade vores data være som de er.

Opret DataLoaders

I dette trin passerer vi vores time_df til TimeSeriesDataSet format, som er uhyre nyttigt, fordi:

  • Det sparer os for at skrive vores egen Dataloader.
  • Vi kan specificere, hvordan TFT vil håndtere datasættets funktioner.
  • Vi kan nemt normalisere vores datasæt. I vores tilfælde er normalisering obligatorisk, fordi alle tidssekvenser er forskellige i størrelse. Derfor bruger vi GroupNormalizer at normalisere hver tidsserie individuelt.

Vores model bruger et tilbagebliksvindue på en uge (7*24) til at forudsige strømforbruget for de næste 24 timer.

Bemærk også, at hours_from_start er både tidsindekset og en tidsvarierende funktion. Det power_usage er vores målvariabel. For demonstrationens skyld er vores valideringssæt den sidste dag:

Basismodel

Dernæst det trin, som næsten alle glemmer: En basismodel. Især i tidsserieprognoser vil du blive overrasket over, hvor ofte en naiv prædiktor overgår selv en mere avanceret model!

Som en naiv baseline forudsiger vi strømforbrugskurven for den foregående dag:

Træning af Temporal Fusion Transformer Model

Vi kan træne vores TFT-model ved hjælp af det velkendte Træner interface fra PyTorch Lightning.

Læg mærke til følgende ting:

  • Vi bruger Tidlig stop tilbagekald for at overvåge valideringstabet.
  • Vi anvender Tensorboard for at logge vores trænings- og valideringsmålinger.
  • Vores model bruger Kvantiltab — en særlig type tab, der hjælper os med at udlæse forudsigelsesintervallerne. For mere om Quantile Loss-funktionen, tjek denne artikel.
  • Vi bruger 4 opmærksomhedshoveder, ligesom det originale papir.

Vi er nu klar til at bygge og træne vores model:

Det er det! Efter 6 epoker starter EarlyStopping og stopper træningen.

Indlæs og gem den bedste model

Glem ikke at gemme din model. Selvom vi kan sylte det, er den sikreste mulighed at gemme den bedste epoke direkte:

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

For at indlæse modellen igen skal du udpakke model.zip og udfør følgende - husk bare den bedste modelsti:

Tjek Tensorboard

Se nærmere på trænings- og valideringskurver med Tensorboard:

Modelvurdering

Få forudsigelser om valideringssættet og beregn gennemsnittet P50 (kvantil median) off:

De sidste 2 tidsserier har lidt større tab, fordi deres relative størrelse også er høj.

Plot forudsigelser om valideringsdata

Hvis vi passerer mode=raw på den forudsige() metode, får vi mere information, herunder forudsigelser for alle syv kvantiler. Vi har også adgang til opmærksomhedsværdierne (mere om det senere).

Se nærmere på raw_predictions variabel:

Vi bruger plot_prediction() at skabe vores grunde. Selvfølgelig kan du lave dit eget brugerdefinerede plot - den plot_prediction() har den ekstra fordel at tilføje opmærksomhedsværdierne.

Bemærk: Vores model forudsiger de næste 24 datapunkter på en gang. Dette er ikke et rullende prognosescenario, hvor en model forudsiger en enkelt værdi hver gang og 'sømme' alle forudsigelser sammen.

Vi opretter én grund til hver forbruger (5 i alt).

Figur 3: Forudsigelser om valideringsdata for MT_002
Figur 4: Forudsigelser om valideringsdata for MT_004
Figur 5: Forudsigelser om valideringsdata for MT_005
Figur 6: Forudsigelser om valideringsdata for MT_006
Figur 7: Forudsigelser om valideringsdata for MT_008

Resultaterne er ret imponerende.

Vores Temporal Fusion Transformer modellen var i stand til at fange adfærden for alle 5 tidsserier, både hvad angår sæsonbestemthed og størrelse!

Bemærk også at:

  • Vi udførte ingen hyperparameterjustering.
  • Vi implementerede ikke nogen fancy feature engineering-teknik.

I et efterfølgende afsnit viser vi, hvordan vi forbedrer vores model med hyperparameteroptimering.

Plot forudsigelser for en bestemt tidsserie

Tidligere plottede vi forudsigelser på valideringsdataene ved hjælp af idx argument, som itererer over alle tidsserier i vores datasæt. Vi kan være mere specifikke og udsende forudsigelser på en specifik tidsserie:

Figur 7: Dag frem forudsigelse for MT_004 på træningssættet

In Figur 7, vi planlægger dagen foran MT_004 forbruger for tidsindeks=26512.

Husk vores tidsindekseringskolonne hours_from_start starter fra 26304 og vi kan få forudsigelser fra 26388 og frem (fordi vi har sat tidligere min_encoder_length=max_encoder_length // 2 som er lig 26304 + 168//2=26388

Prognoser uden for stikprøven

Lad os skabe forudsigelser uden for stikprøven, ud over det endelige datapunkt for valideringsdata - dvs 2014–09–07 23:00:00

Alt vi skal gøre er at oprette en ny dataramme, der indeholder:

  • Antallet af N=max_encoder_length tidligere datoer, der fungerer som tilbagebliksvinduet - den encoder data i TFT-terminologi.
  • De fremtidige datoer for størrelse max_prediction_length som vi ønsker at beregne vores forudsigelser for - den dekoder data.

Vi kan lave forudsigelser for alle 5 af vores tidsserier, eller kun én. Figur 7 viser forudsigelserne for forbrugeren uden for stikprøven MT_002:

Figur 7: Dag forud for MT_002

Præcis forecasting er én ting, men forklarlighed betyder også meget i dag.

Og det er endnu værre for Deep Learning-modeller, som betragtes som sorte bokse. Metoder som f.eks CITRON , SHAP kan give forklarlighed (til en vis grad), men fungerer ikke godt for tidsserier. Plus, de er eksterne post-hoc metoder og er ikke bundet til en bestemt model.

Temporal Fusion Transformer giver tre typer fortolkning:

  • Sæsonbestemt: TFT udnytter sin roman Tolkbar Multi-Head Attention mekanisme til at beregne betydningen af ​​tidligere tidstrin.
  • Funktionsmæssigt: TFT udnytter sin Variable Selection Network modul til at beregne vigtigheden af ​​hver funktion.
  • Ekstreme hændelser robusthed: Vi kan undersøge, hvordan tidsserier opfører sig under sjældne hændelser

Hvis du ønsker at lære indgående om den indre funktion af Tolkbar Multi-Head Attention , Variable Selection Network, tjek min tidligere artikel.

Sæsonbestemt fortolkning

TFT udforsker opmærksomhedsvægtene for at forstå de tidsmæssige mønstre på tværs af tidligere tidstrin.

De grå linjer i alle tidligere plots repræsenterer opmærksomhedsscorerne. Se på de plots igen - bemærker du noget? Figur 8 viser resultaterne af Figur 7 og tager også højde for opmærksomhedsscorerne:

Figur 8: Dag forud for MT_001 med sæsonbestemt vist

Opmærksomhedsscorerne afslører, hvor virkningsfulde de tidstrin er, når modellen udsender sin forudsigelse. De små toppe afspejler den daglige sæsonudsving, mens den højere top mod slutningen sandsynligvis indebærer den ugentlige sæsonudsving.

Hvis vi tager et gennemsnit af opmærksomhedskurverne på tværs af alle tidstrin og tidsserier (ikke kun de 5, vi brugte i denne tutorial), får vi den symmetrisk udseende form i Figur 9 fra TFT-papiret:

Figur 9: Temporale mønstre for elektricitetsdatasæt (Kilde)

Spørgsmål: Hvad nytter dette? Kan vi ikke blot estimere sæsonbestemte mønstre med metoder som ACF-plot, tidssignalnedbrydning osv.?

Svar: Rigtigt. At studere opmærksomhedsvægtene for TFT har dog ekstra fordele:

  1. Vi kan bekræfte, at vores model fanger den tilsyneladende sæsonbestemte dynamik i vores sekvenser.
  2. Vores model kan også afsløre skjulte mønstre, fordi opmærksomhedsvægtene for de nuværende inputvinduer tager højde for alle tidligere input.
  3. Plottet med opmærksomhedsvægte er ikke det samme som et autokorrelationsplot: Autokorrelationsplottet refererer til en bestemt sekvens, mens opmærksomhedsvægtene her fokuserer på virkningen af ​​hvert tidstrin ved at se på tværs af alle kovariater og tidsserier.

Funktionsmæssig fortolkning

Variable Selection Network komponent af TFT nemt kan estimere funktioners betydning:

Figur 10: Har betydning for valideringsdata

In Figur 10, bemærker vi følgende:

  • hour , day_of_week har stærke score, både som tidligere observationer og fremtidige kovariater. Benchmark i det originale papir deler samme konklusion.
  • power_usage er åbenbart den mest virkningsfulde observerede kovariat.
  • consumer_id er ikke særlig væsentlig her, fordi vi kun bruger 5 forbrugere. I TFT-avisen, hvor forfatterne bruger alle 370 forbrugere, er denne variabel mere signifikant.

Bemærk: Hvis din statiske grupperingsvariabel ikke er vigtig, er det meget sandsynligt, at dit datasæt også kan modelleres lige så godt af en enkelt distributionsmodel (som ARIMA).

Detektion af ekstrem hændelse

Tidsserier er berygtede for at være modtagelige for pludselige ændringer i deres egenskaber under sjældne hændelser (også omtalt som stød).

Endnu værre, disse begivenheder er meget undvigende. Forestil dig, hvis din målvariabel bliver flygtig i en kort periode, fordi en kovariat lydløst ændrer adfærd:

Er dette en tilfældig støj eller et skjult vedvarende mønster, der undslipper vores model?

Med TFT kan vi analysere robustheden af ​​hver enkelt funktion på tværs af deres værdiområde. Desværre udviser det nuværende datasæt ikke volatilitet eller sjældne hændelser - det er mere sandsynligt, at de findes i finansielle data, salgsdata og så videre. Alligevel vil vi vise, hvordan man beregner dem:

Nogle funktioner har ikke alle deres værdier til stede i valideringsdatasættet, så vi viser kun hour , consumer_id:

Figur 11: Forudsigelser vs faktiske værdier (normaliserede gennemsnit) på time
Figur 12: Forudsigelser vs faktiske værdier (normaliserede midler) på forbruger_id

I begge figurer er resultaterne opmuntrende. I Figur 12, bemærker vi den forbruger MT_004 en smule underpræsterende i forhold til andre forbrugere. Vi kunne verificere dette, hvis vi normaliserer P50-tabet for hver forbruger med deres gennemsnitlige strømforbrug, som vi tidligere beregnede.

De grå søjler angiver fordelingen af ​​hver variabel. En ting jeg altid gør er at finde ud af hvilke værdier der har en lav frekvens. Derefter tjekker jeg, hvordan modellen klarer sig i disse områder. Derfor kan du nemt opdage, om din model fanger opførsel af sjældne begivenheder.

Generelt kan du bruge denne TFT-funktion til at undersøge din model for svagheder og fortsætte til yderligere undersøgelse.

Vi kan problemfrit bruge Temporal Fusion Transformer med Optuna for at udføre hyperparameterjustering:

Problemet er, at da TFT er en transformer-baseret model, har du brug for betydelige hardwareressourcer!

Temporal Fusion Transformer er uden tvivl en milepæl for Time-Series-fællesskabet.

Modellen opnår ikke kun SOTA-resultater, men giver også en ramme for fortolkning af forudsigelser. Modellen fås også i dart python-bibliotek, som er baseret på PyTorch Forecasting-biblioteket.

Endelig, hvis du er nysgerrig efter at lære om arkitekturen i Temporal Fusion Transformer i detaljer, tjek ledsagerartikel på det originale papir.

Temporal Fusion Transformer: Time Series Forecasting with Deep Learning — Komplet vejledning genudgivet 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

<!–

->

Tidsstempel:

Mere fra Blockchain-konsulenter