Dată o serie de timp, prezicerea următoarei valori este o problemă care a fascinat o mulțime de programatori pentru o lungă perioadă de timp. Evident, un motiv cheie pentru această atenție este reprezentat de piețele bursiere, care promiteau bogății incalculabile dacă reușeai să le descifrezi. Cu toate acestea, cu excepția câtorva persoane (a se vedea Un interviu rar cu matematicianul care a spart Wall Street), aceste bogății s-au dovedit evazive.
Grație IoT (Internet of Things), analiza seriilor temporale este pe cale să revină în prim-plan. IoT ne permite să plasăm senzori omniprezenți peste tot, să colectăm date și să acționăm pe baza acestor date. Dispozitivele IoT colectează date în timp, iar datele rezultate sunt aproape întotdeauna date din serii de timp.
Cele ce urmează sunt câteva cazuri de utilizare pentru predicția seriilor de timp.
- Predicerea încărcării cu energie electrică
- Predicerea cererii pentru magazinele cu amănuntul
- Servicii (de ex. ghișeele de check-in ale companiilor aeriene, birouri guvernamentale) predicția clienților
- Pronosticarea veniturilor
- Monitorizarea vitală a îngrijirii la terapie intensivă
- Predicția randamentului și a culturilor
Să explorăm tehnicile disponibile pentru predicțiile seriilor de timp.
Prima întrebare este aceea că „nu este vorba de regresie?”. Este aproape, dar nu este același lucru cu regresia. Într-o serie de timp, fiecare valoare este afectată de valorile imediat anterioare acestei valori. De exemplu, dacă există mult trafic la ora 4.55 într-o intersecție, există șanse ca și la ora 4.56 să existe ceva trafic. Acest lucru se numește autocorelație. Dacă efectuați o regresie, veți lua în considerare doar x(t), în timp ce, din cauza autocorelației, x(t-1), x(t-2), … vor afecta, de asemenea, rezultatul. Așadar, ne putem gândi la previziunile seriilor de timp ca la o regresie care ia în considerare și autocorelația.
Pentru această discuție, să luăm în considerare „Setul de date privind consumul individual de energie electrică al gospodăriilor”, care sunt date colectate de la o gospodărie pe parcursul a patru ani în intervale de un minut. Să luăm în considerare doar trei câmpuri, iar setul de date va arăta după cum urmează.
Prima întrebare se referă la modul în care măsurăm succesul? Facem acest lucru prin intermediul unei funcții de pierdere, în care încercăm să minimizăm funcția de pierdere. Există mai multe funcții de pierdere, iar acestea au avantaje și dezavantaje diferite.
- MAE ( Mean absolute error) – aici toate erorile, mari și mici, sunt tratate în mod egal
- Root Mean Square Error (RMSE) – aceasta penalizează erorile mari datorită termenului pătrat. De exemplu, cu erori și , MSE pentru ambele va fi 0,5, în timp ce RMSE este 0,5 și. 0,45.
- MAPE ( Mean Absolute Percentage Error) – Deoarece #1 și #2 depind de intervalul de valori al variabilei țintă, acestea nu pot fi comparate între seturile de date. În schimb, MAPE este un procent, deci relativ. Este ca acuratețea într-o problemă de clasificare, unde toată lumea știe că o acuratețe de 99% este destul de bună.
- RMSEP ( Root Mean Square Percentage Error) – Acesta este un hibrid între #2 și #3.
- Rata de eroare a predicțiilor aproape corecte (AC_errorRate) – procentul de predicții care se situează la un procent de %p din valoarea reală
Dacă încercăm să prognozăm următoarea valoare, avem mai multe opțiuni.
Standardul de aur pentru acest tip de probleme este modelul ARIMA. Ideea de bază din spatele modelului ARIMA este de a împărți seria temporală în diferite componente, cum ar fi componenta de tendință, componenta de sezonalitate etc. și de a estima cu atenție un model pentru fiecare componentă. Consultați Using R for Time Series Analysis (Utilizarea R pentru analiza seriilor temporale) pentru o bună prezentare generală.
Cu toate acestea, ARIMA are o problemă nefericită. Are nevoie de un expert ( o diplomă bună în statistică sau un student absolvent) pentru a calibra parametrii modelului. Dacă doriți să faceți ARIMA multivariat, adică să țineți cont de mai multe câmpuri, atunci lucrurile devin și mai dificile.
Totuși, R are o funcție numită auto.arima, care estimează parametrii modelului pentru dumneavoastră. Am încercat asta.
library("forecast")
....
x_train <- train data set
X-test <- test data set
..
powerTs <- ts(x_train, frequency=525600, start=c(2006,503604))
arimaModel <- auto.arima(powerTs)
powerforecast <- forecast.Arima(arimaModel, h=length(x_test))
accuracy(powerforecast)
Puteți găsi o discuție detaliată despre cum să faceți ARIMA din linkurile date mai sus. Am folosit doar 200k din setul de date, deoarece ne concentrăm pe seturi de date de dimensiuni medii. A dat un MAPE de 19,5.
Temporal Features
Cea de-a doua abordare este de a crea o listă de caracteristici care să surprindă aspectele temporale, astfel încât să nu se piardă informațiile de autocorelație. De exemplu, analiza tehnică a pieței bursiere utilizează caracteristici construite cu ajutorul mediilor mobile. În cazul simplu, un analist va urmări mediile mobile de 7 zile și de 21 de zile și va lua decizii pe baza punctelor de încrucișare dintre aceste valori.
În cele ce urmează sunt câteva idei de caracteristici
- colectarea mediilor mobile/ medianelor(e.ex. 7, 14, 30, 90 de zile)
- Timp de la un anumit eveniment
- Timp între două evenimente
- Măsuri matematice, cum ar fi Entropia, scorurile Z etc.
- X(t) ridicat la funcții precum power(X(t),n), cos((X(t)/k)) etc
Trucul obișnuit pe care îl folosesc oamenii este de a aplica aceste caracteristici cu tehnici precum Random Forest și Gradient Boosting, care pot oferi importanța relativă a caracteristicilor. Putem folosi aceste date pentru a păstra caracteristicile bune și a renunța la caracteristicile ineficiente.
Nu mă voi opri prea mult asupra acestui subiect. Cu toate acestea, cu ceva muncă asiduă, această metodă s-a dovedit a da rezultate foarte bune. De exemplu, cele mai multe concursuri sunt câștigate folosind această metodă (de exemplu, http://blog.kaggle.com/2016/02/03/rossmann-store-sales-winners-interview-2nd-place-nima-shahbazi /).
Dezvantajul, totuși, este că elaborarea caracteristicilor este o artă neagră. Este nevoie de multă muncă și experiență pentru a meșteșugi caracteristicile.
Rolling Windows-based Regression
Acum am ajuns la partea interesantă. Se pare că există o altă metodă care dă rezultate destul de bune fără multă îndrumare.
Ideea este că pentru a prezice X(t+1), următoarea valoare dintr-o serie de timp, alimentăm modelul nu doar cu X(t), ci și cu X(t-1), X(t-2) etc. O idee similară a fost discutată în Rolling Analysis of Time Series, deși este folosită pentru a rezolva o problemă diferită.
Să ne uităm la un exemplu. Să spunem că trebuie să prezicem x(t+1) dat fiind X(t). Atunci variabilele sursă și țintă vor arăta în felul următor.
Datele vor arăta în felul următor după ce au fost transformate cu fereastra de rulare de trei.
Apoi, vom utiliza setul de date transformat cu un algoritm de regresie bine cunoscut, cum ar fi regresia liniară și Random Forest Regression. Se așteaptă ca algoritmul de regresie să descopere coeficienții de autocorelație de la X(t-2) la X(t).
De exemplu, cu setul de date de mai sus, aplicarea regresiei liniare pe setul de date transformat folosind o fereastră de rulare de 14 puncte de date a furnizat următoarele rezultate. Aici, AC_errorRate consideră că prognoza este corectă dacă se situează în limita a 10% din valoarea reală.
LR AC_errorRate=44.0 RMSEP=29.4632 MAPE=13.3814 RMSE=0.261307
Acest lucru este destul de interesant, deoarece acest lucru învinge auto ARIMA în mod corect ( MAPE 0,19 față de 0,13 cu ferestre de rulare).
Așa că am încercat doar regresia liniară până acum. Apoi am încercat mai multe alte metode, iar rezultatele sunt prezentate mai jos.