Fråga:
Använda k-kors-validering för val av tidsseriemodell
Mickaël S
2011-08-10 22:20:13 UTC
view on stackexchange narkive permalink

Fråga: Jag vill vara säker på något, är användningen av k-korsvalidering med tidsserier okomplicerad, eller behöver man ägna särskild uppmärksamhet innan man använder den?

Bakgrund: Jag modellerar en tidsserie på 6 år (med semi-markov-kedja), med ett dataprov var 5: e minut. För att jämföra flera modeller använder jag en sexfaldig korsvalidering genom att separera data på 6 år, så mina träningssatser (för att beräkna parametrarna) har en längd på 5 år och testuppsättningarna har en längd på 1 år. Jag tar inte hänsyn till tidsbeställningen, så mina olika uppsättningar är:

  • vik 1: träning [1 2 3 4 5], test [6]
  • vik 2: träning [1 2 3 4 6], test [5]
  • vik 3: träning [1 2 3 5 6], test [4]
  • vik 4: träning [1 2 4 5 6], test [3]
  • vik 5: träning [1 3 4 5 6], test [2]
  • veck 6: träning [2 3 4 5 6], test [1].

Jag antar hypotesen att varje år är oberoende av varandra. Hur kan jag verifiera det? Finns det någon referens som visar tillämpligheten av k-korsvalidering med tidsserier.

Ta en titt på den här artikeln, som jag tyckte var hjälpsam http://francescopochetti.com/pythonic-cross-validation-time-series-pandas-scikit-learn/
Fem svar:
Ken Williams
2011-08-10 23:39:28 UTC
view on stackexchange narkive permalink

Tidsserier (eller andra inneboende ordnade data) kan vara problematiska för korsvalidering. Om något mönster dyker upp under år 3 och stannar i åren 4-6 kan din modell ta upp det, även om det inte var en del av år 1 & 2.

En metod som ibland är mer principiell för tidsserier är framåtkedjning, där din procedur skulle vara ungefär så här:

  • fold 1: training [1], test [2]
  • fold 2: training [ 1 2], test [3]
  • vik 3: träning [1 2 3], test [4]
  • vik 4: träning [1 2 3 4], test [5 ]
  • vik 5: träning [1 2 3 4 5], test [6]

Det modellerar mer exakt den situation du ser vid förutsägelsestid, där du modellerar på tidigare data och förutsäger framåtblickande data. Det ger dig också en känsla av beroendet av din modellering av datastorlek.

Tack. Jag förstår, som Zach sa, det är det kanoniska sättet att göra det. Och jag förstår varför. Problemet jag har med det, det är precis det faktum att det kommer att ta hänsyn till variationen i datastorlek, så jag får inte det "sanna" generaliseringsfelet i min modell. Men ett blandat fel: generalisering och datastorlek. Känner du till några andra ref (andra än M.Hyndman) som handlar om korsvalidering i tidsserier? Missförstå mig inte, det är inte jag litar inte på vad du säger och vad M. Hyndman säger, det är helt meningsfullt. Jag gillar enkelt att ha flera synpunkter på ett problem
Jag är rädd att jag inte känner till en sådan referens, men jag skulle vara intresserad av att se en om någon annan känner till en sådan.
@Mickael: Vad menar du när du säger "variation av datastorlek"? Menar du att den här lösningen använder fler och fler års träningsdata vid varje veck? Eller pratar du om en trend (t.ex. år 5 har betydligt högre värden än år 1)?
@Wayne, Jag menar att den här lösningen använder fler och fler års träningsdata vid varje veck. I mina uppgifter finns det definitivt skillnader mellan år, men ingen uppenbar trend eller havssonalitet.
@Mickael: Du kan använda vik 1: tåg [1 2] test [3]; vik 2: tåg [2 3] test [4]; vik 3: träna [3 4] test [5], etc, om du är orolig för att använda mer och mer data för varje vik. Min gissning är att du med en semi-MC-teknik inte riktigt kan klättra runt, även om det inte finns någon trend.
@MickaëlS: Jag hittade det här dokumentet http://www.sciencedirect.com/science/article/pii/S0020025511006773 och trodde att det kunde vara av intresse. De jämför detta "kanoniska" tillvägagångssätt med två andra metoder - ett "block boostrap" och ett "utelämningsberoende" tillvägagångssätt.
Jag skulle tro att om du beräknar en slutlig genomsnittsnoggrannhet, skulle du vilja väga veck som använder mer data i enlighet därmed.Så om $ a_i $ är noggrannheten för $ i $ th veckan, som använder $ i $ grupper för träning, skulle du beräkna $ a = \ left (\ sum_ {i = 1} ^ 5 i \ cdot a_i\ höger) / \ vänster (\ sum_ {i = 1} ^ 5i \ höger).$ Är det vettigt?
Kan någon svara på varför varje träningssats växer i storlek?Skulle det inte ge mer träningsdata till senare veck, vilket ökar dess noggrannhet som påverkar resultaten?
@thistleknot - det beror på det.Ibland för att öka noggrannheten skulle du vilja gå tillbaka så långt som möjligt i historien för att få mer data, men ibland är gammal historia inte särskilt informativ eller till och med vilseledande om data inte är stationära.Svaret är generellt att försöka mäta denna effekt empiriskt och justera vilken träningsprocedur du har i enlighet med detta.
Jatin Garg
2017-03-21 15:00:40 UTC
view on stackexchange narkive permalink

