Adott egy idősor, a következő érték előrejelzése olyan probléma, amely sok programozót hosszú ideig lenyűgözött. Nyilvánvalóan a figyelem egyik fő oka a tőzsdék, amelyek mérhetetlen gazdagságot ígértek, ha sikerül feltörni. Azonban kevesek kivételével (lásd: Egy ritka interjú a matematikussal, aki feltörte a Wall Streetet), ezek a gazdagságok elérhetetlennek bizonyultak.
Az IoT-nek (Internet of Things) köszönhetően az idősorelemzés ismét reflektorfénybe kerülhet. Az IoT lehetővé teszi, hogy mindenhol elhelyezzünk mindenütt jelenlévő érzékelőket, adatokat gyűjtsünk, és az adatok alapján cselekedjünk. Az IoT-eszközök időben gyűjtenek adatokat, és az így kapott adatok szinte mindig idősoros adatok.
A következőkben néhány felhasználási esetet mutatunk be az idősoros előrejelzésre.
- Elégterhelés előrejelzése
- Kereskedelmi üzletek keresletének előrejelzése
- Szolgáltatások (pl. légitársaságok check-in pultjai, kormányhivatalok) ügyfél-előrejelzés
- Bevétel-előrejelzés
- Intenzív ápolás létfontosságú monitorozása
- Hozam- és termés-előrejelzés
Vizsgáljuk meg az idősor-előrejelzéshez rendelkezésre álló technikákat.
Az első kérdés az, hogy “nem a regresszió?”. Közel áll hozzá, de nem azonos a regresszióval. Egy idősorozatban minden egyes értékre hatással vannak az ezt az értéket közvetlenül megelőző értékek. Például, ha egy csomópontban 4.55-kor nagy a forgalom, akkor nagy valószínűséggel 4.56-kor is lesz forgalom. Ezt nevezzük autokorrelációnak. Ha regressziót végez, akkor csak az x(t) értéket veszi figyelembe, míg az autokorreláció miatt az x(t-1), x(t-2), … is befolyásolja az eredményt. Tehát az idősor-előrejelzésekre úgy is gondolhatunk, mint regresszióra, amely az autokorrelációt is figyelembe veszi.
Ezzel a vitával kapcsolatban tekintsük az “Egyéni háztartások elektromos áramfogyasztási adatsorát”, amely egy háztartásból négy éven keresztül egyperces időközönként gyűjtött adatok. Csak három mezőt vegyünk figyelembe, és az adathalmaz a következőképpen fog kinézni.
Az első kérdés az, hogy hogyan mérjük a sikert? Ezt egy veszteségfüggvényen keresztül tesszük, ahol a veszteségfüggvényt próbáljuk minimalizálni. Többféle veszteségfüggvény létezik, és ezek különböző előnyökkel és hátrányokkal rendelkeznek.
- MAE ( Mean absolute error) – itt minden hibát, kicsiket és nagyokat egyformán kezelünk
- Root Mean Square Error (RMSE) – ez a nagy hibákat bünteti a négyzetes kifejezés miatt. Például hibákkal és , az MSE mindkettőnél 0,5 lesz, míg az RMSE 0,5 és. 0,45.
- MAPE ( Mean Absolute Percentage Error) – Mivel az #1 és a #2 a célváltozó értéktartományától függ, nem lehet összehasonlítani az adathalmazok között. Ezzel szemben a MAPE százalékos, tehát relatív. Olyan, mint a pontosság egy osztályozási problémában, ahol mindenki tudja, hogy a 99%-os pontosság elég jó.
- RMSEP ( Root Mean Square Percentage Error) – Ez egy hibrid a #2 és a #3 között.
- Majdnem helyes előrejelzések hibaaránya (AC_errorRate) – azon előrejelzések százalékos aránya, amelyek %p százalékon belül vannak a valós értékhez képest
Ha a következő értéket próbáljuk megjósolni, több lehetőségünk is van.
A gold standard az ilyen jellegű problémákra az ARIMA modell. Az ARIMA lényege, hogy az idősorokat különböző összetevőkre, például trendkomponensre, szezonalitáskomponensre stb. bontjuk, és minden egyes komponensre gondosan becslünk egy modellt. Lásd: Using R for Time Series Analysis egy jó áttekintésért.
Az ARIMA-nak azonban van egy sajnálatos problémája. A modell paramétereinek kalibrálásához szakértőre ( jó statisztikai diplomára vagy végzős hallgatóra) van szükség. Ha többváltozós ARIMA-t akarunk csinálni, azaz több mezőt is figyelembe akarunk venni, akkor a dolgok még nehezebbé válnak.
Az R-nek azonban van egy auto.arima nevű függvénye, amely becsli a modell paramétereit helyettünk. Ezt kipróbáltam.
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)
A fenti linkeken részletes tárgyalást találsz arról, hogyan kell ARIMA-t csinálni. Én csak 200k-t használtam az adathalmazból, mivel a hangsúlyt a közepes méretű adathalmazokra helyezzük. Ez 19,5 MAPE-t adott.
Temporális jellemzők
A második megközelítés az, hogy olyan jellemzők listájával állunk elő, amely megragadja az időbeli szempontokat, hogy az autokorrelációs információ ne vesszen el. A tőzsdei technikai elemzés például mozgóátlagok segítségével felépített jellemzőket használ. Egyszerű esetben az elemző nyomon követi a 7 napos és a 21 napos mozgóátlagokat, és az ezen értékek közötti keresztezési pontok alapján hoz döntéseket.
A következőkben néhány jellemzőötlet
- mozgóátlagok/mediánok gyűjtése(e.pl. 7, 14, 30, 90 nap)
- Egy bizonyos esemény óta eltelt idő
- Két esemény közötti idő
- Matematikai mértékek, például entrópia, Z-értékek stb.
- X(t) függvényekre emelve, mint például power(X(t),n), cos((X(t)/k)) stb
Az emberek általánosan használt trükk, hogy ezeket a jellemzőket olyan technikákkal alkalmazzák, mint a Random Forest és a Gradient Boosting, amelyek képesek megadni a jellemző relatív fontosságát. Ezeket az adatokat felhasználhatjuk a jó jellemzők megtartására és a nem hatékony jellemzők elhagyására.
Nem fogok túl sokat időzni ezen a témán. Azonban némi kemény munkával ez a módszer nagyon jó eredményeket mutat. Például a legtöbb versenyt ezzel a módszerrel nyerik meg (pl. http://blog.kaggle.com/2016/02/03/rossmann-store-sales-winners-interview-2nd-place-nima-shahbazi /).
A hátránya azonban az, hogy a jellemzők megalkotása fekete művészet. Sok munkára és tapasztalatra van szükség a jellemzők megalkotásához.
Rolling Windows-based Regression
Most eljutottunk az érdekes részhez. Úgy tűnik, van egy másik módszer, amely sok kézügyesség nélkül is elég jó eredményeket ad.
Az ötlet az, hogy az X(t+1), egy idősor következő értékének előrejelzéséhez nem csak X(t), hanem X(t-1), X(t-2) stb. értékeket is betáplálunk a modellbe. Hasonló ötletet tárgyaltak már az Idősorok gördülő elemzése című könyvben, bár más probléma megoldására használják.
Nézzünk egy példát. Tegyük fel, hogy x(t+1)-t kell megjósolnunk X(t)-ből kiindulva. Ekkor a forrás- és célváltozók a következőképpen néznek ki.
Az adatállomány a három gördülő ablakkal történő transzformálás után a következőképpen nézne ki.
A transzformált adathalmazt ezután egy jól ismert regressziós algoritmussal, például lineáris regresszióval és Random Forest regresszióval használjuk. Az elvárás az, hogy a regressziós algoritmus kitalálja az autokorrelációs együtthatókat X(t-2) és X(t) között.
A fenti adatkészlet esetében például a lineáris regresszió alkalmazása a transzformált adatkészletre egy 14 adatpontból álló gördülő ablak segítségével a következő eredményeket adta. Itt az AC_errorRate akkor tekinti helyesnek az előrejelzést, ha az a tényleges érték 10%-án belül van.
LR AC_errorRate=44.0 RMSEP=29.4632 MAPE=13.3814 RMSE=0.261307
Ez elég érdekes, mivel ez jobb úton veri az auto ARIMA-t ( MAPE 0,19 vs. 0,13 gördülő ablakokkal).
Ezért eddig csak a Lineáris regressziót próbáltuk ki. Ezután több más módszert is kipróbáltam, az eredmények alább olvashatók.
A lineáris regresszió még mindig elég jól teljesít, azonban a hibaarány 10%-on belül tartásában gyenge. A mélytanulás jobb ebből a szempontból, azonban komoly tuningot igényelt. Megjegyzendő, hogy a teszteket 200k adatponttal végeztem, mivel a fő hangsúlyt a kis adathalmazokra helyeztem.
A legjobb eredményeket egy neurális hálózattal kaptam, amely 2 rejtett réteggel rendelkezik, minden rétegben 20 egység méretű, nulla kieséssel vagy regularizációval, “relu” aktiválási függvénnyel és Adam(lr=0.001) optimalizálóval, amely 500 epochán keresztül fut. A hálózatot Keras programmal implementáltuk. A tuning során találtam cikkeket és elég hasznos.
Aztán kipróbáltam ugyanezt az ötletet néhány további adatkészlettel.
- Tejtermelés adathalmaz ( kis < 200 adatpont)
- Bike sharing Dataset (kb. 18,000 adatpont)
- USD to Euro Exchange rate ( kb. 6500 adatpont)
- Apple Stocks Prices (kb. 13000 adatpont)
Az előrejelzések egyváltozós idősorokként készültek. Vagyis csak az időbélyegeket és az általunk előrejelzett értéket vesszük figyelembe. Minden hiányzó értéket kitöltéssel imputálunk ( a legfrissebb értéket használva). Minden teszthez 14-es méretű ablakot használtunk gördülő ablakként.
A következő táblázatok mutatják az eredményeket. Itt az Auto.Arima kivételével a többi módszer gördülő ablak alapú adathalmazt használ.
Nincs egyértelmű győztes. Azonban az általunk tárgyalt gördülő ablak módszer egy regressziós algoritmussal párosítva úgy tűnik, elég jól működik.
Következtetés
Három módszert tárgyaltunk: A három módszer közül a harmadik módszer az automatikus ARIMA-modellel összehasonlítható jó eredményeket ad, bár minimális kézügyességet igényel a végfelhasználótól.
Ezért úgy gondoljuk, hogy a “gördülő ablak alapú regresszió” hasznos kiegészítője az előrejelző trükktárának!
Ez azonban nem diszkreditálja az ARIMA-t, mivel szakértői hangolással sokkal jobban teljesít. Ugyanakkor kézzel készített jellemzőkkel a kettes és hármas módszer is jobban fog teljesíteni.
Az egyik lényeges szempont a gördülőablakos módszer esetében az ablak méretének kiválasztása. Gyakran jó ötletet kaphatunk a tartományból. A felhasználó is végezhet paraméterkeresést az ablakméretre vonatkozóan.
A következő néhány dolog további vizsgálatot igényel.
- Használhatunk RNN-t és CNN-t? Kipróbáltam az RNN-t, de eddig nem tudtam jó eredményeket elérni.
- Szükséges lehet más jellemzők, például a napszak, a hét napja, valamint a különböző időablakok mozgó átlagainak betáplálása.
- An overview of gradient descent optimization algorithms
- CS231n Convolutional Neural Networks for Visual Recognition
If you liked this post you might also find following interesting.
- Introduction to Anomaly Detection: Concepts and Techniques
- Chronicle of Big Data: A Technical Comedy
Szintén nézd meg a legolvasottabb bejegyzéseimet és előadásaimat (videók). Beszélj velem a @srinath_perera címen, vagy keress meg.