Nachiketa Hebbar

Follow

18. syyskuuta, 2020 – 8 min read

Aikainsarjojen ennakointi (time series forecasting) on yksi data-tieteen kysytyimmistä tekniikoilla olevista tekniikoihin, olipa kyse sitten osakekaupasta, yritysten myynnin ennustamisesta tai sääennusteista. Se on selvästi erittäin kätevä taito, ja aion varustaa sinut juuri sillä tämän artikkelin loppuun mennessä.

Tässä opetusohjelmassa rakennamme ARIMA-mallin (älä huoli, jos et vielä tarkalleen tiedä, miten tämä toimii) ennustamaan tietyn kaupungin tulevia lämpötila-arvoja pythonia käyttäen. Koodin ja datasarjan GitHub-linkki löytyy tämän blogin lopusta. Olen myös liittänyt YouTube-videoni loppuun, jos olet kiinnostunut selitysvideosta. Aloitetaan siis aikaa tuhlaamatta.

Kaikkien aikasarjojen ensimmäinen askel on lukea datasi ja katsoa, miltä se näyttää. Seuraava koodinpätkä havainnollistaa, miten se tehdään.

Koodi on melko suoraviivaista. Luemme datan käyttämällä pd.read_csv:tä ja kirjoittamalla parse_date=True, varmistamme, että pandas ymmärtää, että se käsittelee päivämääräarvoja eikä merkkijonoarvoja.

Seuraavaksi pudotamme puuttuvat arvot ja tulostamme datan muodon. df.head() tulostaa datasetin 5 ensimmäistä riviä. Tässä on tuloste, joka sinun pitäisi nähdä tästä:

Plottaa datasi

Seuraavaksi piirretään datasi. Näin saat käsityksen siitä, onko data pysyvää vai ei. Niille, jotka eivät tiedä, mitä stationaarisuus tarkoittaa, kerron sen pääpiirteittäin. Vaikka olen tehnyt useita videoita tästä aiheesta, kaikki tiivistyy tähän:

Kaiken aikasarjadatan, jota on mallinnettava, on oltava stationaarista. Stationaarinen tarkoittaa, että sen tilastolliset ominaisuudet ovat enemmän tai vähemmän vakioita ajan myötä. Kuulostaa järkevältä, eikö? Miten muuten pitäisi tehdä ennusteita, jos tilastolliset ominaisuudet vaihtelevat ajan myötä? Nämä ovat seuraavat ominaisuudet, jotka millä tahansa stationaarisella mallilla on:

  1. Konstantti keskiarvo
  2. Konstantti varianssi(Vaihtelua voi olla, mutta vaihtelu ei saa olla epäsäännöllistä)
  3. Ei kausiluonteisuutta(Ei toistuvia kuvioita datajoukossa)

Ensimmäinen askel on siis stationaarisuuden tarkistaminen. Jos aineistosi ei ole stationaarinen, sinun on muunnettava se stationaariseksi sarjaksi. Ennen kuin alat huolestua tästä kaikesta, rentoudu! Meillä on kiinteä helppo testi stationaarisuuden tarkistamiseksi nimeltään ADF (Augmented Dickey Fuller Test). Mutta ennen kuin näytämme sen, piirretään ensin tiedot.

Koska olen kiinnostunut vain keskilämpötilan ennustamisesta, se on ainoa sarake, jonka piirrän.

df.plot(figsize=(12,5))

Sationaarisuuden tarkistaminen

Heti alkuun näemme, että keskiarvo näyttäisi pysyvän jokseenkin vakiona 45:n tienoilla. Myös vaihtelut näyttävät olevan jokseenkin samat. Varmistaaksemme kuitenkin, onko data stationaarista vai ei, suoritamme kiinteän tilastollisen testin seuraavalla koodilla:

Saat tuloksen seuraavasti:

Et tarvitse huolehtia kaikesta monimutkaisesta tilastoinnista. Tulkitaksesi testituloksia sinun tarvitsee vain katsoa p-arvoa. Ja käytät seuraavaa yksinkertaista menetelmää:

Jos p< 0.05 ; Aineisto on stationaarinen

jos p>0.05; Aineisto ei ole stationaarinen

