Temporal Fusion Transformer: tijdreeksvoorspellingen met deep learning - volledige zelfstudie

Maak nauwkeurige en interpreteerbare voorspellingen

Gemaakt met DALLE [1]

Volgens [2], Tijdelijke fusietransformator presteert beter dan alle prominente Deep Learning-modellen voor tijdreeksvoorspellingen.

Inclusief een uitgelichte Verloopverhogende boom model voor tijdreeksgegevens in tabelvorm.

Maar wat is dat wel Tijdelijke fusietransformator (TFT)[3] en waarom is het zo interessant?

In dit artikel leggen we kort de nieuwigheden uit van Tijdelijke fusietransformator en bouw er een end-to-end project op Voorspelling van de energievraag. Concreet behandelen we:

  • Hoe onze gegevens voor te bereiden op het TFT-formaat.
  • Hoe u het TFT-model kunt bouwen, trainen en evalueren.
  • Hoe u voorspellingen kunt krijgen over validatiegegevens en voorspellingen die buiten de steekproef vallen.
  • Hoe te berekenen functiebelangen, seizoensgebonden patronen, en robuustheid van extreme gebeurtenissen met behulp van de ingebouwde modellen interpreteerbare aandacht mechanisme.

Laten we erin duiken!

Voor een diepgaande analyse van de Temporal Fusion Transformer-architectuur, bekijk mijn vorige dit artikel.

Tkeizerlijk Fgebruiken Tovervaller (TFT) is een op Transformer gebaseerd model dat gebruik maakt van zelfaandacht om de complexe temporele dynamiek van meerdere tijdreeksen vast te leggen.

TFT ondersteunt:

  • Meerdere tijdreeksen: We kunnen een TFT-model trainen op duizenden univariate of multivariate tijdreeksen.
  • Voorspellingen over meerdere horizonten: Het model voert voorspellingen in meerdere stappen uit van een of meer doelvariabelen, inclusief voorspellingsintervallen.
  • Heterogene kenmerken: TFT ondersteunt vele soorten functies, waaronder tijdsvariante en statische exogene variabelen.
  • Interpreteerbare voorspellingen: Voorspellingen kunnen worden geïnterpreteerd in termen van variabel belang en seizoensinvloeden.

Eén van die eigenschappen is uniek voor Tijdelijke fusietransformator. We zullen dit in de volgende sectie bespreken.

Onder de opmerkelijke DL-tijdreeksmodellen (bijv. DiepAR[4]), TFT valt op omdat het verschillende soorten functies ondersteunt. Dit zijn:

  • Tijdvariabel bekend
  • Tijdvariabel onbekend
  • Tijd-invariant vast
  • Tijd-invariant categorisch

Stel je voor dat we bijvoorbeeld een geval van verkoopvoorspelling:

Laten we zeggen dat we de verkoop van 3 producten moeten voorspellen. De num sales is de doelvariabele. De CPI index of de number of visitors zijn tijdsvariërend onbekend kenmerken omdat ze alleen bekend zijn tot aan het voorspellingstijdstip. Echter, holidaysen special days zijn tijdsvariërend bekend evenementen.

De product id is een tijdsinvariant (statisch) categorisch functie. Andere kenmerken die numeriek en niet tijdsafhankelijk zijn, zoals yearly_revenue kan worden gecategoriseerd als: tijdsinvariant reëel.

Voordat we naar ons project gaan, laten we eerst een mini-tutorial zien over hoe u uw gegevens naar het uitgebreid tijdreeksformaat.

Opmerking: Alle afbeeldingen en figuren in dit artikel zijn gemaakt door de auteur.

Voor deze zelfstudie gebruiken we de TemporalFusionTransformer model uit de PyTorch-voorspellingen bibliotheek en PyTorch Lightning:

pip installeer fakkel pytorch-lightning pytorch_forecasting

Het hele proces omvat 3 dingen:

  1. Creëer een panda-dataframe met onze tijdreeksgegevens.
  2. Verpak ons ​​dataframe in een TimeSeriesDataset aanleg.
  3. Passeer onze TimeSeriesDataset bijvoorbeeld naar TemporalFusionTransformer.

De TimeSeriesDataset is erg handig omdat het ons helpt te specificeren of functies in de tijd variëren of statisch zijn. Bovendien is het het enige formaat dat TemporalFusionTransformer accepteert.

Laten we een minimale trainingsdataset maken om te laten zien hoe TimeSeriesDataset werken:

