Givet en tidsserie är det ett problem som fascinerat många programmerare under lång tid att förutsäga nästa värde. En viktig orsak till denna uppmärksamhet är naturligtvis aktiemarknaderna, som lovade otaliga rikedomar om man kunde knäcka dem. Med undantag för ett fåtal (se En sällsynt intervju med matematikern som knäckte Wall Street) har dessa rikedomar dock visat sig vara svårfångade.
Tack vare IoT (Internet of Things) är tidsserieanalysen på väg att komma tillbaka i rampljuset. IoT gör det möjligt att placera sensorer överallt, samla in data och agera på dessa data. IoT-enheter samlar in data över tiden och de resulterande uppgifterna är nästan alltid tidsseriedata.
Följande är några användningsområden för tidsserieförutsägelser.
- Förutsägelse av elbelastning
- Förutsägelse av efterfrågan för detaljhandelsbutiker
- Tjänster (t.ex. flygbolagens incheckningsdiskar, myndighetskontor) kundprognoser
- Inkomstprognoser
- Vitalövervakning av intensivvård
- Vidarexploatering och skördeprognoser
Låt oss utforska de tekniker som finns tillgängliga för tidsserieprognoser.
Den första frågan är att ”är det inte regressionen?”. Det är nära, men inte samma sak som regression. I en tidsserie påverkas varje värde av de värden som ligger precis före detta värde. Om det till exempel är mycket trafik klockan 4.55 i en korsning är chansen stor att det också är en del trafik klockan 4.56. Detta kallas autokorrelation. Om du gör en regression tar du bara hänsyn till x(t), medan x(t-1), x(t-2), … på grund av autokorrelation också kommer att påverka resultatet. Så vi kan tänka oss tidsserieprognoser som regression som också tar hänsyn till autokorrelation.
För den här diskussionen kan vi betrakta ”Individual household electric power consumption Data Set”, som är data som samlats in från ett hushåll under fyra år i enminutersintervaller. Vi tar bara hänsyn till tre fält, och datasetet kommer att se ut på följande sätt.
Den första frågan handlar om hur vi ska mäta framgång? Vi gör detta via en förlustfunktion, där vi försöker minimera förlustfunktionen. Det finns flera förlustfunktioner och de har olika för- och nackdelar.
- MAE ( Mean absolute error) – här behandlas alla fel, stora som små, lika
- Root Mean Square Error (RMSE) – här bestraffas stora fel på grund av den kvadrerade termen. Till exempel, med fel och , kommer MSE för båda att vara 0,5 medan RMSE är 0,5 och. 0,45.
- MAPE ( Mean Absolute Percentage Error) – Eftersom nr 1 och 2 beror på målvariabelns värdeintervall kan de inte jämföras mellan olika dataset. MAPE är däremot ett procenttal och därmed relativt. Det är som noggrannhet i ett klassificeringsproblem, där alla vet att 99 % noggrannhet är ganska bra.
- RMSEP ( Root Mean Square Percentage Error) – Detta är en hybrid mellan #2 och #3.
- Almost correct Predictions Error rate (AC_errorRate) – den procentuella andelen förutsägelser som ligger inom %p procent av det sanna värdet
Om vi försöker prognostisera nästa värde har vi flera valmöjligheter.
Guldmåttet för den här typen av problem är ARIMA-modellen. Kärnidén bakom ARIMA är att dela upp tidsserien i olika komponenter, t.ex. trendkomponent, säsongskomponent osv. och noggrant uppskatta en modell för varje komponent. Se Using R for Time Series Analysis för en bra översikt.
ARIMA har dock ett olyckligt problem. Den behöver en expert ( en bra statistikexamen eller en doktorand) för att kalibrera modellparametrarna. Om du vill göra multivariat ARIMA, det vill säga ta hänsyn till flera fält, blir det ännu svårare.
Hur som helst har R en funktion som heter auto.arima, som skattar modellparametrar åt dig. Jag provade den.
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)
Detaljdiskussioner om hur man gör ARIMA finns i de länkar som anges ovan. Jag använde bara 200k från datasetet eftersom vårt fokus är medelstora dataset. Det gav en MAPE på 19,5.
Temporala funktioner
Det andra tillvägagångssättet är att ta fram en lista över funktioner som fångar de temporala aspekterna så att autokorrelationsinformationen inte går förlorad. Den tekniska analysen av aktiemarknaden använder till exempel funktioner som byggs upp med hjälp av glidande medelvärden. I det enkla fallet kommer en analytiker att spåra 7-dagars och 21-dagars glidande medelvärden och fatta beslut baserat på övergångspunkter mellan dessa värden.
Följande är några funktionsidéer
- Samling av glidande medelvärden/medianer(e.t.ex. 7, 14, 30, 90 dagar)
- Tid sedan en viss händelse
- Tid mellan två händelser
- Matematiska mått som entropi, Z-poäng osv.
- X(t) upphöjt till funktioner som power(X(t),n), cos((X(t)/k)) etc
Varje trick som folk använder är att tillämpa dessa funktioner med tekniker som Random Forest och Gradient Boosting, som kan ge den relativa betydelsen av funktioner. Vi kan använda dessa data för att behålla bra funktioner och släppa ineffektiva funktioner.
Jag kommer inte att ägna alltför mycket tid åt detta ämne. Med lite hårt arbete har dock denna metod visat sig ge mycket goda resultat. Till exempel vinns de flesta tävlingar med denna metod (t.ex. http://blog.kaggle.com/2016/02/03/rossmann-store-sales-winners-interview-2nd-place-nima-shahbazi /).
Nackdelen är dock att det är en svart konst att skapa funktioner. Det krävs mycket arbete och erfarenhet för att skapa funktionerna.
Rolling Windows-based Regression
Nu har vi kommit till den intressanta delen. Det verkar som om det finns en annan metod som ger ganska bra resultat utan en massa handpåläggning.
Idén är att för att förutsäga X(t+1), nästa värde i en tidsserie, matar vi inte bara X(t), utan även X(t-1), X(t-2) etc. till modellen. En liknande idé har diskuterats i Rolling Analysis of Time Series även om den används för att lösa ett annat problem.
Låt oss titta på ett exempel. Låt oss säga att vi behöver förutsäga x(t+1) givet X(t). Då kommer käll- och målvariablerna att se ut på följande sätt:
Dataset skulle se ut på följande sätt efter att ha transformerats med rullande fönster på tre.
Den linjära regressionen klarar sig fortfarande ganska bra, men den är svag när det gäller att hålla felprocenten inom 10 %. Djupinlärning är bättre på den aspekten, men krävde dock en del seriös inställning. Observera att testerna görs med 200 000 datapunkter eftersom mitt huvudfokus ligger på små datamängder.
Jag fick de bästa resultaten från ett neuralt nätverk med 2 dolda lager med en storlek på 20 enheter i varje lager med noll dropouts eller regularisering, aktiveringsfunktionen ”relu” och optimeraren Adam(lr=0,001) som körs i 500 epoker. Nätverket är implementerat med Keras. Under inställningen hittade jag artiklar och ganska användbara.
Därefter provade jag samma idé med några fler dataset.
- Mjölkproduktion Dataset ( liten < 200 datapunkter)
- Cykeldelning Dataset (ca 18000 datapunkter)
- USD till Euro växelkurs ( ca 6500 datapunkter)
- Apple Stocks priser (ca 13000 datapunkter)
Förväntningarna görs som univariata tidsserier. Det vill säga vi tar endast hänsyn till tidpunkter och det värde vi prognostiserar. Eventuella saknade värden imputeras med hjälp av utfyllnad (genom att använda det senaste värdet). För alla tester använde vi ett fönster av storlek 14 för som rullande fönster.
Följande tabeller visar resultaten. Med undantag för Auto.Arima använder andra metoder en rullande fönsterbaserad datamängd.
Det finns ingen klar vinnare. Men metoden med rullande fönster som vi diskuterade i kombination med en regressionsalgoritm verkar fungera ganska bra.
Slutsats
Vi diskuterade tre metoder: ARIMA, Using Features to represent time effects, and Rolling windows to do time series next value forecasts with medium size datasets.
Av de tre ger den tredje metoden goda resultat som är jämförbara med den automatiska ARIMA-modellen, även om den kräver minimal handledning av slutanvändaren.
Därmed anser vi att ”Rolling Window based Regression” är ett användbart tillägg till prognosmakarens trickkorg!
Detta misskrediterar dock inte ARIMA, eftersom den med expertinställning kommer att prestera mycket bättre. Samtidigt kommer metoderna två och tre med hantverksmässiga egenskaper också att göra bättre ifrån sig.
Ett avgörande övervägande är att välja storleken på fönstret för rolling window-metoden. Ofta kan vi få en bra idé från domänen. Användaren kan också göra en parametersökning på fönsterstorleken.
Följande är några saker som behöver undersökas ytterligare.
- Kan vi använda RNN och CNN? Jag försökte RNN, men kunde inte få bra resultat hittills.
- Det kan vara användbart att mata in andra funktioner, t.ex. tid på dagen, veckodag och även glidande medelvärden för olika tidsfönster.
- En översikt över gradient descent optimeringsalgoritmer
- CS231n Convolutional Neural Networks for Visual Recognition
Om du gillade det här inlägget kanske du också tycker att följande är intressant.
- Introduction to Anomaly Detection: Koncept och tekniker
- Chronicle of Big Data: En teknisk komedi
Se också några av mina mest lästa inlägg och mina föredrag (videor). Prata med mig på @srinath_perera eller hitta mig.