Gegeven aan een tijdreeks, is het voorspellen van de volgende waarde een probleem dat veel programmeurs lange tijd heeft gefascineerd. Een belangrijke reden voor deze aandacht zijn uiteraard de aandelenmarkten, die onnoemelijke rijkdom beloofden als je ze kon kraken. Maar op een enkeling na (zie Een zeldzaam interview met de wiskundige die Wall Street kraakte), is die rijkdom ongrijpbaar gebleken.
Dankzij het IoT (Internet of Things) staat tijdreeksanalyse op het punt om weer in de schijnwerpers te komen. IoT laat ons overal alomtegenwoordige sensoren plaatsen, gegevens verzamelen en op basis van die gegevens handelen. IoT-apparaten verzamelen gegevens door de tijd heen en de resulterende gegevens zijn bijna altijd tijdreeksgegevens.
Volgende zijn enkele use-cases voor tijdreeksvoorspelling.
- Voorspelling van stroombelasting
- Voorspelling van de vraag voor detailhandels
- Diensten (bijv. luchtvaartmaatschappij check-in balies, overheidskantoren) klantvoorspelling
- Opbrengstvoorspellingen
- ICU-zorg vitale monitoring
- Opbrengst- en gewasvoorspelling
Laten we de technieken verkennen die beschikbaar zijn voor tijdreeksvoorspellingen.
De eerste vraag is: “is het niet de regressie?”. Het is dichtbij, maar niet hetzelfde als regressie. In een tijdreeks wordt elke waarde beïnvloed door de waarden die net aan deze waarde voorafgaan. Als er bijvoorbeeld om 4.55 uur veel verkeer is op een kruispunt, is de kans groot dat er om 4.56 uur ook wat verkeer zal zijn. Dit wordt autocorrelatie genoemd. Als je regressie doet, zal je enkel x(t) beschouwen, terwijl door autocorrelatie ook x(t-1), x(t-2), … de uitkomst zullen beïnvloeden. We kunnen tijdreeksvoorspellingen dus beschouwen als regressie waarin ook autocorrelatie een rol speelt.
Voor deze discussie beschouwen we de “Individual household electric power consumption data set”, dat wil zeggen gegevens die gedurende vier jaar van één huishouden zijn verzameld met intervallen van één minuut. Laten we slechts drie velden in aanmerking nemen, en de dataset zal er als volgt uitzien.
De eerste vraag is hoe meten we succes? Dat doen we via een verliesfunctie, waarbij we proberen de verliesfunctie te minimaliseren. Er zijn verschillende verliesfuncties, en ze hebben verschillende voor- en nadelen.
- MAE ( Mean absolute error) – hier worden alle fouten, groot en klein, gelijk behandeld
- Root Mean Square Error (RMSE) – dit straft grote fouten af door de kwadratische term. Bijvoorbeeld, met fouten en , zal MSE voor beide 0,5 zijn terwijl RMSE is 0,5 en. 0.45.
- MAPE ( Mean Absolute Percentage Error) – Aangezien #1 en #2 afhankelijk zijn van het waardebereik van de doelvariabele, kunnen ze niet vergeleken worden tussen datasets. MAPE daarentegen is een percentage, dus relatief. Het is zoals nauwkeurigheid in een classificatieprobleem, waarvan iedereen weet dat 99% nauwkeurigheid vrij goed is.
- RMSEP ( Root Mean Square Percentage Error) – Dit is een hybride tussen #2 en #3.
- Bijna juiste voorspellingen Foutpercentage (AC_errorRate) – het percentage voorspellingen dat binnen %p percentage van de werkelijke waarde ligt
Als we proberen de volgende waarde te voorspellen, hebben we verschillende keuzes.
De gouden standaard voor dit soort problemen is het ARIMA-model. Het kernidee achter ARIMA is de tijdreeks op te splitsen in verschillende componenten, zoals trendcomponent, seizoenscomponent enz. en voor elke component zorgvuldig een model te schatten. Zie Using R for Time Series Analysis voor een goed overzicht.
Echter, ARIMA heeft een ongelukkig probleem. Het heeft een expert nodig (een goede statisticus of een grad student) om de model parameters te calibreren. Als je multivariate ARIMA wilt doen, dat wil zeggen rekening houden met meerdere velden, dan wordt het nog moeilijker.
Echter, R heeft een functie genaamd auto.arima, die model parameters voor je schat. Ik heb dat uitgeprobeerd.
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)
U kunt een gedetailleerde bespreking van hoe ARIMA te doen vinden op de links hierboven gegeven. Ik heb alleen 200k van de dataset gebruikt omdat we ons richten op middelgrote datasets. Het gaf een MAPE van 19.5.
Temporal Features
De tweede benadering is om met een lijst van features te komen die de temporele aspecten vastlegt, zodat de autocorrelatie-informatie niet verloren gaat. De technische analyse van de aandelenmarkt maakt bijvoorbeeld gebruik van kenmerken die zijn opgebouwd uit voortschrijdende gemiddelden. In het eenvoudige geval zal een analist 7-daagse en 21-daagse voortschrijdende gemiddelden volgen en beslissingen nemen op basis van crossover punten tussen deze waarden.
Hierna volgen enkele feature ideeën
- verzameling van voortschrijdende gemiddelden / medianen (bijv.b.v. 7, 14, 30, 90 dagen)
- Tijd sinds een bepaalde gebeurtenis
- Tijd tussen twee gebeurtenissen
- Mathematische maatstaven zoals Entropie, Z-scores enz.
- X(t) verheven tot functies als macht(X(t),n), cos((X(t)/k)) enz
Gemeenschappelijke truc die mensen gebruiken is om die features toe te passen met technieken als Random Forest en Gradient Boosting, die het relatieve feature belang kunnen geven. We kunnen die gegevens gebruiken om goede features te behouden en ineffectieve features te laten vallen.
Ik zal niet te veel tijd besteden aan dit onderwerp. Met wat hard werken blijkt deze methode echter zeer goede resultaten op te leveren. Zo worden de meeste wedstrijden met deze methode gewonnen (b.v. http://blog.kaggle.com/2016/02/03/rossmann-store-sales-winners-interview-2nd-place-nima-shahbazi /).
Het nadeel is echter, dat het knutselen van features een zwarte kunst is. Het vergt veel werk en ervaring om de kenmerken te maken.
Rolling Windows-gebaseerde Regressie
Nu komen we bij het interessante deel. Het lijkt erop dat er een andere methode is die vrij goede resultaten geeft zonder veel hand-helding.
Idee is om X(t+1), de volgende waarde in een tijdreeks, te voorspellen, voeren we niet alleen X(t), maar X(t-1), X(t-2) enz. aan het model. Een soortgelijk idee is besproken in Rolling Analysis of Time Series, hoewel het wordt gebruikt om een ander probleem op te lossen.
Laten we eens naar een voorbeeld kijken. Laten we zeggen dat we x(t+1) moeten voorspellen gegeven X(t). Dan zien de bron- en doelvariabelen er als volgt uit.
Dataset zou er als volgt uitzien na transformatie met rollend venster van drie.
Daarna gaan we de getransformeerde dataset gebruiken met een bekend regressie-algoritme, zoals lineaire regressie en Random Forest Regressie. De verwachting is dat het regressiealgoritme de autocorrelatiecoëfficiënten van X(t-2) naar X(t) zal achterhalen.
Voorbeeld, met de bovenstaande gegevensreeks leverde de toepassing van lineaire regressie op de getransformeerde gegevensreeks met een voortschrijdend venster van 14 gegevenspunten de volgende resultaten op. Hier beschouwt AC_errorRate de voorspelling als correct als deze binnen 10% van de werkelijke waarde ligt.
LR AC_errorRate=44.0 RMSEP=29.4632 MAPE=13.3814 RMSE=0.261307
Dit is vrij interessant omdat dit de auto ARIMA juist verslaat ( MAPE 0.19 vs 0.13 met rolling windows).
Dus hebben we tot nu toe alleen Lineaire regressie geprobeerd. Daarna heb ik verschillende andere methoden uitgeprobeerd, en de resultaten staan hieronder.
Lineaire regressie doet het nog steeds vrij goed, maar het is zwak in het binnen 10% houden van de foutmarge. Deep learning is beter op dat aspect, maar vergde wel enige afstemming. Merk op dat tests zijn gedaan met 200k datapunten, aangezien mijn belangrijkste focus ligt op kleine datasets.
Ik kreeg de beste resultaten van een neuraal netwerk met 2 verborgen lagen van grootte 20 eenheden in elke laag met nul dropouts of regularisatie, activeringsfunctie “relu”, en optimizer Adam(lr=0.001) draaiend voor 500 epochs. Het netwerk is geïmplementeerd met Keras. Tijdens het afstemmen, vond ik artikelen en behoorlijk nuttig.
Toen probeerde ik hetzelfde idee uit met nog een paar datasets.
- Melkproductie Dataset ( kleine < 200 datapunten)
- Fiets delen Dataset (ongeveer 18.000 datapunten)
- USD naar Euro Wisselkoers ( ongeveer 6500 datapunten)
- Apple Stocks Prijzen (ongeveer 13000 datapunten)
Forecasts worden gedaan als univariate tijdreeksen. Dat wil zeggen dat we alleen rekening houden met tijdstempels en de waarde die we voorspellen. Elke ontbrekende waarde wordt toegerekend met behulp van padding (gebruikmakend van de meest recente waarde). Voor alle tests hebben wij een venster van grootte 14 gebruikt als voortschrijdend venster.
De volgende tabellen tonen de resultaten. Hier behalve voor Auto.Arima, andere methoden met behulp van een rollend venster op basis van gegevens set.
Er is geen duidelijke winnaar. De rolling window-methode die we hebben besproken in combinatie met een regressiealgoritme lijkt echter vrij goed te werken.
Conclusie
We hebben drie methoden besproken: ARIMA, Using Features to represent time effects, and Rolling windows to do time series next value forecasts with medium size datasets.
Van de drie levert de derde methode goede resultaten die vergelijkbaar zijn met auto ARIMA model, hoewel het minimale hand-holding nodig heeft door de eindgebruiker.
Daaruit menen wij dat “Regressie op basis van Rolling Window” een nuttige aanvulling is op de zak met trucs van de voorspeller.
Hiermee wordt ARIMA echter niet in diskrediet gebracht, want met deskundige afstemming zal het het veel beter doen. Tegelijkertijd zullen de methoden twee en drie, met handgemaakte kenmerken, het ook beter doen.
Een cruciale overweging is het kiezen van de grootte van het venster voor de rolling window-methode. Vaak kunnen we een goed idee krijgen van het domein. De gebruiker kan ook een parameteronderzoek doen naar de venstergrootte.
Volgende zijn enkele dingen die verder moeten worden onderzocht.
- Kunnen we RNN en CNN gebruiken? Ik probeerde RNN, maar kon niet krijgen goede resultaten tot nu toe.
- Het zou nuttig kunnen zijn om andere functies, zoals tijd van de dag, dag van de week, en ook voortschrijdende gemiddelden van verschillende tijdvensters te voeren.
- Een overzicht van gradient descent optimalisatie-algoritmen
- CS231n Convolutional Neural Networks for Visual Recognition
Als je dit bericht leuk vond, vind je het volgende misschien ook interessant.
- Inleiding tot Anomaly Detection: Concepts and Techniques
- Chronicle of Big Data: A Technical Comedy
Kijk ook eens naar een aantal van mijn meest gelezen posts en mijn talks (video’s). Praat met me op @srinath_perera of vind me.