We moeten onze gegevens op de volgende manier formatteren: elk gekleurd vakje vertegenwoordigt een andere tijdreeks, weergegeven door zijn group waarde.

Figuur 1: Het sample_data pandas-gegevensframe

De belangrijkste kolom van ons dataframe is de time_idx — het bepaalt de volgorde van de monsters. Als er geen ontbrekende waarnemingen zijn, moeten de waarden toenemen +1 voor elke tijdreeks.

Vervolgens verpakken we ons dataframe in a TimeSeriesDataset voorbeeld:

Alle argumenten spreken voor zich: The max_encoder_length definieert de terugblikperiode en max_prediction_length specificeert hoeveel datapunten er zullen worden voorspeld. In ons geval kijken we drie tijdstappen terug in het verleden om twee voorspellingen te doen.

De TimeSeriesDataset instance dient nu als dataloader. Laten we een batch afdrukken en controleren hoe onze gegevens naar TFT worden doorgegeven:

Deze batch bevat de trainingswaarden [0,1] uit de eerste tijdreeks (group 0) en de testwaarden[2,3,4]. Als u deze code opnieuw uitvoert, krijgt u andere waarden omdat de gegevens standaard in willekeurige volgorde worden weergegeven.

Ons project zal gebruik maken van de ElektriciteitBelastingdiagrammen20112014 [5] dataset van UCI. Het notitieboekje voor dit voorbeeld kan worden gedownload van hier:

Deze dataset bevat het stroomverbruik (in kW) van 370 klanten/consumenten met een frequentie van 15 minuten. De gegevens bestrijken vier jaar (4–2011).

Sommige consumenten zijn na 2011 ontstaan, dus hun energieverbruik is aanvankelijk nul.

Wij doen gegevensvoorbewerking volgens [3]:

  • Voeg onze doelvariabele samen power_usage per uur.
  • Zoek de vroegste datum voor elke tijdreeks waarin de macht niet nul is.
  • Creëer nieuwe functies: month, day, hour en day_of_week.
  • Selecteer alle dagen ertussen 2014–01–01 en 2014–09–07.

Laten we beginnen:

Download Data

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

Data Preprocessing

Elke kolom vertegenwoordigt een consument. Meest initiële power_usage waarden zijn 0.

Vervolgens aggregeren we de gegevens per uur. Vanwege de omvang en complexiteit van het model trainen we ons model slechts op vijf consumenten (voor degenen met waarden die niet nul zijn).

Nu bereiden we onze dataset voor op de TimeSeriesDataset formaat. Merk op dat elke kolom een ​​andere tijdreeks vertegenwoordigt. Daarom ‘smelten’ we ons dataframe, zodat alle tijdreeksen verticaal worden gestapeld in plaats van horizontaal. Tijdens dit proces creëren we onze nieuwe functies.

Het laatste voorverwerkte dataframe wordt aangeroepen time_df. Laten we de inhoud afdrukken:

De time_df heeft nu het juiste formaat voor de TimeSeriesDataset. Zoals je inmiddels al geraden hebt, is de granulariteit per uur hours_from_start variabele zal zijn tijdindex.

Verkennende gegevensanalyse

De keuze uit 5 consumenten/tijdreeksen is niet willekeurig. De power usage van elke tijdreeks heeft verschillende eigenschappen, zoals de gemiddelde waarde:

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

Laten we de eerste maand van elke tijdreeks uitzetten:

Figuur 2: De eerste maand van alle 5 tijdreeksen/consumenten.

Er is geen merkbare trend, maar elke tijdreeks heeft een iets andere seizoensinvloeden en amplitude. We kunnen verder experimenteren en de stationariteit controleren, decomposities signaleren, enzovoort, maar in ons geval concentreren we ons alleen op het modelbouwaspect.

Merk ook op dat andere methoden voor het voorspellen van tijdreeksen zoals ARIMA moet aan een aantal eisen voldoen (de tijdreeksen moeten bijvoorbeeld eerst stationair worden). Met TFT kunnen we onze gegevens ongewijzigd laten.

Maak DataLoaders

In deze stap passeren we onze time_df aan de TimeSeriesDataSet formaat dat enorm nuttig is omdat:

  • Het bespaart ons het schrijven van onze eigen Dataloader.
  • We kunnen specificeren hoe TFT met de functies van de dataset omgaat.
  • We kunnen onze dataset gemakkelijk normaliseren. In ons geval is normalisatie verplicht omdat alle tijdreeksen in grootte verschillen. Zo gebruiken wij de GroepNormalizer om elke tijdreeks afzonderlijk te normaliseren.

