Temporal Fusion Transformer: Aikasarjan ennustaminen syvän oppimisen avulla – täydellinen opetusohjelma

Luo tarkkoja ja tulkittavia ennusteita

Luotu DALLE:n kanssa [1]

[2] mukaan, Temporal Fusion Transformer ylittää kaikki näkyvät Deep Learning -mallit aikasarjaennusteissa.

Mukaan lukien esitelty Gradienttia tehostava puu malli taulukkomuotoiselle aikasarjadatalle.

Mutta mikä on Temporal Fusion Transformer (TFT)[3] ja miksi se on niin mielenkiintoista?

Tässä artikkelissa selitämme lyhyesti uutuudet Temporal Fusion Transformer ja rakentaa päästä päähän -projektin päälle Energian kysynnän ennuste. Tarkastellaan erityisesti:

  • Kuinka valmistelemme tietomme TFT-muotoa varten.
  • Kuinka rakentaa, kouluttaa ja arvioida TFT-mallia.
  • Kuinka saada ennusteita validointitiedoista ja otoksen ulkopuolisista ennusteista.
  • Kuinka laskea ominaisuuksien tärkeys, kausiluonteiset mallit, ja ääritapahtumien kestävyys käyttämällä sisäänrakennettua mallia tulkittava huomio mekanismi.

Let's sukeltaa sisään!

Jos haluat syvällisen analyysin Temporal Fusion Transformer -arkkitehtuurista, katso edellinen artikkeli.

Tkeisarillinen Fusion Transformer (TFT) on muuntaja-pohjainen malli, joka hyödyntää itsetarkkailua useiden aikajaksojen monimutkaisen ajallisen dynamiikan vangitsemiseksi.

TFT tukee:

  • Useita aikasarjoja: Voimme kouluttaa TFT-mallin tuhansille yksi- tai monimuuttujaisille aikasarjoille.
  • Monihorisonttiennuste: Malli tuottaa monivaiheisia ennusteita yhdestä tai useammasta kohdemuuttujasta - mukaan lukien ennustevälit.
  • Heterogeeniset ominaisuudet: TFT tukee monenlaisia ​​ominaisuuksia, mukaan lukien aikavaihtelut ja staattiset eksogeeniset muuttujat.
  • Tulkittavia ennusteita: Ennusteet voidaan tulkita vaihtelevan tärkeyden ja kausiluonteisuuden perusteella.

Yksi näistä ominaisuuksista on ainutlaatuinen Temporal Fusion Transformer. Käsittelemme tätä seuraavassa osiossa.

Merkittävistä DL-aikasarjamalleista (esim. DeepAR[4]), TFT erottuu joukosta, koska se tukee erityyppisiä ominaisuuksia. Nämä ovat:

  • Ajallisesti vaihteleva tunnettu
  • Ajallisesti vaihteleva tuntematon
  • Aika-invariantti todellinen
  • Aika-invariantti kategorinen

Kuvittele esimerkiksi, että meillä on a myynnin ennustetapaus:

Oletetaan, että meidän täytyy ennustaa 3 tuotteen myynti. The num sales on kohdemuuttuja. The CPI index tai number of visitors olemme ajallisesti vaihteleva tuntematon ominaisuuksia, koska ne tunnetaan vain ennusteaikaan asti. Kuitenkin, holidaysja special days olemme ajallisesti vaihteleva tiedossa Tapahtumat.

- product id is aikainvariantti (staattinen) kategorinen ominaisuus. Muut ominaisuudet, jotka ovat numeerisia eivätkä ajasta riippuvia, kuten yearly_revenue voidaan luokitella aika-invariantti todellinen.

Ennen kuin siirrymme projektiimme, näytämme ensin mini-opetusohjelman, jossa kerrotaan, kuinka voit muuntaa tietosi laajennettu aikasarjamuoto.

Huomautus: Kaikki tämän artikkelin kuvat ja hahmot ovat kirjoittajan luomia.