Ei ole tiukka sääntö, mutta stationaarisella aineistolla pitäisi olla pieni p-arvo. Suurempi p-arvo voi viitata myös tiettyjen trendien (vaihteleva keskiarvo) tai kausivaihtelun esiintymiseen.

Viimein, päätä ARIMA-malli

Nyt vaikka olen tehnyt useita YouTube-videoita tästä aiheesta, jos et täysin ymmärrä, mitä ARIMA-malli on, anna minun esittää helppo yleiskatsaus:

ARIMA koostuu kolmesta termistä(Auto-Regression + Integrated+Moving-Average)

  1. Auto-Regression:

Tämä tarkoittaa pohjimmiltaan sitä, että käytät aikasarjan aiempia arvoja ennustaaksesi tulevaisuuden. Se, kuinka monta aiempaa arvoa käytät, määrittää AR-mallin järjestyksen. Näin AR(1)-malli näyttää:

Y(t)= Some_Constant*Y(t-1)+ Another_Constant +Error(t)

Yksinkertaista, eikö?

2. Integroitu:

Muistatko puheemme paikallaan pysyvyydestä ja siitä, kuinka se on äärimmäisen tärkeä? No jos aineistosi ei ole stationaarinen, joudut useimmiten suorittamaan jonkinlaisen erotusoperaation saadaksesi sen stationaariseksi. Jos erotat edelliseen arvoon, sen järjestys on 1 ja niin edelleen. Tässä esimerkki:

Anteeksi huono piirrokseni. Mutta kuten näette sarja Y(t) ei ollut stationaarinen, koska kasvava trendi johti vaihtelevaan keskiarvoon. Me yksinkertaisesti vähennämme sen edellisistä arvoista ja voila! Siitä tulee stationaarinen. Riippuen tiedoistasi, saatat joutua toistamaan differentioinnin saadaksesi toisen kertaluvun differentioinnin , kolmannen kertaluvun ja niin edelleen..

3. Liukuva keskiarvo:

Tämä tarkoittaa pohjimmiltaan sitä, että käytät aiempia virheitä tulevan ennusteen tekemiseen. Siinä on myös järkeä, eikö? Kun näet, kuinka väärässä olit ennusteessasi, otat sen huomioon tehdessäsi paremman ennusteen. Ja aivan kuten AR-mallissa, aiempien virheiden määrä (jota kutsutaan myös viiveiden määräksi), jota käytät, määrittää mallin järjestyksen.

Tässä on, miten MA(1) järjestysyhtälö näyttää:
Y(t)= Keskiarvo + Jokin_vakio*Virhe(t-1) +Virhe(t)

Tärkein tehtävämme on siis päättää järjestys AR-, I-, ja MA-osille, jotka lahjoitetaan(p,d,q) vastaavasti.

Ja ennen kuin alat huolestua, kerrottakoon, että kaikki tehdään automaattisesti. pmdarima-kirjasto tulee apuun! Se tekee ARIMA:n järjestyksen selvittämisen ihan itse. Tältä koodinpätkä näyttää:

from pmdarima import auto_arima
stepwise_fit = auto_arima(df, trace=True,
suppress_warnings=True)

(Varmista, että asennat pmdarima-kirjaston ensin käyttämällä pip install pmdarima)

Koodi on melko itsestään selvä. Toimitamme yksinkertaisesti datamme auto_arima-funktiolle. Funktio käyttää periaatteessa jotain, jota kutsutaan AIC-pisteeksi, arvioimaan, kuinka hyvä tietty järjestysmalli on. Se yksinkertaisesti yrittää minimoida AIC-pistemäärän, ja seuraavalta näyttää tulos:

Mallin suorituskyky eri järjestysyhdistelmillä

Voidaan nähdä, että paras ARIMA-malli näyttäisi olevan järjestys (1,0,5), jonka AIC-pistemäärä on vähintään AIC-pistemäärä=8294.785. Tämän tiedon avulla voimme vihdoin jatkaa mallin kouluttamista ja sovittamista, jotta voimme aloittaa ennusteiden tekemisen!

Tietoaineiston jakaminen

Ennen mallin varsinaista kouluttamista meidän on jaettava aineisto harjoittelu- ja testausosioon. Teemme näin, koska koulutamme ensin mallin datalla ja pidämme testausosion piilossa mallilta. Kun malli on valmis, pyydämme sitä tekemään ennusteita testidatalla ja katsomme, miten hyvin se suoriutuu.