Metoden jag använder för att korsvalidera min tidsseriemodell är korsvalidering löpande. Börja med en liten delmängd data för träningsändamål, prognos för de senare datapunkterna och kontrollera sedan noggrannheten för de prognostiserade datapunkterna. Samma prognostiserade datapunkter ingår sedan som en del av nästa träningsdataset och efterföljande datapunkter förutses.

För att göra saker intuitiva är här en bild för samma:

enter image description here

En motsvarande R-kod skulle vara:

  i <- 36 #### Börjar med 3 års månadsvis träningsdata
pred_ets <- c ()
pred_arima <- c ()
medan (i < = nrow (dt)) {
  ts <- ts (dt [1: i, "Belopp"], start = c (2001, 12), frekvens = 12)

  pred_ets <- rbind (pred_ets, data.frame (prognos (ets (ts), 3) $ betyder [1: 3]))
pred_arima <- rbind (pred_arima, data.frame (prognos (auto.arima (ts), 3) $ betyder [1: 3]))

  i = i + 3
}
namn (pred_arima) <- "arima"
namn (pred_ets) <- "ets"

pred_ets <- ts (pred_ets $ ets, start = c (2005, 01), frekvens = 12)
pred_arima <- ts (pred_arima $ arima, start = c (2005, 01), frekvens = 12)

noggrannhet (pred_ets, ts_dt)
noggrannhet (pred_arima, ts_dt)
 
Finns det något sätt att göra detta för metoder som logistisk regression med R?
@hlyates, Enligt min uppfattning är det möjligt, du behöver bara ändra ovanstående kod lite.Inkludera pred_lr (förutsägelser genom logistisk regression) och ändra namnet på kolumnerna i enlighet därmed.
Zach
2011-08-10 23:34:36 UTC
view on stackexchange narkive permalink

Det "kanoniska" sättet att göra korsvalidering av tidsserier (åtminstone som beskrivs av @Rob Hyndman) är att "rulla" genom datasetet.

ie :

  • vik 1: träning [1], test [2]
  • vik 2: träning [1 2], test [3]
  • veck 3: träning [1 2 3], test [4]
  • vik 4: träning [1 2 3 4], test [5]
  • vik 5: träning [1 2 3 4 5], test [6]

I grund och botten bör din träningsuppsättning inte innehålla information som inträffar efter testuppsättningen.

Matthias Schmidtblaicher
2016-10-30 17:00:20 UTC
view on stackexchange narkive permalink

Det är inget fel med att använda block med "framtida" data för korsvalidering av tidsserier i de flesta situationer. I de flesta situationer hänvisar jag till modeller för stationär data, vilka är de modeller som vi vanligtvis använder. T.ex. när du passar en $ \ mathit {ARIMA} (p, d, q) $, med $ d>0 $ till en serie, tar du $ d $ skillnader i serien och passar en modell för stationär data till resterna.

För att korsvalidering ska fungera som ett modellvalsverktyg behöver du ungefärligt oberoende mellan träningen och testdata. Problemet med tidsseriedata är att intilliggande datapunkter ofta är mycket beroende, så standardkorsvalidering misslyckas. Åtgärden för detta är att lämna ett gap mellan testprovet och träningsproverna, på båda sidor om testprovet . Anledningen till att du också behöver lämna ett gap innan testprovet är att beroendet är symmetriskt när du går framåt eller bakåt i tiden (tänk på korrelation).

Detta tillvägagångssätt kallas $ hv $ cross validation (lämna $ v $ out, ta bort $ h $ observationer på vardera sidan av testprovet) och beskrivs i detta dokument. I ditt exempel skulle detta se ut så här:

  • vik 1: träning [1 2 3 4 5h], test [6]
  • vik 2: träning [1 2 3 4h h6], test [5]
  • vik 3: träning [1 2 3h h5 6], test [4]
  • veck 4: träning [1 2h h4 5 6] , test [3]
  • vik 5: träning [1h h3 4 5 6], test [2]
  • veck 6: träning [h2 3 4 5 6], test [1 ]

Om h indikerar att h observationer av träningsprovet raderas på den sidan.

Seanny123
2019-06-25 19:21:22 UTC
view on stackexchange narkive permalink

Som kommenteras av @thebigdog, "Om användning av korsvalidering för utvärdering av tidsserieprediktorer" av Bergmeir et al. diskuterar korsvalidering inom ramen för stationära tidsserier och fastställer att framåtkedjning (föreslagen av andra svarare) inte hjälper. Observera att framåtkedjning kallas Last-Block Evaluation i detta dokument:

Med hjälp av standard 5-faldig korsvalidering kunde ingen praktisk effekt av beroenden i data hittas angående om det slutliga felet är underskattat eller överskattat. Tvärtom tenderar den senaste blockutvärderingen att ge mindre robusta felmått än korsvalidering och blockerad korsvalidering.

" Utvärdering av prognosmodeller för tidsserier: En empirisk studie om prestationsuppskattningsmetoder" av Cerqueira et al. instämmer i denna bedömning. Men för icke-stationära tidsserier rekommenderar de istället att använda en variant på Hold-Out, kallad Rep-Holdout. I Rep-Holdout väljs en punkt a i tidsserien Y för att markera början på testdata. Poängen a bestäms för att vara inom ett fönster. Detta illustreras i figuren nedan:

rep-holdout illustration

Det här ovannämnda dokumentet är långt och testar uttömmande nästan alla andra metoder som nämns i svaren på denna fråga med allmänt tillgänglig kod. Detta inkluderar @Matthias Schmidtblaicher anspråk på att inkludera luckor före och efter testdata. Jag har också bara sammanfattat uppsatsen. Den faktiska slutsatsen av uppsatsen innebär ett beslutsträd för utvärdering av tidsseriemodeller!



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...