Nachiketa Hebbar

Follow

18. sep, 2020 – 8 min læsning

Tidsrækkesprognoser er en af de mest efterspurgte teknikker inden for datalogi, uanset om det er inden for aktiehandel, forudsigelse af forretningssalg eller vejrudsigter. Det er helt klart en meget praktisk færdighed at have, og jeg vil udstyre dig med netop det ved slutningen af denne artikel.

I denne tutorial vil vi opbygge en ARIMA-model(bare rolig, hvis du ikke helt ved, hvordan det fungerer endnu) for at forudsige de fremtidige temperaturværdier for en bestemt by ved hjælp af python. GitHub-linket til koden og datasættet kan findes i slutningen af denne blog. Jeg har også vedhæftet min YouTube-video til sidst, hvis du er interesseret i en video-forklaring. Så uden at spilde nogen tid, lad os komme i gang.

Det første skridt i enhver tidsserie er at læse dine data og se, hvordan det ser ud. Det følgende kodestykke demonstrerer, hvordan man gør det.

Koden er ret ligetil. Vi læser dataene ved hjælp af pd.read_csv og skriver parse_date=True, hvilket sikrer, at pandas forstår, at der er tale om datoværdier og ikke strengværdier.

Dernæst dropper vi eventuelle manglende værdier og udskriver formen på dataene. df.head() udskriver de første 5 rækker af datasættet. Her er det output, du bør se for dette:

Plot dine data

Det næste er at plotte dine data ud. Dette giver dig en idé om, hvorvidt dataene er stationære eller ej. For dem, der ikke ved, hvad stationæritet betyder, vil jeg give dig et resumé af det. Selv om jeg har lavet flere videoer om dette emne, kan det hele koges ned til dette:

Alle tidsseriedata, der skal modelleres, skal være stationære. Stationær betyder, at dens statistiske egenskaber er mere eller mindre konstante med tiden. Det giver mening, ikke? Hvordan skal man ellers kunne lave forudsigelser, hvis de statistiske egenskaber varierer med tiden? Det er følgende egenskaber, som enhver stationær model vil have:

  1. Konstant middelværdi
  2. Konstant varians(Der kan være variationer, men variationerne bør ikke være uregelmæssige)
  3. Ingen sæsonudsving(Ingen gentagende mønstre i datasættet)

Så første skridt er at kontrollere for stationaritet. Hvis dit datasæt ikke er stationært, skal du konvertere det til en stationær serie. Inden du nu begynder at bekymre dig om alt dette, skal du slappe af! Vi har en fast nem test til at kontrollere for stationaritet kaldet ADF(Augmented Dickey Fuller Test). Men før vi viser det, skal vi først plotte dataene.

Da jeg kun er interesseret i at forudsige den gennemsnitlige temperatur, er det den eneste kolonne, jeg vil plotte.

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

Tjek af stationæritet

Der kan vi straks se, at det ser ud til at have en noget konstant middelværdi omkring 45. Og udsvingene ser også ud til at være mere eller mindre de samme. Men for at være sikker på, om dataene er stationære eller ej, kører vi en fast statistisk test med følgende kode:

Du får følgende output:

Du behøver ikke at bekymre dig om alle de komplekse statistikker. For at fortolke testresultaterne behøver du kun at se på p-værdien. Og du bruger følgende enkle metode:

If p< 0,05 ; Data er stationære

if p>0,05; Data er ikke stationære

Det er ikke en fast regel, men en stationær data bør have en lille p-værdi. Større p-værdi kan også indikere tilstedeværelsen af visse tendenser(varierende middelværdi) eller sæsonbestemthed.

Endeligt skal du beslutte din ARIMA-model

Nu selvom jeg har lavet flere YouTube-videoer om dette emne, hvis du ikke helt forstår, hvad en ARIMA-model er, så tillad mig at præsentere et let overblik:

ARIMA er sammensat af 3 udtryk(Auto-Regression + Integrated+Moving-Average)

  1. Auto-Regression:

Det betyder dybest set, at du bruger de tidligere værdier af tidsserien for at forudsige fremtiden. Hvor mange tidligere værdier du bruger, bestemmer rækkefølgen af AR-modellen. Sådan ser en AR(1)-model ud:

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

Simpelt nok, ikke sandt?

2. Integreret:

Så, kan du huske vores snak om stationæritet, og hvordan det er ekstremt vigtigt? Tja, hvis dit datasæt ikke er stationært, skal du oftest udføre en eller anden form for differensoperation for at gøre det stationært. Hvis du differentierer med tidligere værdi, er dens orden 1 og så videre. Her er et eksempel på det:

Undskyld min dårlige tegning. Men som du kan se, var serien Y(t) ikke stationær, fordi den havde en stigende tendens, der resulterede i en varierende middelværdi. Vi trækker den blot fra tidligere værdier, og voila! Den bliver stationær. Afhængigt af dine data skal du måske gentage differentieringen for at få en differentiering af anden orden , tredje orden osv..

3. Glidende gennemsnit:

Det betyder grundlæggende, at du bruger tidligere fejl til at lave den fremtidige forudsigelse. Giver også mening, ikke sandt? Ved at se, hvor forkert du var i din forudsigelse, tager du det med i betragtning for at lave en bedre forudsigelse. Og ligesom i en AR-model bestemmer antallet af tidligere fejl(også kaldet antal lags), du bruger, modellens rækkefølge.

Sådan ser MA(1)-ordningsligningen ud:
Y(t)= Mean + Some_Constant*Error(t-1) +Error(t)

Så vores vigtigste opgave er at bestemme rækkefølgen af AR-, I-, MA-delen, som er doneret af henholdsvis(p,d,q).

Og før du begynder at bekymre dig, lad mig fortælle, at alt vil blive gjort automatisk. pmdarima-biblioteket kommer til vores redning! Det gør arbejdet med at finde ud af rækkefølgen af ARIMA helt af sig selv. Her er hvordan kodestumpen ser ud:

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

(Sørg for at installere pmdarima-biblioteket først ved hjælp af pip install pmdarima)

Koden er ret selvforklarende. Vi leverer simpelthen vores data til auto_arima-funktionen. Funktionen bruger grundlæggende noget, der kaldes som AIC-score, til at bedømme, hvor god en bestemt ordningsmodel er. Den forsøger simpelthen at minimere AIC-score, og sådan ser output ud:

Modellens ydeevne for forskellige kombinationer af ordrer

Vi kan se, at den bedste ARIMA-model ser ud til at være af ordren (1,0,5) med den mindste AIC-score=8294.785. Med denne viden kan vi endelig fortsætte med at træne og tilpasse modellen for at begynde at lave forudsigelser!

Split Your Dataset

Hvor vi rent faktisk træner modellen, skal vi opdele datasættet i en trænings- og en testsektion. Det gør vi, fordi vi først træner modellen på dataene og holder testsektionen skjult for modellen. Når modellen er klar, beder vi den om at lave forudsigelser på testdataene og se, hvor godt den klarer sig.

Det følgende kodestykke illustrerer, hvordan vi gør det:

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

Så som du sikkert kan se, reserverer vi de sidste 30 dage af dataene som testsektionen. Du kan se formen af de faktiske data og test- og træningsafsnittet i output.

Form af trænings- og testafsnittet

Endeligt kommer vi til det saftige stof!

Overraskende nok er det faktisk et af de nemmeste trin at oprette ARIMA-modellen, når du har udført alle de forudsætningsmæssige trin. Det er så simpelt som vist i kodestumpen nedenfor:

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

Som du kan se, kalder vi blot ARIMA-funktionen, forsyner den med vores datasæt og nævner rækkefølgen af den ARIMA-model, vi ønsker. Du vil også kunne se opsummeringen af modellen i dit output.

Model Summary

Du kan se en hel masse oplysninger om din model herovre. Du vil også kunne se koefficienterne for hver AR- og MA-termin. Disse er intet andet end værdien af de variabler, som du så i den foregående AR/MA-modelligning, der blev mærket som “Some_Constant”. Generelt betyder en højere størrelse af denne variabel, at den har en større indvirkning på outputtet.

Tjek, hvor god din model er

Her kommer vores testdata ind i billedet. Vi foretager først en forudsigelse for temperaturen på testdataene. Derefter plotter vi ud for at se, hvordan vores forudsigelser sammenlignet med de faktiske data.

For faktisk at lave forudsigelser skal vi bruge funktionen model.predict og fortælle den start- og slutindekset, hvor vi ønsker at lave forudsigelserne.

Da vi ønsker at begynde at lave forudsigelser, hvor træningsdataene slutter , er det, hvad jeg har skrevet i startvariablen. Vi ønsker at stoppe med at lave forudsigelser, når datasættet slutter, hvilket forklarer slutvariablen. Hvis du også ønsker at foretage fremtidige forudsigelser, kan du blot ændre det tilsvarende i start- og slutvariablen til de indekser, du ønsker. Dit outputplot bør se således ud:

Testværdier vs. forudsigelser Plot

Som du kan se gør forudsigelserne et ret godt stykke arbejde med at matche med den faktiske tendens, selv om der er en vis acceptabel forsinkelse.

Kontroller din nøjagtighedsmetrik

For faktisk at fastslå, hvor god eller dårlig din model er, finder vi den gennemsnitlige kvadratiske fejl for den. Følgende kodestump viser det:

Først kontrollerer vi middelværdien af datasættet, som viser sig at være 45. Og root mean squared error for denne særlige model bør komme til at ligge på omkring 2,3. Du bør også være opmærksom på, at din root mean squared error skal være meget mindre end middelværdien af testsætet. I dette tilfælde kan vi se, at den gennemsnitlige fejl bliver ca. 2,3/45 *100=5,1 % af den faktiske værdi.

Så hermed er din ARIMA-model klar til brug! I fremtidige blogs vil jeg tale om forskellige modeller, og hvordan du kan øge modellens nøjagtighed yderligere.

Hvis du er interesseret i video-forklaringen af det samme, så gå over til min YouTube-kanal for mere sådant indhold! Du kan finde GitHub-linket til koden og datasættet her: https://github.com/nachi-hebbar/ARIMA-Temperature_Forecasting

Føl dig også velkommen til at komme i kontakt med mig på LinkedIn!