Seuraava koodinpätkä havainnollistaa, miten tämä tehdään:

print(df.shape)
train=df.iloc
test=df.iloc
print(train.shape,test.shape)

Kuten varmaan huomaatkin, varaamme datan viimeiset 30 päivää testiosuudeksi. Voit nähdä varsinaisen datan sekä testaus- ja koulutusosion muodot tulosteessa.

Koulutus- ja testausosion muoto

Viimein pääsemme mehukkaaseen juttuun!

Yllättäen ARIMA-mallin luominen on itse asiassa yksi helpoimmista vaiheista, kun olet tehnyt kaikki ennakkovaiheet. Se on yhtä yksinkertaista kuin alla olevassa koodinpätkässä:

from statsmodels.tsa.arima_model import ARIMA
model=ARIMA(train,order=(1,0,5))
model=model.fit()
model.summary()

Kuten näet, kutsumme yksinkertaisesti ARIMA-funktiota, annamme sille datajoukkomme ja mainitsemme haluamamme ARIMA-mallin järjestyksen. Tulosteessa näet myös mallin yhteenvedon.

Mallin yhteenveto

Tässä näet paljon tietoa mallista. Näet myös jokaisen AR- ja MA-termin kertoimet. Nämä eivät ole mitään muuta kuin niiden muuttujien arvoja, jotka näit edellisessä AR/MA-mallin yhtälössä ja jotka oli merkitty nimellä ’Some_Constant’. Yleensä tämän muuttujan suurempi arvo tarkoittaa, että sillä on suurempi vaikutus tulokseen.

Tarkista, kuinka hyvä malli on

Tässä kohtaa testidatamme tulevat kuvaan. Teemme ensin ennusteen lämpötilalle testidatan perusteella. Sitten piirrämme ulos nähdäksemme, miten ennusteemme vertautuvat todelliseen dataan.

Todelliseksi ennusteiden tekemiseksi meidän on käytettävä model.predict-funktiota ja kerrottava sille alku- ja loppuindeksi, jossa haluamme tehdä ennusteet.

Koska haluamme aloittaa ennusteiden tekemisen siellä, missä harjoitusdata loppuu , sen olen kirjoittanut start-muuttujaan. Haluamme lopettaa ennusteiden tekemisen, kun data-aineisto loppuu, mikä selittää end-muuttujan. Jos haluat tehdä ennusteita myös tulevaisuudessa, voit vain muuttaa sen vastaavasti alku- ja loppumuuttujassa haluamiisi indekseihin. Tulosdiagrammisi pitäisi näyttää tältä:

Testiarvot vs. ennusteet -diagrammi

Kuten huomaat, ennusteet täsmäävät melko hyvin todellisen trendin kanssa, vaikka tiettyä hyväksyttävää viivettä onkin.

Check your Accuracy Metric

Voidaksemme itse asiassa todeta, kuinka hyvä tai huono mallisi on, etsimme sille keskimääräisen neliövirheen juuren. Seuraava koodinpätkä osoittaa sen:

Ensin tarkistamme aineiston keskiarvon, joka tulee olemaan 45. Ja tämän tietyn mallin neliöllisen keskivirheen juuren keskiarvon pitäisi olla noin 2,3. Kannattaa myös huolehtia siitä, että neliöllisen keskivirheen juuren keskiarvon pitäisi olla hyvin paljon pienempi kuin testijoukon keskiarvo. Tässä tapauksessa voimme nähdä, että keskivirhe on noin 2,3/45 *100=5,1 % todellisesta arvosta.

Siten ARIMA-mallisi on valmis! Tulevissa blogeissa aion puhua erilaisista malleista ja siitä, miten voit kasvattaa mallin tarkkuutta entisestään.

Jos olet kiinnostunut videomuotoisesta selityksestä, suuntaa YouTube-kanavalleni katsomaan lisää tällaista sisältöä! Koodin ja datasetin GitHub-linkin löydät täältä: https://github.com/nachi-hebbar/ARIMA-Temperature_Forecasting

Ole minuun yhteydessä myös LinkedInissä!