Tässä opetusohjelmassa käytämme TemporalFusionTransformer malli PyTorchin ennuste kirjasto ja PyTorch Lightning:

pip install torch pytorch-lightning pytorch_forecasting

Koko prosessi sisältää 3 asiaa:

  1. Luo panda-tietokehys aikasarjatiedoistamme.
  2. Kääri tietokehyksemme a TimeSeriesDataset ilmentymä.
  3. Ohita meidän TimeSeriesDataset esimerkiksi TemporalFusionTransformer.

- TimeSeriesDataset on erittäin hyödyllinen, koska sen avulla voimme määrittää, ovatko ominaisuudet ajallisesti vaihtelevia vai staattisia. Lisäksi se on ainoa muoto TemporalFusionTransformer hyväksyy.

Luodaan pieni harjoitustietojoukko näyttääksesi kuinka TimeSeriesDataset toimii:

Meidän tulee muotoilla tietomme seuraavalla tavalla: Jokainen värillinen laatikko edustaa eri aikasarjaa, jota sen edustaa group arvoa.

Kuvio 1: sample_data pandas -tietokehys

Tietokehyksemme tärkein sarake on time_idx — se määrittää näytteiden järjestyksen. Jos puuttuvia havaintoja ei ole, arvojen tulee kasvaa +1 jokaiselle aikasarjalle.

Seuraavaksi käärimme tietokehyksemme a TimeSeriesDataset ilmentymä:

Kaikki argumentit ovat itsestään selviä: The max_encoder_length määrittää tarkastelujakson ja max_prediction_length määrittää, kuinka monta datapistettä ennustetaan. Meidän tapauksessamme katsomme 3 aikaaskelta taaksepäin, jotta voimme tulostaa 2 ennustetta.

- TimeSeriesDataset instanssi toimii nyt tiedonlataajana. Tulostetaan erä ja tarkistetaan kuinka tietomme välitetään TFT:lle:

Tämä erä sisältää harjoitusarvot [0,1] ensimmäisestä aikasarjasta (group 0) ja testausarvot[2,3,4]. Jos suoritat tämän koodin uudelleen, saat eri arvoja, koska tiedot sekoitetaan oletuksena.

Projektissamme käytetään Sähkökuormakaaviot20112014 [5] UCI:n tietojoukko. Tämän esimerkin muistikirja voidaan ladata osoitteesta tätä:

Tämä tietojoukko sisältää 370 asiakkaan/kuluttajan virrankulutuksen (kW) 15 minuutin taajuudella. Tiedot kattavat neljä vuotta (4–2011).

Jotkut kuluttajat on luotu vuoden 2011 jälkeen, joten niiden virrankulutus on aluksi nolla.

Teemme tietojen esikäsittelyn mukaan [3]:

  • Kokoa tavoitemuuttujamme power_usage tuntien mukaan.
  • Etsi aikaisin päivämäärä jokaiselle aikasarjalle, jonka teho on nollasta poikkeava.
  • Luo uusia ominaisuuksia: month, day, hour ja day_of_week.
  • Valitse kaikki päivät välillä 2014–01–01 ja 2014–09–07.

Aloitetaan:

Lataa tiedot

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

Tietojen esikäsittely

Jokainen sarake edustaa kuluttajaa. Alkuperäisin power_usage arvot ovat 0.

Seuraavaksi kokoamme tuntitietoihin. Mallin koon ja monimutkaisuuden vuoksi koulutamme mallimme vain viidelle kuluttajalle (niille, joiden arvot poikkeavat nollasta).

Nyt valmistelemme tietojoukkomme TimeSeriesDataset muoto. Huomaa, että jokainen sarake edustaa eri aikasarjaa. Tästä syystä "sulatamme" tietokehyksemme niin, että kaikki aikasarjat pinotaan pystysuunnassa vaakasuoran sijaan. Samalla luomme uusia ominaisuuksia.

