Rolling Window Regression: En simpel metode til forudsigelser af næste værdi i tidsserier

Srinath Perera
Srinath Perera

Follow

3. juni, 2016 – 7 min read

Givet en tidsserie, er forudsigelse af den næste værdi et problem, der har fascineret mange programmører i lang tid. En vigtig årsag til denne opmærksomhed er naturligvis aktiemarkederne, som lovede uanede rigdomme, hvis man kunne knække dem. Men bortset fra få (se Et sjældent interview med matematikeren, der knækkede Wall Street) har disse rigdomme vist sig at være uopnåelige.

Takket være IoT (Internet of Things) er tidsserieanalyse klar til at komme tilbage i rampelyset. IoT giver os mulighed for at placere allestedsnærværende sensorer overalt, indsamle data og handle på disse data. IoT-enheder indsamler data gennem tiden, og de resulterende data er næsten altid tidsseriedata.

Følgende er nogle få anvendelsestilfælde for tidsserieprædiktion.

  1. Prædiktion af strømbelastning
  2. Prædiktion af efterspørgsel for detailbutikker
  3. Tjenester (f.eks. check-in skranker for flyselskaber, offentlige kontorer) kundeforudsigelse
  4. Indkomstprognoser
  5. Vitalovervågning af pleje på intensivafdelingen
  6. Vorudsigelse af udbytte og afgrøder

Lad os udforske de tilgængelige teknikker til tidsserieprognoser.

Det første spørgsmål er, at “er det ikke regressionen?”. Det er tæt på, men ikke det samme som regression. I en tidsserie påvirkes hver værdi af de værdier, der går lige forud for denne værdi. Hvis der f.eks. er meget trafik kl. 4.55 i et kryds, er der stor sandsynlighed for, at der også vil være en del trafik kl. 4.56. Dette kaldes autokorrelation. Hvis du foretager en regression, vil du kun tage hensyn til x(t), mens x(t-1), x(t-2), … på grund af autokorrelation også vil påvirke resultatet. Så vi kan tænke på tidsserieprognoser som regression, der også tager højde for autokorrelation.

I denne diskussion skal vi tage udgangspunkt i “Individual household electric power consumption Data Set”, som er data indsamlet fra en husstand over fire år i intervaller på et minut. Lad os kun overveje tre felter, og datasættet vil se ud som følger.

Det første spørgsmål er at spørge, hvordan vi måler succes? Det gør vi via en tabsfunktion, hvor vi forsøger at minimere tabsfunktionen. Der findes flere tabsfunktioner, og de er forskellige fordele og ulemper.

  1. MAE ( Mean absolute error) – her behandles alle fejl, store som små, ens
  2. Root Mean Square Error (RMSE) – her straffes store fejl på grund af det kvadrerede udtryk. For eksempel, med fejl og , vil MSE for begge være 0,5, mens RMSE er 0,5 og. 0,45.
  3. MAPE ( Mean Absolute Percentage Error) – Da #1 og #2 afhænger af målvariablens værdiinterval, kan de ikke sammenlignes på tværs af datasæt. I modsætning hertil er MAPE en procentdel, og dermed relativ. Det er ligesom nøjagtighed i et klassifikationsproblem, hvor alle ved, at 99 % nøjagtighed er ret godt.
  4. RMSEP ( Root Mean Square Percentage Error) – Dette er en hybrid mellem #2 og #3.
  5. Almost correct Predictions Error rate (AC_errorRate) – procentdelen af forudsigelser, der ligger inden for %p procentdel af den sande værdi

Hvis vi forsøger at forudsige den næste værdi, har vi flere valgmuligheder.

Guldstandarden for denne type problemer er ARIMA-modellen. Den centrale idé bag ARIMA er at opdele tidsserien i forskellige komponenter såsom trendkomponent, sæsonkomponent osv. og omhyggeligt estimere en model for hver komponent. Se Using R for Time Series Analysis for en god oversigt.

ARIMA har imidlertid et uheldigt problem. Den har brug for en ekspert ( en god statistikgrad eller en kandidatstuderende) til at kalibrere modelparametrene. Hvis man vil lave multivariat ARIMA, dvs. indregne flere felter, så bliver det endnu sværere.

Derimod har R en funktion kaldet auto.arima, som estimerer modelparametre for dig. Det har jeg prøvet.

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)

Du kan finde en detaljeret diskussion om hvordan man laver ARIMA fra de ovenstående links. Jeg brugte kun 200k fra datasættet, da vores fokus er mellemstore datasæt. Det gav en MAPE på 19,5.

Temporale funktioner

Den anden tilgang er at finde frem til en liste af funktioner, der fanger de tidsmæssige aspekter, så autokorrelationsoplysningerne ikke går tabt. For eksempel bruger den tekniske analyse af aktiemarkedet funktioner, der er opbygget ved hjælp af glidende gennemsnit. I det enkle tilfælde vil en analytiker spore 7-dages og 21-dages glidende gennemsnit og træffe beslutninger baseret på crossover-punkter mellem disse værdier.

Følgende er nogle ideer til funktioner

  1. Samling af glidende gennemsnit/medianer(e.f.eks. 7, 14, 30, 90 dage)
  2. Tid siden en bestemt begivenhed
  3. Tid mellem to begivenheder
  4. Matematiske mål som entropi, Z-scores osv.
  5. X(t) hævet til funktioner som f.eks. power(X(t),n), cos((X(t)/k)) osv.

Fælles trick, som folk bruger, er at anvende disse funktioner med teknikker som Random Forest og Gradient Boosting, der kan give den relative funktionsbetydning. Vi kan bruge disse data til at beholde gode funktioner og droppe ineffektive funktioner.

