Lag nøyaktige og tolkbare spådommer
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, holidays
og 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:
- Lag en panda-dataramme med tidsseriedataene våre.
- Pakk inn datarammen vår i en TimeSeriesDataset forekomst.
- 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.
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
ogday_of_week
. - Velg alle dager mellom
2014–01–01
og2014–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:
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
på 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).
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:
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:
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:
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:
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:
- Vi kan bekrefte at modellen vår fanger den tilsynelatende sesongmessige dynamikken i sekvensene våre.
- Modellen vår kan også avsløre skjulte mønstre fordi oppmerksomhetsvektene til gjeldende inndatavinduer tar hensyn til alle tidligere inndata.
- 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:
In Figur 10, legger vi merke til følgende:
- De
hour
ogday_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
:
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
<!–
->
- Bitcoin
- bizbuildermike
- blockchain
- blockchain-overholdelse
- blockchain konferanse
- Blockchain-konsulenter
- coinbase
- coingenius
- Konsensus
- kryptokonferanse
- krypto gruvedrift
- cryptocurrency
- desentralisert
- Defi
- Digitale eiendeler
- ethereum
- maskinlæring
- ikke soppbart token
- plato
- plato ai
- Platon Data Intelligence
- Platoblokkjede
- PlatonData
- platogaming
- polygon
- bevis på innsatsen
- W3
- zephyrnet