Lopullista esikäsiteltyä datakehystä kutsutaan time_df. Tulostetaan sen sisältö:

- time_df on nyt oikeassa muodossa TimeSeriesDataset. Kuten olet jo arvannut, koska rakeisuus on tuntikohtainen, hours_from_start muuttuja on aikaindeksi.

Tutkimusaineistoanalyysi

5 kuluttajan/aikasarjan valinta ei ole satunnainen. The power usage jokaisella aikasarjalla on erilaiset ominaisuudet, kuten keskiarvo:

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

Piirretään jokaisen aikasarjan ensimmäinen kuukausi:

Kuva 2: Ensimmäinen kuukausi kaikista viidestä aikasarjasta/kuluttajasta.

Trendiä ei ole havaittavissa, mutta jokaisella aikasarjalla on hieman erilainen kausivaihtelu ja amplitudi. Voimme edelleen kokeilla ja tarkistaa stationaarisuutta, signaalien hajoamista ja niin edelleen, mutta meidän tapauksessamme keskitymme vain mallin rakentamiseen.

Huomaa myös, että muut aikasarjaennustusmenetelmät, kuten ARIMA on täytettävä muutama vaatimus (esimerkiksi aikasarjan on ensin muututtava paikallaan.) TFT:llä voimme jättää tietomme ennalleen.

Luo DataLoaders

Tässä vaiheessa ohitamme omamme time_df että TimeSeriesDataSet muoto, joka on erittäin hyödyllinen, koska:

  • Se säästää meidät kirjoittamasta omaa Dataloaderiamme.
  • Voimme määrittää, kuinka TFT käsittelee tietojoukon ominaisuuksia.
  • Voimme normalisoida tietojoukomme helposti. Meidän tapauksessamme normalisointi on pakollista, koska kaikki aikasekvenssit eroavat toisistaan. Näin ollen käytämme Ryhmänormalisaattori normalisoida jokainen aikasarja erikseen.

Mallimme käyttää yhden viikon (7*24) tarkasteluikkunaa seuraavan 24 tunnin virrankulutuksen ennustamiseen.

Huomaa myös, että hours_from_start on sekä aikaindeksi että ajassa vaihteleva ominaisuus. The power_usage on tavoitemuuttujamme. Esittelyn vuoksi validointisarjamme on viimeinen päivä:

Perusmalli

Seuraavaksi vaihe, jonka melkein kaikki unohtavat: perusmalli. Varsinkin aikasarjaennusteissa tulet yllättymään siitä, kuinka usein naiivi ennustaja ylittää jopa hienomman mallin!

Naiivina lähtötilanteena ennustamme edellisen päivän virrankäyttökäyrän:

Temporal Fusion Transformer -mallin koulutus

Voimme kouluttaa TFT-malliamme käyttämällä tuttua Kouluttaja PyTorch Lightningin käyttöliittymä.

Huomaa seuraavat asiat:

  • Käytämme EarlyStopping takaisinsoitto tarkistaaksesi vahvistuksen häviämisen.
  • Käytämme Tensorboard kirjaamaan koulutus- ja validointimittarimme.
  • Mallimme käyttää Kvantiili menetys — erityinen menetys, joka auttaa meitä tulostamaan ennustevälit. Lisätietoja Quantile Loss -toiminnosta: tarkista tämä artikkeli.
  • Käytämme 4 huomiopäät, kuten alkuperäinen paperi.

Olemme nyt valmiita rakentamaan ja kouluttamaan malliamme:

Se siitä! Kuuden jakson jälkeen EarlyStopping käynnistyy ja lopettaa harjoittelun.

Lataa ja tallenna paras malli

Älä unohda tallentaa malliasi. Vaikka voimme suolata sen, turvallisin vaihtoehto on tallentaa paras aikakausi suoraan:

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

Lataa malli uudelleen avaamalla sen vetoketju malli.zip ja suorita seuraava - muista vain paras mallipolku:

Tarkista Tensorboard