Jeg vil ikke dvæle for meget tid ved dette emne. Men med lidt hårdt arbejde har denne metode vist sig at give meget gode resultater. F.eks. er de fleste konkurrencer vundet ved hjælp af denne metode (f.eks. http://blog.kaggle.com/2016/02/03/rossmann-store-sales-winners-interview-2nd-place-nima-shahbazi /).

Ulempen er dog, at det er en sort kunst at udforme features. Det kræver meget arbejde og erfaring at udforme features.

Rulle Windows-baseret regression

Nu er vi nået til den interessante del. Det ser ud til, at der findes en anden metode, der giver ret gode resultater uden en masse håndarbejde.

Ideen er, at for at forudsige X(t+1), næste værdi i en tidsserie, fodrer vi ikke kun X(t), men også X(t-1), X(t-2) osv. til modellen. En lignende idé er blevet diskuteret i Rolling Analysis of Time Series, selv om den bruges til at løse et andet problem.

Lad os se på et eksempel. Lad os sige, at vi har brug for at forudsige x(t+1) givet X(t). Så vil kilde- og målvariablerne se ud som følgende.

Datasættet ville se ud som følgende efter transformeret med rullende vindue på tre.

Så vil vi bruge det transformerede datasæt med en velkendt regressionsalgoritme såsom lineær regression og Random Forest Regression. Forventningen er, at regressionsalgoritmen vil finde ud af autokorrelationskoefficienterne fra X(t-2) til X(t).

For eksempel med ovenstående datasæt gav anvendelsen af lineær regression på det transformerede datasæt ved hjælp af et rullende vindue på 14 datapunkter følgende resultater. Her anser AC_errorRate prognosen for at være korrekt, hvis den ligger inden for 10% af den faktiske værdi.

LR AC_errorRate=44.0 RMSEP=29.4632 MAPE=13.3814 RMSE=0.261307

Dette er ret interessant, da dette slår auto ARIMA højre vej ( MAPE 0.19 vs 0.13 med rullende vinduer).

Så vi har kun prøvet Lineær regression indtil videre. Derefter prøvede jeg flere andre metoder, og resultaterne er givet nedenfor.

Linær regression klarer sig stadig ret godt, men den er svag til at holde fejlprocenten inden for 10%. Deep learning er bedre på det aspekt, men krævede dog en del seriøs tuning. Bemærk venligst, at testene er udført med 200k datapunkter, da mit hovedfokus er på små datasæt.

Jeg fik de bedste resultater fra et neuralt netværk med 2 skjulte lag med en størrelse på 20 enheder i hvert lag med nul dropouts eller regularisering, aktiveringsfunktion “relu” og optimizer Adam(lr=0,001), der kører i 500 epochs. Netværket er implementeret med Keras. Mens jeg tunede, fandt jeg artikler og ret nyttige.

Derpå prøvede jeg den samme idé med nogle flere datasæt.

  1. Mælkeproduktion Dataset ( lille < 200 datapunkter)
  2. Cykel deling Dataset (ca. 18.000 datapunkter)
  3. USD til Euro Valutakurs ( ca. 6500 datapunkter)
  4. Apple Stocks Priser (ca. 13000 datapunkter)

Forecasts er udført som univariate tidsserier. Det vil sige, at vi kun tager hensyn til tidspunkterne og den værdi, vi forudsiger. Enhver manglende værdi imputeres ved hjælp af padding ( ved hjælp af den seneste værdi). For alle tests har vi brugt et vindue af størrelse 14 for som det rullende vindue.

Følgende tabeller viser resultaterne. Her bortset fra Auto.Arima bruger de andre metoder et rullende vindue baseret på datasæt.

Der er ingen klar vinder. Men den rullende vinduesmetode, som vi diskuterede, kombineret med en regressionsalgoritme ser ud til at fungere ret godt.

Slutning

Vi har diskuteret tre metoder: ARIMA, Brug af funktioner til at repræsentere tidseffekter og rullende vinduer til at lave tidsserieprognoser for næste værdi med mellemstore datasæt.

Men blandt de tre giver den tredje metode gode resultater, der kan sammenlignes med auto ARIMA-modellen, selv om den har brug for minimal håndtering af slutbrugeren.

Dermed mener vi, at “Rolling Window based Regression” er en nyttig tilføjelse til prognosetagerens tricktaske!

Dette miskrediterer dog ikke ARIMA, da den med eksperttuning vil klare sig meget bedre. Samtidig vil metoderne to og tre med håndværksmæssige egenskaber også klare sig bedre.

En afgørende overvejelse er at vælge størrelsen af vinduet for rullende vinduesmetode. Ofte kan vi få en god idé fra domænet. Brugeren kan også foretage en parametersøgning på vinduets størrelse.

Følgende er nogle få ting, der skal udforskes yderligere.

  • Kan vi bruge RNN og CNN? Jeg prøvede RNN, men kunne ikke få gode resultater indtil videre.
  • Det kunne være nyttigt at tilføre andre funktioner som f.eks. tidspunktet på dagen, ugedagen og også glidende gennemsnit af forskellige tidsvinduer.
  1. En oversigt over gradient descent optimeringsalgoritmer
  2. CS231n Convolutional Neural Networks for Visual Recognition

Hvis du nød dette indlæg, vil du måske også finde følgende interessant.

  • Introduktion til Anomaliedetektion: Koncepter og teknikker
  • Chronicle of Big Data: En teknisk komedie

Så kan du også tjekke nogle af mine mest læste indlæg og mine foredrag (videoer). Tal med mig på @srinath_perera eller find mig.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.