Nachiketa Hebbar

Follow

Sep 18, 2020 – 8 min citește

Prognoza seriilor temporale este una dintre cele mai solicitate tehnici ale științei datelor, fie că este vorba de tranzacționarea la bursă, de predicția vânzărilor în afaceri sau de prognoza meteo. Este în mod clar o abilitate foarte utilă de avut și vă voi dota cu acest lucru până la sfârșitul acestui articol.

În acest tutorial, vom construi un model ARIMA(nu vă faceți griji dacă nu știți încă exact cum funcționează acest lucru) pentru a prezice valorile viitoare ale temperaturii unui anumit oraș folosind python. Linkul GitHub pentru codul și setul de date se găsește la sfârșitul acestui blog. Am atașat, de asemenea, videoclipul meu de pe YouTube la final, în cazul în care sunteți interesați de o explicație video. Deci, fără să pierdem timpul, să începem.

Primul pas în orice serie de timp este să citiți datele și să vedeți cum arată. Următorul fragment de cod demonstrează cum se face acest lucru.

Codul este destul de simplu. Citim datele folosind pd.read_csv și scriind parse_date=True, ne asigurăm că pandas înțelege că are de-a face cu valori de date și nu cu valori de tip șir de caractere.

În continuare, eliminăm orice valori lipsă și tipărim forma datelor. df.head() tipărește primele 5 rânduri din setul de date. Iată ieșirea pe care ar trebui să o vedeți pentru acest lucru:

Plot Your data

Următoarea etapă este reprezentarea grafică a datelor dumneavoastră. Acest lucru vă dă o idee dacă datele sunt staționare sau nu. Pentru cei care nu știu ce înseamnă staționaritatea, dați-mi voie să vă dau un rezumat al acesteia. Deși am realizat mai multe videoclipuri pe această temă, totul se rezumă la următoarele:

Careva date din serii temporale care trebuie modelate trebuie să fie staționare. Staționar înseamnă că proprietățile sale statistice sunt mai mult sau mai puțin constante în timp. Are sens, nu-i așa? Cum altfel ar trebui să faci predicții dacă proprietățile statistice variază în timp? Acestea sunt următoarele proprietăți pe care orice model de staționaritate le va avea:

  1. Mediu constant
  2. Varianță constantă(Pot exista variații, dar variațiile nu ar trebui să fie neregulate)
  3. Nu sezonalitate(Nu există tipare care se repetă în setul de date)

Primul pas este deci să se verifice staționaritatea. Dacă setul dvs. de date nu este staționar, va trebui să îl convertiți într-o serie staționară. Acum, înainte de a începe să vă faceți griji în legătură cu toate acestea, relaxați-vă! Avem un test fix și ușor de verificat pentru staționaritate numit ADF (Augmented Dickey Fuller Test). Dar înainte de a arăta asta, haideți mai întâi să reprezentăm grafic datele.

Din moment ce mă interesează doar să prezic temperatura medie, aceasta este singura coloană pe care o voi reprezenta grafic.

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

Verificarea staționarității

Din start, putem observa că pare să aibă o medie oarecum constantă în jurul valorii de 45. Iar fluctuațiile par, de asemenea, să fie mai mult sau mai puțin la fel. Totuși, pentru a fi siguri dacă datele sunt staționare sau nu, executăm un test statistic fix folosind următorul cod:

Vă veți obține rezultatul după cum urmează:

Nu trebuie să vă faceți griji cu privire la toate statisticile complexe. Pentru a interpreta rezultatele testului, trebuie doar să vă uitați la valoarea p. Și folosiți următoarea metodă simplă:

Dacă p< 0,05 ; Datele sunt staționare

dacă p>0,05; Datele nu sunt staționare

Nu este o regulă dură și rapidă, dar o dată staționară ar trebui să aibă o valoare p mică. O valoare p mai mare ar putea indica prezența anumitor tendințe(variația mediei) sau, de asemenea, sezonalitate.

În cele din urmă, decideți modelul ARIMA

Acum, deși am realizat mai multe videoclipuri pe YouTube pe acest subiect, dacă nu înțelegeți pe deplin ce este un model ARIMA, permiteți-mi să vă prezint o prezentare generală ușoară:

ARIMA este compus din 3 termeni (Auto-Regresie + Integrat+Media mobilă)

  1. Auto-Regresie:

Acest lucru înseamnă, în esență, că folosiți valorile anterioare ale seriei temporale pentru a prezice viitorul. Câte valori anterioare folosiți, determină ordinea modelului AR. Iată cum arată un model AR(1):

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

Destul de simplu, nu-i așa?

2. Integrat:

Îți amintești discuția noastră despre staționaritate și despre faptul că este extrem de importantă? Ei bine, dacă setul de date nu este staționar, cel mai adesea trebuie să efectuați un fel de operațiune de diferență pentru a-l face staționar. Dacă faceți o diferență cu valoarea anterioară, aceasta este de ordinul 1 și așa mai departe. Iată un exemplu în acest sens:

Iertați-mi desenul prost. Dar, după cum puteți, seria Y(t) nu a fost staționară, din cauza unei tendințe crescătoare care a dus la o medie variabilă. Pur și simplu o scădem din valorile anterioare și voila! Ea devine staționară. În funcție de datele dumneavoastră, s-ar putea să trebuiască să repetați diferențierea pentru a obține o diferențiere de ordinul al doilea , de ordinul al treilea și așa mai departe…

3. Media mobilă:

Acest lucru înseamnă practic că folosiți erorile anterioare pentru a face predicția viitoare. De asemenea, are sens, nu-i așa? Văzând cât de mult ai greșit în predicția ta, iei în considerare acest lucru pentru a face o predicție mai bună. Și, la fel ca într-un model AR, numărul de erori anterioare (numit și numărul de decalaje) pe care îl folosiți, determină ordinea modelului.

Iată cum arată ecuația de ordine MA(1):
Y(t)= Medie + O anumită constantă*Error(t-1) +Error(t)

Deci, sarcina noastră principală este să decidem ordinea părților AR, I, MA, care sunt donate de (p,d,q) respectiv.

Și înainte de a începe să vă faceți griji, permiteți-mi să vă spun că totul se va face automat. biblioteca pmdarima vine în ajutorul nostru! Aceasta își face singură treaba de a determina ordinea ARIMA. Iată cum arată fragmentul de cod:

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

(Asigurați-vă că instalați mai întâi biblioteca pmdarima folosind pip install pmdarima)

Codul este destul de autoexplicativ. Pur și simplu furnizăm datele noastre către funcția auto_arima. Funcția utilizează practic ceva numit scor AIC pentru a judeca cât de bun este un anumit model de ordine. Aceasta încearcă pur și simplu să minimizeze scorul AIC și iată cum arată rezultatul:

Performanța modelului pentru diferite combinații de ordine

Puteți vedea că cel mai bun model ARIMA pare să fie de ordinul (1,0,5) cu scorul AIC minim=8294.785. Cu aceste cunoștințe, putem în cele din urmă să procedăm la antrenarea și adaptarea modelului pentru a începe să facem predicții!

Split Your Dataset

Înainte de a antrena efectiv modelul, trebuie să împărțim setul de date într-o secțiune de antrenament și una de testare. Facem acest lucru pentru că mai întâi antrenăm modelul pe date și păstrăm secțiunea de testare ascunsă de model. Odată ce modelul este gata, îi cerem să facă predicții pe datele de testare și să vedem cât de bine se comportă.

Următorul fragment de cod ilustrează modul în care se face acest lucru:

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

Așa că, după cum probabil vă puteți da seama, rezervăm ultimele 30 de zile din date ca secțiune de testare. Puteți vedea formele datelor reale, precum și secțiunile de testare și de instruire în rezultatul de ieșire.

Forma secțiunii de instruire și de testare

În cele din urmă, ajungem la chestiile interesante!

În mod surprinzător, crearea modelului ARIMA este, de fapt, unul dintre cei mai ușori pași, odată ce ați făcut toți pașii premergători. Este la fel de simplu cum se arată în fragmentul de cod de mai jos:

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

După cum puteți vedea, pur și simplu apelăm funcția ARIMA, îi furnizăm setul nostru de date și menționăm ordinea modelului ARIMA pe care îl dorim. Veți putea vedea și rezumatul modelului în ieșire.

Rezumat al modelului

Puteți vedea o mulțime de informații despre modelul dvs. aici. De asemenea, veți putea vedea coeficienții fiecărui termen AR și MA. Aceștia nu sunt altceva decât valoarea variabilelor pe care le-ați văzut în ecuația anterioară a modelului AR/MA și care au fost etichetate ca „Some_Constant”. În general, o mărime mai mare a acestei variabile înseamnă că are un impact mai mare asupra rezultatului.

Verificați cât de bun este modelul dumneavoastră

Aici intervin datele noastre de test. Mai întâi facem o predicție pentru temperatură pe baza datelor de test. Apoi facem o reprezentare grafică pentru a vedea cum se compară predicțiile noastre cu datele reale.

Pentru a face efectiv predicții, trebuie să folosim funcția model.predict și să-i spunem indexul de început și de sfârșit în care dorim să facem predicțiile.

Din moment ce dorim să începem să facem predicții acolo unde se termină datele de antrenament, asta am scris în variabila start. Vrem să încetăm să facem predicții atunci când se termină setul de date, ceea ce explică variabila end. Dacă doriți să faceți și predicții viitoare, puteți schimba în mod corespunzător variabilele start și end cu indicii pe care îi doriți. Graficul de ieșire ar trebui să arate astfel:

Test values vs. Predictions Plot

După cum puteți vedea, predicțiile se potrivesc destul de bine cu tendința reală, cu toate că există un anumit decalaj acceptabil.

Verificați metrica de acuratețe

Pentru a stabili cu adevărat cât de bun sau rău este modelul dvs. găsim eroarea medie pătratică medie pentru acesta. Următorul fragment de cod arată acest lucru:

În primul rând, verificăm valoarea medie a setului de date, care se dovedește a fi 45. Iar eroarea pătratică medie pătratică pentru acest model particular ar trebui să ajungă la aproximativ 2,3. De asemenea, ar trebui să aveți grijă ca rădăcina medie pătratică să fie foarte mică decât valoarea medie a setului de testare. În acest caz, putem vedea că eroarea medie va fi de aproximativ 2,3/45 *100=5,1% din valoarea reală.

Așa că modelul ARIMA este gata să funcționeze! În viitoarele bloguri voi vorbi despre diferite modele și despre cum puteți crește și mai mult acuratețea modelului.

Dacă vă interesează explicația video a acestuia, mergeți pe canalul meu YouTube pentru mai mult conținut de acest gen! Puteți găsi linkul GitHub pentru codul și setul de date aici: https://github.com/nachi-hebbar/ARIMA-Temperature_Forecasting

Nu ezitați să vă conectați cu mine și pe LinkedIn!