Katso tarkemmin koulutus- ja validointikäyriä Tensorboardin avulla:

Mallin arviointi

Hanki ennusteita validointijoukosta ja laske keskiarvo P50 (kvantiili mediaani) pois:

Kahdella viimeisellä aikasarjalla on hieman suurempi häviö, koska myös niiden suhteellinen suuruus on korkea.

Piirrä ennusteet validointitiedoista

Jos ohitamme mode=raw på den ennustaa() menetelmällä, saamme lisää tietoa, mukaan lukien ennusteet kaikille seitsemälle kvantiilille. Meillä on myös pääsy huomioarvoihin (sitä lisää myöhemmin).

Katso tarkemmin raw_predictions muuttuja:

Käytämme plot_prediction() luodaksemme juonimme. Tietysti voit tehdä oman mukautetun juonen - plot_prediction() on lisäetuna huomioarvojen lisääminen.

Huomautus: Mallimme ennustaa seuraavat 24 datapistettä yhdellä kertaa. Tämä ei ole rullaava ennustusskenaario, jossa malli ennustaa a single arvo joka kerta ja "ompelee" kaikki ennusteet yhteen.

Luomme yhden tontin jokaiselle kuluttajalle (yhteensä 5).

Kuva 3: Ennusteet MT_002:n validointitiedoista
Kuva 4: Ennusteet MT_004:n validointitiedoista
Kuva 5: Ennusteet MT_005:n validointitiedoista
Kuva 6: Ennusteet MT_006:n validointitiedoista
Kuva 7: Ennusteet MT_008:n validointitiedoista

Tulokset ovat varsin vaikuttavia.

Meidän Temporal Fusion Transformer malli pystyi vangitsemaan kaikkien viiden aikasarjan käyttäytymisen sekä kausiluonteisuuden että suuruuden suhteen!

Huomaa myös, että:

  • Emme tehneet hyperparametrien viritystä.
  • Emme ottaneet käyttöön mitään hienoa ominaisuussuunnittelutekniikkaa.

Seuraavassa osiossa näytämme kuinka parantaa malliamme hyperparametrien optimoinnilla.

Piirrä ennusteet tietylle aikasarjalle

Aiemmin piirimme ennusteita validointitiedoista käyttämällä idx argumentti, joka toistuu kaikissa tietojoukossamme olevissa aikasarjoissa. Voimme olla tarkempia ja tuottaa ennusteita tietylle aikasarjalle:

Kuva 7: Päivän ennuste MT_004 harjoitussarjassa

In Kuva 7, suunnittelemme päivää eteenpäin MT_004 kuluttajan aikaindeksi = 26512.

