Maak nauwkeurige en interpreteerbare voorspellingen
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, holidays
en 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:
- Creëer een panda-dataframe met onze tijdreeksgegevens.
- Verpak ons dataframe in een TimeSeriesDataset aanleg.
- 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.
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
enday_of_week
. - Selecteer alle dagen ertussen
2014–01–01
en2014–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:
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).
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:
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:
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:
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:
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:
- We kunnen bevestigen dat ons model de schijnbare seizoensdynamiek van onze reeksen vastlegt.
- 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.
- 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:
In Figuur 10merken wij het volgende op:
- De
hour
enday_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
:
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
<!–
->
- Bitcoin
- bizbouwermike
- blockchain
- blockchain-naleving
- blockchain-conferentie
- Blockchain-adviseurs
- coinbase
- vindingrijk
- Overeenstemming
- cryptoconferentie
- crypto mijnbouw
- cryptogeld
- gedecentraliseerde
- Defi
- Digitale activa
- ethereum
- machine learning
- niet-vervangbare token
- Plato
- plato ai
- Plato gegevensintelligentie
- Platoblockchain
- PlatoData
- platogamen
- Veelhoek
- Bewijs van het belang
- W3
- zephyrnet