Given a time series, predicting the next value is a problem that fascinated a lot of programmers for a long time time. Oczywiście, kluczowym powodem tej uwagi jest giełda, która obiecywała niewyobrażalne bogactwo, jeśli uda się ją złamać. Jednak, z wyjątkiem kilku (patrz rzadki wywiad z matematykiem, który złamał Wall Street), te bogactwa okazały się nieuchwytne.
Dzięki IoT (Internet of Things), analiza szeregów czasowych jest przygotowany do powrotu w centrum uwagi. IoT niech nam umieścić wszechobecne czujniki wszędzie, zbierać dane, i działać na tych danych. Urządzenia IoT zbierają dane w czasie i dane wynikowe są prawie zawsze dane szeregów czasowych.
Poniżej przedstawiono kilka przypadków użycia predykcji szeregów czasowych.
- Predykcja obciążenia
- Predykcja popytu dla sklepów detalicznych
- Usługi (np. stanowiska odprawy linii lotniczych, urzędy państwowe) przewidywanie klientów
- Prognozy przychodów
- Monitorowanie witalności opieki na OIOM
- Prognozowanie plonów i upraw
Poznajmy techniki dostępne dla prognoz szeregów czasowych.
Pierwszym pytaniem jest to, że „czy to nie jest regresja?”. To jest blisko, ale nie to samo co regresja. W szeregu czasowym na każdą wartość mają wpływ wartości tuż poprzedzające tę wartość. Na przykład, jeśli jest duży ruch o 4.55 na skrzyżowaniu, są szanse, że będzie trochę ruchu o 4.56, jak również. Jest to tak zwana autokorelacja. Jeśli robisz regresję, będziesz brał pod uwagę tylko x(t), podczas gdy z powodu autokorelacji, x(t-1), x(t-2), … również będą miały wpływ na wynik. Tak więc możemy myśleć o prognozach szeregów czasowych jako regresji, która również uwzględnia autokorelację.
Dla tej dyskusji rozważmy „Zbiór danych dotyczących zużycia energii elektrycznej przez pojedyncze gospodarstwo domowe”, który jest danymi zebranymi z jednego gospodarstwa domowego przez cztery lata w odstępach jednominutowych. Weźmy pod uwagę tylko trzy pola, a zbiór danych będzie wyglądał następująco.
Pierwszym pytaniem jest, jak zmierzyć sukces? Robimy to za pomocą funkcji straty, gdzie próbujemy zminimalizować funkcję straty. Funkcji straty jest kilka i mają one różne wady i zalety.
- MAE ( Mean absolute error) – tutaj wszystkie błędy, duże i małe, są traktowane jednakowo
- Root Mean Square Error (RMSE) – penalizuje ona duże błędy ze względu na człon kwadratowy. Na przykład, z błędami i , MSE dla obu będzie 0.5, podczas gdy RMSE wynosi 0.5 i. 0.45.
- MAPE ( Mean Absolute Percentage Error) – Ponieważ #1 i #2 zależą od zakresu wartości zmiennej docelowej, nie mogą być porównywane między zbiorami danych. W przeciwieństwie do tego, MAPE jest wartością procentową, a więc względną. To jest jak dokładność w problemie klasyfikacji, gdzie każdy wie, że 99% dokładności jest całkiem dobra.
- RMSEP ( Root Mean Square Percentage Error) – Jest to hybryda między # 2 i # 3.
- Almost correct Predictions Error rate (AC_errorRate) – procent przewidywań, które są w %p procentach od prawdziwej wartości
Jeśli próbujemy przewidzieć następną wartość, mamy kilka opcji do wyboru.
Złotym standardem dla tego typu problemów jest model ARIMA. Podstawową ideą ARIMA jest rozbicie szeregu czasowego na różne składniki, takie jak składnik trendu, składnik sezonowości itp. i staranne oszacowanie modelu dla każdego składnika. Zobacz Using R for Time Series Analysis dla dobrego przeglądu.
Jednakże, ARIMA ma niefortunny problem. Potrzebuje eksperta (dobry stopień statystyczny lub studenta), aby skalibrować parametry modelu. Jeśli chcesz zrobić wielowymiarową ARIMA, to jest czynnik w wielu polach, wtedy rzeczy stają się jeszcze trudniejsze.
Jednakże R ma funkcję o nazwie auto.arima, która szacuje parametry modelu dla ciebie. Wypróbowałem to.
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)
Możesz znaleźć szczegółową dyskusję na temat tego, jak zrobić ARIMA z linków podanych powyżej. Użyłem tylko 200k z zestawu danych, ponieważ skupiamy się na średniej wielkości zestawach danych. Dało to MAPE równe 19,5.
Cechy temporalne
Drugim podejściem jest wymyślenie listy cech, które uchwycą aspekty temporalne, tak aby informacje o autokorelacji nie zostały utracone. Na przykład, analiza techniczna rynku akcji wykorzystuje cechy zbudowane przy użyciu średnich kroczących. W prostym przypadku, analityk będzie śledził 7-dniowe i 21-dniowe średnie kroczące i podejmował decyzje w oparciu o punkty przecięcia między tymi wartościami.
Następujące są niektóre pomysły cech
- kolekcja średnich kroczących/median (np.np. 7, 14, 30, 90 dni)
- Czas od pewnego wydarzenia
- Czas pomiędzy dwoma wydarzeniami
- Matematyczne miary takie jak Entropia, Z-scores itp.
- X(t) podniesiony do funkcji takich jak power(X(t),n), cos((X(t)/k)) etc
Częstą sztuczką, której ludzie używają jest zastosowanie tych cech z technikami takimi jak Random Forest i Gradient Boosting, które mogą zapewnić względne znaczenie cech. Możemy użyć tych danych, aby zachować dobre cechy i upuścić nieefektywne cechy.
Nie będę się rozwodził zbyt długo nad tym tematem. Jednakże, przy odrobinie ciężkiej pracy, metoda ta daje bardzo dobre rezultaty. Na przykład, większość konkursów wygrywa się używając tej metody (np. http://blog.kaggle.com/2016/02/03/rossmann-store-sales-winners-interview-2nd-place-nima-shahbazi /).
Minusem jest jednak to, że tworzenie cech jest czarną sztuką. Potrzeba dużo pracy i doświadczenia, aby stworzyć cechy.
Rolling Windows-based Regression
Teraz doszliśmy do interesującej części. Wygląda na to, że istnieje inna metoda, która daje całkiem dobre wyniki bez dużego nakładu pracy.
Pomysł jest taki, że aby przewidzieć X(t+1), następną wartość w szeregu czasowym, podajemy do modelu nie tylko X(t), ale także X(t-1), X(t-2) itd. Podobny pomysł został omówiony w Rolling Analysis of Time Series, chociaż jest on używany do rozwiązania innego problemu.
Przyjrzyjrzyjmy się przykładowi. Załóżmy, że musimy przewidzieć x(t+1) biorąc pod uwagę X(t). Wówczas zmienne źródłowe i docelowe będą wyglądały następująco.
Zbiór danych po przekształceniu z kroczącym oknem trójkowym wyglądałby następująco.
Następnie użyjemy przekształconego zbioru danych z dobrze znanym algorytmem regresji, takim jak regresja liniowa i regresja Random Forest. Oczekujemy, że algorytm regresji określi współczynniki autokorelacji z X(t-2) do X(t).
Na przykład, z powyższym zestawem danych, zastosowanie regresji liniowej na przekształconym zestawie danych przy użyciu kroczącego okna 14 punktów danych dało następujące wyniki. Tutaj AC_errorRate uważa prognozę za poprawną, jeśli mieści się ona w granicach 10% rzeczywistej wartości.
LR AC_errorRate=44.0 RMSEP=29.4632 MAPE=13.3814 RMSE=0.261307
Jest to całkiem interesujące, ponieważ bije to auto ARIMA na głowę (MAPE 0.19 vs 0.13 z kroczącym oknem).
Więc do tej pory próbowaliśmy tylko regresji liniowej. Następnie wypróbowałem kilka innych metod, a wyniki są podane poniżej.
Regresja liniowa nadal radzi sobie całkiem dobrze, jednak jest słaba w utrzymywaniu stopy błędu w granicach 10%. Deep learning jest lepszy w tym aspekcie, jednak wymagał poważnego tuningu. Proszę zauważyć, że testy są wykonywane z 200k punktów danych, ponieważ skupiam się głównie na małych zbiorach danych.
Najlepsze wyniki uzyskałem z sieci neuronowej z 2 warstwami ukrytymi o rozmiarze 20 jednostek w każdej warstwie z zerowym dropoutem lub regularnością, funkcją aktywacji „relu” i optymalizatorem Adam(lr=0.001) działającym przez 500 epok. Sieć została zaimplementowana za pomocą Keras. Podczas dostrajania, znalazłem artykuły i całkiem przydatne.
Potem wypróbowałem ten sam pomysł z kilkoma innymi zestawami danych.
- Milk production Dataset ( małe < 200 punktów danych)
- Bike sharing Dataset (około 18 000 punktów danych)
- USD to Euro Exchange rate ( około 6500 punktów danych)
- Apple Stocks Prices (około 13000 punktów danych)
Prognozy są wykonywane jako jednozmienny szereg czasowy. To znaczy, że bierzemy pod uwagę tylko znaczniki czasu i wartość, którą prognozujemy. Każda brakująca wartość jest imputowana przy użyciu paddingu (używając najbardziej aktualnej wartości). Dla wszystkich testów, użyliśmy okna o rozmiarze 14 jako okna kroczącego.
Następujące tabele pokazują wyniki. Tutaj z wyjątkiem Auto.Arima, inne metody używające kroczącego okna bazują na zestawie danych.
Nie ma wyraźnego zwycięzcy. Jednak omówiona przez nas metoda okna kroczącego w połączeniu z algorytmem regresji wydaje się działać całkiem dobrze.
Podsumowanie
Przedyskutowaliśmy trzy metody: ARIMA, Using Features to represent time effects, and Rolling windows do wykonywania prognoz wartości następnych szeregów czasowych przy średniej wielkości zbiorach danych.
Pośród tych trzech metod, trzecia zapewnia dobre wyniki porównywalne z modelem auto ARIMA, chociaż wymaga minimalnej obsługi przez użytkownika końcowego.
Więc uważamy, że „Regresja oparta na Rolling Window” jest użytecznym dodatkiem do worka sztuczek prognozującego!
Nie dyskredytuje to jednak modelu ARIMA, ponieważ przy dostrojeniu przez eksperta, będzie on radził sobie znacznie lepiej. W tym samym czasie, z ręcznie stworzonymi cechami, metody dwa i trzy również będą radzić sobie lepiej.
Jedną z kluczowych kwestii jest wybór rozmiaru okna dla metody okna kroczącego. Często możemy uzyskać dobry pomysł z domeny. Użytkownik może również wykonać wyszukiwanie parametrów na temat rozmiaru okna.
Następnie jest kilka rzeczy, które wymagają dalszej eksploracji.
- Czy możemy użyć RNN i CNN? Próbowałem RNN, ale nie mogłem uzyskać dobrych wyników do tej pory.
- Może być przydatne do podawania innych cech, takich jak czas dnia, dzień tygodnia, a także średnie ruchome z różnych okien czasowych.
- Przegląd algorytmów optymalizacji zejścia gradientowego
- CS231n Convolutional Neural Networks for Visual Recognition
Jeśli podobał Ci się ten post, możesz również znaleźć następujące interesujące.
- Introduction to Anomaly Detection: Concepts and Techniques
- Chronicle of Big Data: A Technical Comedy
Sprawdź również niektóre z moich najczęściej czytanych postów i moich rozmów (wideo). Porozmawiaj ze mną na @srinath_perera lub znajdź mnie.