Muista aika-indeksointisarakkeemme hours_from_start alkaa 26304:stä ja voimme saada ennusteita 26388:sta eteenpäin (koska asetimme aikaisemmin min_encoder_length=max_encoder_length // 2 joka vastaa 26304 + 168//2=26388

Out-of-Sample ennusteet

Luodaan otoksen ulkopuolisia ennusteita validointitietojen lopullisen datapisteen – mikä on – ulkopuolelle 2014–09–07 23:00:00

Meidän tarvitsee vain luoda uusi tietokehys, joka sisältää:

  • Määrä N=max_encoder_length menneet päivämäärät, jotka toimivat katsausikkunana - kooderin tiedot TFT-terminologiassa.
  • Tulevat koon päivämäärät max_prediction_length joille haluamme laskea ennusteemme - dekooderin tiedot.

Voimme luoda ennusteita kaikille viidelle aikasarjallemme tai vain yhdelle. Kuva 7 näyttää otoksesta riippumattomat ennusteet kuluttajalle MT_002:

Kuva 7: Päivän ennuste kohteelle MT_002

Tarkka ennustaminen on yksi asia, mutta myös selitettävyydellä on nykyään paljon merkitystä.

Ja se on vielä pahempaa Deep Learning -malleille, joita pidetään mustina laatikoina. Menetelmät, kuten Lime ja SHAP voi tarjota selitettävyyttä (jossain määrin), mutta ei toimi hyvin aikasarjoille. Lisäksi ne ovat ulkoisia post-hoc-menetelmiä, eivätkä ne ole sidottu tiettyyn malliin.

Temporal Fusion Transformer tarjoaa kolmenlaisia ​​tulkintoja:

  • Kausiluonteisesti: TFT hyödyntää romaaniaan Tulkittava monen pään huomio mekanismi, jolla lasketaan menneiden ajan vaiheiden merkitys.
  • Ominaisuus: TFT hyödyntää sitä Muuttuvan valinnan verkko moduuli laskea jokaisen ominaisuuden tärkeyden.
  • Äärimmäisten tapahtumien kestävyys: Voimme tutkia, kuinka aikasarjat käyttäytyvät harvinaisten tapahtumien aikana

Jos haluat oppia syvällisesti sisäisestä toiminnasta Tulkittava monen pään huomio ja Muuttuvan valinnan verkko, katso edellinen artikkelini.

Kausiluonteinen tulkinta

TFT tutkii huomiopainoja ymmärtääkseen ajallisia malleja menneiden aikavaiheiden välillä.

Harmaat viivat kaikissa aiemmissa kaavioissa edustavat huomiopisteitä. Katsokaa noita juonia uudelleen – huomaatko mitään? Kuva 8 näyttää havainnot Kuva 7 ja myös huomiopisteet:

Kuva 8: Päivän ennuste kohteelle MT_001 ja kausivaihtelut näytetään

Huomiopisteet paljastavat, kuinka vaikuttavia ne aikavaiheet ovat, kun malli antaa ennusteensa. Pienet huiput heijastavat päivittäistä kausivaihtelua, kun taas korkeampi huippu loppua kohti viittaa todennäköisesti viikoittaiseen kausivaihteluun.

Jos keskimääräistämme huomiokäyrät kaikista aikaaskeleista ja aikasarjoista (ei vain niistä viidestä, joita käytimme tässä opetusohjelmassa), saamme symmetrisen muodon Kuva 9 TFT-paperilta:

Kuva 9: Sähkön ajalliset mallit -tietoaineisto (lähde)

Kysymys: Mitä hyvää tämä on? Emmekö voi yksinkertaisesti arvioida kausivaihteluita sellaisilla menetelmillä kuin ACF-kaaviot, aikasignaalin hajoaminen jne.?

Vastaus: Totta. TFT:n huomiopainojen tutkimisella on kuitenkin lisäetuja:

  1. Voimme vahvistaa, että mallimme vangitsee sekvenssiemme ilmeisen kausidynamiikan.
  2. Mallimme saattaa paljastaa myös piilotettuja kuvioita, koska nykyisten syöttöikkunoiden huomiopainot ottavat huomioon kaikki menneet syötteet.
  3. Huomiopainojen kuvaaja ei ole sama kuin autokorrelaatiokaavio: Autokorrelaatiokaavio viittaa tiettyyn sarjaan, kun taas huomiopainot keskittyvät tässä kunkin aikavaiheen vaikutukseen tarkastelemalla kaikkia kovariaatteja ja aikasarjoja.

Ominaisuuskohtainen tulkinta

- Muuttuvan valinnan verkko TFT-komponentti voi helposti arvioida ominaisuuksien tärkeys:

Kuva 10: Sisältää vahvistustietojen tärkeyden

In Kuva 10, huomaamme seuraavan:

  • - hour ja day_of_week niillä on vahvat pisteet sekä menneinä havainnoina että tulevina kovariaatteina. Alkuperäisen paperin vertailuarvo jakaa saman päätelmän.
  • - power_usage on ilmeisesti vaikuttavin havaittu kovariaatti.
  • - consumer_id ei ole kovin merkittävä tässä, koska käytämme vain 5 kuluttajaa. TFT-paperissa, jossa kirjoittajat käyttävät kaikkia 370 kuluttajaa, tämä muuttuja on merkittävämpi.

Huomautus: Jos staattinen ryhmittelymuuttujasi ei ole tärkeä, on hyvin todennäköistä, että tietojoukkosi voidaan mallintaa yhtä hyvin yhdellä jakelumallilla (kuten ARIMA).

Äärimmäisten tapahtumien tunnistus

Aikasarjat ovat tunnettuja siitä, että ne ovat herkkiä ominaisuuksiensa äkillisille muutoksille harvinaisten tapahtumien aikana (kutsutaan myös ns. iskuja).

Vielä pahempaa on, että tapahtumat ovat hyvin vaikeasti havaittavissa. Kuvittele, jos kohdemuuttujasi muuttuu epävakaaksi lyhyeksi ajaksi, koska kovariaatti muuttaa äänettömästi käyttäytymistä:

Onko tämä jokin satunnainen kohina vai piilotettu jatkuva kuvio, joka pakenee mallistamme?

TFT:n avulla voimme analysoida kunkin yksittäisen ominaisuuden kestävyyttä niiden arvoalueella. Valitettavasti nykyisessä tietojoukossa ei esiinny volatiliteettia tai harvinaisia ​​tapahtumia – ne löytyvät todennäköisemmin talous-, myynti- ja niin edelleen tiedoista. Silti näytämme kuinka ne lasketaan:

Joillakin ominaisuuksilla ei ole kaikkia arvojaan validointitietojoukossa, joten näytämme vain hour ja consumer_id:

Kuva 11: Ennusteet vs tosiasiat (normalisoidut keskiarvot) tunnissa
Kuva 12: Ennusteet vs. tosiasiat (normalisoidut keskiarvot) kuluttajatunnuksella

Molemmissa kuvioissa tulokset ovat rohkaisevia. Sisään Kuva 12, huomaamme tämän kuluttajan MT_004 hieman heikompi verrattuna muihin kuluttajiin. Voisimme varmistaa tämän, jos normalisoimme jokaisen kuluttajan P50-häviön heidän aiemmin laskemallamme keskimääräisellä virrankulutuksella.

Harmaat palkit osoittavat kunkin muuttujan jakauman. Yksi asia, jonka teen aina, on löytää, millä arvoilla on alhainen taajuus. Sitten tarkistan, kuinka malli toimii näillä alueilla. Näin voit helposti havaita, tallentaako mallisi harvinaisten tapahtumien käyttäytymisen.

Yleisesti ottaen voit käyttää tätä TFT-ominaisuutta mallin heikkouksien etsimiseen ja jatkaaksesi lisätutkimuksia.

Voimme käyttää saumattomasti Temporal Fusion Transformer with Optuna suorittaaksesi hyperparametrien virityksen:

Ongelmana on, että koska TFT on muuntajapohjainen malli, tarvitset merkittäviä laitteistoresursseja!

Temporal Fusion Transformer on epäilemättä virstanpylväs aikasarjayhteisölle.

Malli ei ainoastaan ​​saavuta SOTA-tuloksia, vaan tarjoaa myös puitteet ennusteiden tulkittavuudelle. Malli on saatavana myös tikanheitto python-kirjasto, joka perustuu PyTorch Forecasting -kirjastoon.

Lopuksi, jos olet utelias oppimaan arkkitehtuurista Temporal Fusion Transformer tarkasta tarkemmin seuralainen artikkeli alkuperäisellä paperilla.

Temporal Fusion Transformer: Aikasarjaennusteet syvän oppimisen avulla – Täydellinen opetusohjelma julkaistu uudelleen lähteestä https://towardsdatascience.com/temporal-fusion-transformer-time-series-forecasting-with-deep-learning-complete-tutorial-d32c1e51cd91? rss—-7f60cf5620c9—4 kautta https://towardsdatascience.com/feed

<!-

->

Aikaleima:

Lisää aiheesta Blockchain-konsultit