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:
- Mediu constant
- Varianță constantă(Pot exista variații, dar variațiile nu ar trebui să fie neregulate)
- 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ă:
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.
Î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.
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:
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!
Lasă un răspuns