Ons model gebruikt een overzichtsperiode van één week (7*24) om het energieverbruik van de komende 24 uur te voorspellen.

Merk ook op dat de hours_from_start is zowel de tijdindex als een tijdsvariërend kenmerk. De power_usage is onze doelvariabele. Ter demonstratie is onze validatieset de laatste dag:

Basismodel

Vervolgens de stap die bijna iedereen vergeet: een basismodel. Vooral bij het voorspellen van tijdreeksen zult u verbaasd zijn hoe vaak een naïeve voorspeller beter presteert dan zelfs een luxer model!

Als naïeve basislijn voorspellen we de stroomverbruikscurve van de vorige dag:

Trainen van het Temporal Fusion Transformer-model

We kunnen ons TFT-model trainen met behulp van het bekende Trainer interface van PyTorch Lightning.

Let op de volgende dingen:

  • We maken gebruik van de Vroeg Stoppen callback om het validatieverlies te controleren.
  • Wij gebruiken Tensorbord om onze trainings- en validatiestatistieken te loggen.
  • Ons model gebruikt Kwantiel verlies – een speciaal soort verlies dat ons helpt de voorspellingsintervallen uit te voeren. Voor meer informatie over de functie Kwantielverlies, bekijk dit artikel.
  • Wij gebruiken er 4 aandacht hoofden, zoals het originele papier.

We zijn nu klaar om ons model te bouwen en te trainen:

Dat is het! Na 6 tijdperken treedt EarlyStopping in werking en stopt de training.

Laad en bewaar het beste model

Vergeet niet uw model op te slaan. Hoewel we het kunnen inpakken, is de veiligste optie om het beste tijdperk rechtstreeks op te slaan:

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

Om het model opnieuw te laden, pakt u het uit model.zip en voer het volgende uit - onthoud gewoon het beste modelpad:

Controleer Tensorbord

Bekijk de trainings- en validatiecurves met Tensorboard eens nader:

Modelevaluatie

Ontvang voorspellingen over de validatieset en bereken het gemiddelde P50 (kwantielmediaan) uit:

De laatste twee tijdreeksen hebben een iets groter verlies omdat hun relatieve omvang ook hoog is.

Voorspellingen uitzetten op validatiegegevens

Als we voorbij de mode=raw op de voorspellen() methode krijgen we meer informatie, inclusief voorspellingen voor alle zeven kwantielen. Ook hebben wij toegang tot de attentiewaarden (daarover later meer).

Bekijk de raw_predictions variabele:

We maken gebruik van de plot_voorspelling() om onze percelen te creëren. Natuurlijk kunt u uw eigen aangepaste plot maken: de plot_voorspelling() heeft het extra voordeel dat het de attentiewaarden toevoegt.

Opmerking: Ons model voorspelt de volgende 24 datapunten in een keer. Dit is geen voortschrijdend voorspellingsscenario waarbij een model een scenario voorspelt single waardeer elke keer en ‘hecht’ alle voorspellingen aan elkaar.

Voor elke consument creëren we één perceel (5 in totaal).

Figuur 3: Voorspellingen op basis van validatiegegevens voor MT_002
Figuur 4: Voorspellingen op basis van validatiegegevens voor MT_004
Figuur 5: Voorspellingen op basis van validatiegegevens voor MT_005
Figuur 6: Voorspellingen op basis van validatiegegevens voor MT_006
Figuur 7: Voorspellingen op basis van validatiegegevens voor MT_008

De resultaten zijn behoorlijk indrukwekkend.

Onze Tijdelijke fusietransformator Het model was in staat om het gedrag van alle vijf de tijdreeksen vast te leggen, zowel qua seizoensinvloeden als qua omvang!

Merk ook op dat:

  • We hebben geen hyperparameterafstemming uitgevoerd.
  • We hebben geen enkele fancy feature-engineeringtechniek geïmplementeerd.

In een volgende sectie laten we zien hoe we ons model kunnen verbeteren met hyperparameteroptimalisatie.

Plotvoorspellingen voor een specifieke tijdreeks

Voorheen plotten we voorspellingen op basis van de validatiegegevens met behulp van de idx argument, dat zich herhaalt over alle tijdreeksen in onze dataset. We kunnen specifieker zijn en voorspellingen doen over een specifieke tijdreeks:

