
W tutorialu wprowadzamy kilka podstawowych pojęć z zakresu szeregów czasowych, aby umożliwić „szybką” predykcję przyszłych wartości w odniesieniu do danych czasowych. Tutorial ten nie jest wyczerpujący, lecz przedstawia kilka podstawowych narzędzi dostępnych w Pythonie, które pozwalają wykonać pierwsze operacje przetwarzania. Tutaj znajdziesz kod pozwalający uzyskać te wyniki: https://gitlab.com/margo-group/public/SeriesTemporelles.
Szereg czasowy, zwany też szeregiem chronologicznym, to ciąg wartości liczbowych uporządkowanych w czasie, często z tym samym krokiem czasowym rozdzielającym kolejne obserwacje.
Poniższa ilustracja pokazuje szereg czasowy przedstawiający dzienne obroty generowane przez witrynę prowadzącą sprzedaż online w pierwszym roku jej działania. Będziemy korzystać z tego szeregu w całym tutorialu, aby zilustrować opisywane przez nas modele predykcji.
Jednym z najważniejszych pojęć w analizie szeregów czasowych jest stacjonarność. Chodzi o to, by wiedzieć, czy obserwacje z danego szeregu czasowego są generowane przez strukturę*, która ulega zmianom w czasie, czy nie.
Praktycznym sposobem na to, by sprawdzić, czy szereg czasowy jest stacjonarny, czy też nie, jest analiza w czasie ewolucji struktury jego średniej, jego wariancji oraz ich wzajemnej korelacji.
Dla wyjaśnienia, jeśli zapisujemy {st}Tt=1 jako szereg czasowy, będzie on stacjonarny**, gdy:
E[st]=m<∞,∀t,
V[st]=σ2<∞,∀t,
γ(t1,t2)=γ(t2−t1),
przy czym:
Cov(st1,st2)=E[(st1−m)(st2−m)].
Te trzy twierdzenia wskazują, że średnia, wariancja i zależność między wartościami szeregu mają strukturę skończoną i niezależną od czasu.
Poprzednia ilustracja pokazuje, że ten szereg nie jest stacjonarny; widać, że poziomy obrotów i ich zmienność ewoluują w czasie.
Istnieje wiele testów statystycznych***, które pozwalają stwierdzić, czy dany szereg jest stacjonarny, czy też nie. Możliwa jest sytuacja, że średnia, wariancja i autokorelacje szeregu stanowiącego punkt wyjścia nie są stałe w czasie, ale statystyki dotyczące zmian szeregu między d okresami – już tak. Można więc nadać stacjonarny charakter niestacjonarnemu szeregowi, różnicując go d razy, czyli traktować go jako {st−st−d}. Mówimy tu o operatorze opóźnień zapisywanym jako L, zastosowanym d razy.
Model ARIMA
Model ARIMA, nazywany również modelem Boxa-Jenkinsa, składa się z trzech elementów: procesu autoregresyjnego (AR), stopnia różnicowania (I) oraz procesu średniej ruchomej (MA).
Autoregresja zakłada, że wartość w momencie t jest kombinacją liniową wartości poprzednich momentów z uwzględnieniem elementu błędu.
AR(p):st=m+∑pi=1ϕist−i+ϵt
Część dotycząca średniej ruchomej zakłada, że szereg jest kombinacją liniową białego szumu**** i jest zapisany w następujący sposób:
MA(q):st=ϵt+∑qi=1θiϵt−i
Element różnicowania zaś polega na jednokrotnym lub wielokrotnym zastosowaniu operatora opóźnień L.
Tym samym model ARIMA przybiera następującą postać:
ARIMA(p,d,q):(1−∑pi=1ϕiLi)(1−L)dst=m+(1+∑qi=1θiLi)ϵt)
Bardziej szczegółowa wersja modelu ARIMA (występująca pod nazwą SARIMA) proponuje modelowanie sezonowości szeregu czasowego z wykorzystaniem dodatkowego parametru S, który oznacza okres oraz parametrów P, D i Q, które reprezentują czynniki p, d i q szeregu zróżnicowanego S razy.
Parametry p, d, q, S, P, D i Q są określane poprzez optymalizację kryterium informacyjnego Akaikego (AIC). Kryterium to pozwala określić stosunek między złożonością danego modelu i jego dopasowaniem.
Poniższa ilustracja pokazuje wynik prognozowania szeregu za pomocą modelu ARIMA dla ostatnich 165 dni roku (obszar różowy). Widać, że uzyskana predykcja ma poziom wariancji zbliżony do szeregu wyjściowego. Jednak predykcja często nie zachowuje kierunku, w którym ewoluuje szereg.
- punkt szeregu źródłowego nie zawiera żadnej wartości. Może to wynikać z awarii witryny tego dnia lub po prostu z braku danych. Dzięki okresowości skalibrowanej za pomocą modelu ARIMA można zauważyć, że model przewiduje największy spadek obrotów w ciągu czterech tygodni następujących po 277. dniu szeregu. Pokazuje to zarazem możliwości tego modelu, jak i jego ograniczenia.
W kolejnej części artykułu koncentrujemy się na innym modelu prognozowania opartym na sieciach neuronowych.
Rekurencyjna sieć neuronowa (RNN)
Sztuczne sieci neuronowe są systemami informatycznymi inspirowanymi biologicznymi sieciami neuronowymi, z których składają się mózgi istot żywych. Systemy te uczą się danego zjawiska poprzez analizę wielu przykładów. Sieć opiera się na zbiorze połączonych jednostek zwanych neuronami. Każde połączenie między dwoma neuronami oznacza możliwość przekazywania sobie przez nie sygnałów.
Rekurencyjna sieć neuronowa (RNN) jest sztuczną siecią neuronową z połączeniami rekurencyjnymi, to znaczy z połączonymi między sobą neuronami, które mogą tworzyć cykle. Sieci tego rodzaju okazały się skuteczne w modelowaniu zagadnień związanych z automatycznym rozpoznawaniem słów, pisma odręcznego, kształtów i w prognozowaniu szeregów czasowych.
Aby ocenić efektywność prognoz uzyskiwanych dzięki RNN, dane szeregów są rozdzielane na dwa podzbiory: zbiór treningowy i zbiór testowy. Tak jak poprzednio, oddzielimy dane z pierwszych 200 dni od reszty szeregu.
Prostym sposobem na przetwarzanie danych czasowych za pomocą RNN jest postrzeganie kwestii predykcji jako zagadnienia związanego z regresją. W rzeczywistości bowiem reorganizujemy dane w taki sposób, aby wyjaśnić bieżącą wartość szeregu za pomocą wybranej liczby poprzedzających ją wartości. Ta liczba to rozmiar okna, przez które patrzymy na szereg i które codziennie przesuwa się o stopień dalej.
Wdrożona sieć używa jako wartości wejściowej liczby badanych opóźnień, warstwy ukrytej z 3 neuronami i warstwy wyjściowej.
Do oceny efektywności modelu używa się kryterium RMSE (root-mean-square error), to znaczy pierwiastka błędu średniokwadratowego dla wartości prognozowanych i zaobserwowanych. Sieć jest dopasowywana poprzez określenie funkcji aktywacji i metody optymalizacji za pomocą biblioteki Keras. Na koniec model jest dostosowywany do zbioru analizowanych danych. Otrzymujemy prognozy jak na poniższej ilustracji.
Uzyskane RMSE wynosi 317722, podczas gdy dla modelu ARIMA RMSE jest równe 344723. To pokazuje, że prognozowanie za pomocą RNN daje lepsze rezultaty niż w przypadku modelu ARIMA.
Sieć neuronowa RNN-LTSM
RNN-LSTM (LSTM jako long short term memory) to architektura rekurencyjnej sieci neuronowej, która w procesie nauki zapamiętuje wartości w dowolnych przedziałach. Tego typu architektura jest odpowiednia do klasyfikowania, przetwarzania i prognozowania szeregów czasowych, w których pomiędzy ważnymi zdarzeniami występują przesunięcia czasowe nieznanych rozmiarów i długości.
Wynik prognozowania za pomocą RNN-LTSM jest podany na poniższej ilustracji. W tym przypadku RMSE wynosi 294995. Oznacza to, że model RNN-LTSM przewyższa modele ARIMA i RNN pod względem precyzji prognozowania w odniesieniu do zbioru danych testowych.
Chcielibyśmy również podkreślić, że model ten nie przewiduje spadku obrotów po 277. dniu (co jest normalne). Natomiast z powodzeniem prognozuje szczyt, który ma miejsce tydzień później, przy czym nie ma to wpływu na kolejne tygodnie, jak było w przypadku modelu ARIMA.
Podsumowanie
W tutorialu (i poprzez towarzyszący mu kod dostępny tutaj: https://gitlab.com/margo-group/public/SeriesTemporelles) pokazaliśmy, jak zastosować modele ARIMA, RNN i RNN-LSTM w procesie prognozowania danych szeregów czasowych z wykorzystaniem bibliotek Pythona. Stwierdziliśmy, że dla danych użytych w ramach tego testu najbardziej precyzyjny okazał się model RNN-LSTM.
*Mówimy o procesie stochastycznym generującym dane.
**Mówiąc dokładniej, podana tutaj definicja dotyczy stacjonarności słabej lub drugiego rzędu.
***Wyróżniamy dwa rodzaje testów stacjonarności: testy pierwiastka jednostkowego, jak rozszerzony test Dickeya-Fullera i test Phillipsa-Perrona, w których hipoteza zerowa przyjmuje, że szereg nie jest stacjonarny, oraz testy takie jak KPSS, w których hipoteza zerowa przyjmuje, że szereg jest stacjonarny.
****Biały szum to realizacja losowego procesu, w którym wariancja jest stała, a średnia i autokowariancja są zerowe.