Figuur 7: Voorspelling voor de dag vooruit MT_004 op de trainingsset

In Figuur 7, we plannen de dag van tevoren MT_004 consument voor tijdindex=26512.

Denk aan onze tijdindexkolom hours_from_start begint vanaf 26304 en we kunnen voorspellingen krijgen vanaf 26388 (omdat we eerder hebben ingesteld min_encoder_length=max_encoder_length // 2 wat gelijk is aan 26304 + 168//2=26388

Prognoses buiten de steekproef

Laten we voorspellingen maken die buiten de steekproef vallen, voorbij het laatste datapunt van validatiegegevens – namelijk 2014–09–07 23:00:00

Het enige wat we hoeven te doen is een nieuw dataframe maken dat het volgende bevat:

  • Het aantal N=max_encoder_length datums uit het verleden, die fungeren als terugblikvenster: de encodergegevens in TFT-terminologie.
  • De toekomstige data van grootte max_prediction_length waarvoor we onze voorspellingen willen berekenen – de decodergegevens.

We kunnen voorspellingen maken voor alle vijf onze tijdreeksen, of slechts voor één. Figuur 7 toont de out-of-sample voorspellingen voor de consument MT_002:

Figuur 7: Voorspelling voor de komende dag voor MT_002

Nauwkeurige prognoses zijn één ding, maar de uitlegbaarheid is tegenwoordig ook van groot belang.

En het is nog erger voor Deep Learning-modellen, die als zwarte dozen worden beschouwd. Methoden zoals LIMOEN en VORM kunnen (tot op zekere hoogte) verklaarbaarheid bieden, maar werken niet goed voor tijdreeksen. Bovendien zijn het externe post-hocmethoden en niet gebonden aan een bepaald model.

Tijdelijke fusietransformator biedt drie soorten interpreteerbaarheid:

  • Seizoensgebonden: TFT maakt gebruik van zijn roman Interpreteerbare multi-head-aandacht mechanisme om het belang van tijdstappen uit het verleden te berekenen.
  • Functiegewijs: TFT maakt gebruik van zijn Variabel selectienetwerk module om het belang van elk kenmerk te berekenen.
  • Robuustheid van extreme gebeurtenissen: We kunnen onderzoeken hoe tijdreeksen zich gedragen tijdens zeldzame gebeurtenissen

Als je diepgaand wilt leren over de innerlijke werking van Interpreteerbare multi-head-aandacht en Variabel selectienetwerk, check mijn vorige artikel.

Seizoensgebonden interpreteerbaarheid

TFT onderzoekt de aandachtsgewichten om de temporele patronen in eerdere tijdstappen te begrijpen.

De grijze lijnen in alle voorgaande grafieken vertegenwoordigen de aandachtsscores. Kijk nog eens naar die plots – merk je iets? Figuur 8 toont de bevindingen van Figuur 7 en houdt ook rekening met de aandachtsscores:

Figuur 8: Voorspelling voor een dag vooruit voor MT_001 met weergegeven seizoenseffecten

De aandachtsscores laten zien hoe impactvol de tijdstappen zijn waarin het model zijn voorspelling uitvoert. De kleine pieken weerspiegelen de dagelijkse seizoensinvloeden, terwijl de hogere piek tegen het einde waarschijnlijk de wekelijkse seizoensinvloeden impliceert.

Als we het gemiddelde nemen van de aandachtscurven over alle tijdstappen en tijdreeksen (niet alleen de vijf die we in deze tutorial hebben gebruikt), krijgen we de symmetrisch ogende vorm in Figuur 9 van het TFT-papier:

Figuur 9: Tijdelijke patronen voor elektriciteitsgegevensset (bron)

Vraag: Wat heb je hieraan? Kunnen we niet eenvoudig seizoenspatronen schatten met methoden zoals ACF-grafieken, tijdsignaalontleding enz.?

Antwoord: WAAR. Het bestuderen van de aandachtsgewichten van TFT heeft echter extra voordelen:

  1. We kunnen bevestigen dat ons model de schijnbare seizoensdynamiek van onze reeksen vastlegt.
  2. Ons model kan ook verborgen patronen aan het licht brengen, omdat de aandachtsgewichten van de huidige invoervensters rekening houden met alle invoer uit het verleden.
  3. De aandachtsgewichtengrafiek is niet hetzelfde als een autocorrelatiegrafiek: de autocorrelatiegrafiek verwijst naar een bepaalde reeks, terwijl de aandachtsgewichten zich hier richten op de impact van elke tijdstap door naar alle covariaten en tijdreeksen te kijken.

Feature-gewijs interpreteerbaarheid

De Variabel selectienetwerk onderdeel van TFT kan gemakkelijk de waarde schatten functiebelangen:

Figuur 10: Kenmerkt belang bij validatiegegevens

In Figuur 10merken wij het volgende op:

  • De hour en day_of_week hebben sterke scores, zowel als observaties uit het verleden als toekomstige covariaten. De benchmark in het originele artikel deelt dezelfde conclusie.
  • De power_usage is uiteraard de meest impactvolle waargenomen covariabele.
  • De consumer_id is hier niet erg belangrijk omdat we slechts 5 consumenten gebruiken. In het TFT-artikel, waar de auteurs alle 370 consumenten gebruiken, is deze variabele belangrijker.

Opmerking: Als uw statische groeperingsvariabele niet belangrijk is, is het zeer waarschijnlijk dat uw dataset ook even goed kan worden gemodelleerd door een enkel distributiemodel (zoals ARIMA).

Detectie van extreme gebeurtenissen

Tijdreeksen zijn berucht omdat ze gevoelig zijn voor plotselinge veranderingen in hun eigenschappen tijdens zeldzame gebeurtenissen (ook wel schokken).

Erger nog, deze gebeurtenissen zijn zeer ongrijpbaar. Stel je voor dat je doelvariabele voor een korte periode volatiel wordt omdat een covariabele stilletjes het gedrag verandert:

Is dit een willekeurige ruis of een verborgen, hardnekkig patroon dat aan ons model ontsnapt?

Met TFT kunnen we de robuustheid van elk afzonderlijk kenmerk over het hele bereik van waarden analyseren. Helaas vertoont de huidige dataset geen volatiliteit of zeldzame gebeurtenissen; die zijn waarschijnlijker terug te vinden in financiële gegevens, verkoopgegevens enzovoort. Toch zullen we laten zien hoe je ze kunt berekenen:

Voor sommige features zijn niet al hun waarden aanwezig in de validatiedataset, dus laten we alleen de hour en consumer_id:

Figuur 11: Voorspellingen versus werkelijke cijfers (genormaliseerde gemiddelden) op uur
Figuur 12: Voorspellingen versus werkelijke waarden (genormaliseerde gemiddelden) op consumer_id

In beide figuren zijn de resultaten bemoedigend. In Figuur 12, merken we die consument MT_004 presteert iets minder goed dan andere consumenten. We zouden dit kunnen verifiëren als we het P50-verlies van elke consument normaliseren met hun gemiddelde energieverbruik dat we eerder hebben berekend.

De grijze balken geven de verdeling van elke variabele aan. Eén ding dat ik altijd doe, is uitzoeken welke waarden een lage frequentie hebben. Vervolgens controleer ik hoe het model op die gebieden presteert. Daarom kunt u eenvoudig detecteren of uw model het gedrag van zeldzame gebeurtenissen vastlegt.

Over het algemeen kunt u deze TFT-functie gebruiken om uw model op zwakke punten te onderzoeken en verder onderzoek te doen.

We kunnen naadloos gebruiken Tijdelijke fusietransformator Met Optimaal om hyperparameterafstemming uit te voeren:

Het probleem is dat, aangezien TFT een Transformer-gebaseerd model is, je aanzienlijke hardwarebronnen nodig hebt!

Tijdelijke fusietransformator is ongetwijfeld een mijlpaal voor de Time-Series-gemeenschap.

Het model levert niet alleen SOTA-resultaten op, maar biedt ook een raamwerk voor de interpreteerbaarheid van voorspellingen. Het model is ook verkrijgbaar in de Darts Python-bibliotheek, die is gebaseerd op de PyTorch Forecasting-bibliotheek.

Tenslotte, als je nieuwsgierig bent naar de architectuur van de Tijdelijke fusietransformator in detail, controleer de begeleidend artikel op het originele papier.

Temporal Fusion Transformer: Time Series Forecasting met Deep Learning — Volledige zelfstudie opnieuw gepubliceerd vanuit de bron https://towardsdatascience.com/temporal-fusion-transformer-time-series-forecasting-with-deep-learning-complete-tutorial-d32c1e51cd91?source= rss—-7f60cf5620c9—4 via https://towardsdatascience.com/feed

<!–

->

Tijdstempel:

Meer van Blockchain-adviseurs