Wykorzystanie k-krotnej walidacji krzyżowej do wyboru modelu szeregów czasowych

70

Pytanie: Chcę się czegoś upewnić, czy stosowanie k-krotnej walidacji krzyżowej z szeregami czasowymi jest proste, czy też należy na to zwrócić szczególną uwagę?

Tło: modeluję 6-letni szereg czasowy (z łańcuchem pół-markowa), z próbką danych co 5 minut. Aby porównać kilka modeli, używam 6-krotnej walidacji krzyżowej, dzieląc dane na 6 lat, więc moje zestawy szkoleniowe (do obliczenia parametrów) mają długość 5 lat, a zestawy testowe mają długość 1 rok. Nie biorę pod uwagę kolejności czasowej, więc moje różne zestawy to:

  • fold 1: trening [1 2 3 4 5], test [6]
  • fold 2: trening [1 2 3 4 6], test [5]
  • fold 3: trening [1 2 3 5 6], test [4]
  • fold 4: trening [1 2 4 5 6], test [3]
  • fold 5: trening [1 3 4 5 6], test [2]
  • fold 6: trening [2 3 4 5 6], test [1].

Robię hipotezę, że każdego roku są od siebie niezależni. Jak mogę to zweryfikować? Czy istnieje odniesienie wskazujące na zastosowanie k-krotnej walidacji krzyżowej z szeregami czasowymi.

Mickaël S.
źródło
Spójrz na ten artykuł, który znalazłem pomocny francescopochetti.com/…
Henok S Mengistu

Odpowiedzi:

69

Szeregi czasowe (lub inne wewnętrznie uporządkowane dane) mogą stanowić problem przy krzyżowej weryfikacji. Jeśli jakiś wzór pojawi się w roku 3 i pozostanie przez lata 4-6, twój model może go wykryć, nawet jeśli nie był to rok 1 i 2.

Podejście, które czasem jest bardziej zasadnicze dla szeregów czasowych, to łączenie w przód, w którym procedura wyglądałaby mniej więcej tak:

  • fold 1: szkolenie [1], test [2]
  • fold 2: szkolenie [1 2], test [3]
  • fold 3: trening [1 2 3], test [4]
  • fold 4: trening [1 2 3 4], test [5]
  • fold 5: trening [1 2 3 4 5], test [6]

To dokładniej modeluje sytuację, którą zobaczysz w czasie przewidywania, gdzie będziesz modelować na podstawie przeszłych danych i przewidywać na podstawie danych prognozujących. Daje to również poczucie zależności twojego modelowania od wielkości danych.

Ken Williams
źródło
1
Dzięki. Rozumiem, jak powiedział Zach, jest to kanoniczny sposób na zrobienie tego. I rozumiem dlaczego. Problem, który mam z tym, to fakt, że weźmie on pod uwagę zmienność wielkości danych, więc nie dostanę „prawdziwego” błędu uogólnienia mojego modelu. Ale błąd mieszany: uogólnienie i rozmiar danych. Czy znasz inne referencje (inne niż M.Hyndman), które dotyczą weryfikacji krzyżowej w szeregach czasowych? Nie zrozumcie mnie źle, to nie nie ufam temu, co mówisz, a co mówi M. Hyndman, ma to sens. Po prostu lubię mieć kilka punktów widzenia na problem
Mickaël S
Obawiam się, że nie znam takiego odniesienia, ale byłbym zainteresowany, aby zobaczyć jeden, jeśli ktoś inny go zna.
Ken Williams,
1
@Wayne, mam na myśli, że to rozwiązanie wykorzystuje coraz więcej lat danych szkoleniowych przy każdym zakładaniu. W moich danych zdecydowanie występują różnice między latami, ale brak widocznych trendów i sezonowości.
Mickaël S
3
@Mickael: Możesz użyć testu fold 1: train [1 2] [3]; krotnie 2: pociąg [2 3] test [4]; fold 3: trenuj [3 4] test [5] itd., jeśli martwisz się wykorzystaniem coraz większej ilości danych przy każdym foldowaniu. Domyślam się, że dzięki technice pół-MC nie da się tak naprawdę mieszać lat, nawet jeśli nie ma trendu.
Wayne,
3
@ MickaëlS: Znalazłem ten artykuł sciencedirect.com/science/article/pii/S0020025511006773 i pomyślałem, że może być interesujący. Porównują to „kanoniczne” podejście z dwiema innymi metodami - „blokiem doładowania” i podejściem „pomiń zależność”.
thebigdog
26

Metodą używaną do walidacji krzyżowej mojego modelu szeregów czasowych jest walidacja krzyżowa na bieżąco. Zacznij od małego podzbioru danych do celów szkoleniowych, prognozuj późniejsze punkty danych, a następnie sprawdź dokładność prognozowanych punktów danych. Te same prognozowane punkty danych są następnie uwzględniane jako część następnego zestawu danych szkoleniowych, a kolejne punkty danych są prognozowane.

Aby wszystko było intuicyjne, oto obraz tego samego:

wprowadź opis zdjęcia tutaj

Odpowiednikiem kodu R byłoby:

i <- 36    #### Starting with 3 years of monthly training data 
pred_ets <- c()
pred_arima <- c()
while(i <= nrow(dt)){
  ts <- ts(dt[1:i, "Amount"], start=c(2001, 12), frequency=12)

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

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

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

accuracy(pred_ets, ts_dt)
accuracy(pred_arima, ts_dt)
Jatin Garg
źródło
Czy można to zrobić w przypadku metod takich jak regresja logistyczna przy użyciu R?
hlyates 27.04.17
1
@ hlyates, W moim rozumieniu jest to możliwe, wystarczy trochę zmodyfikować powyższy kod. Uwzględnij pred_lr (prognozy według regresji logistycznej) i odpowiednio zmień nazwę kolumn.
Jatin Garg
22

„Kanonicznym” sposobem przeprowadzania walidacji krzyżowej szeregów czasowych (przynajmniej zgodnie z opisem @Rob Hyndman) jest „przetoczenie” zestawu danych.

to znaczy:

  • fold 1: szkolenie [1], test [2]
  • fold 2: szkolenie [1 2], test [3]
  • fold 3: trening [1 2 3], test [4]
  • fold 4: trening [1 2 3 4], test [5]
  • fold 5: trening [1 2 3 4 5], test [6]

Zasadniczo zestaw treningowy nie powinien zawierać informacji pojawiających się po zestawie testowym.

Zach
źródło
13

W większości sytuacji nie ma nic złego w stosowaniu bloków „przyszłych” danych do weryfikacji krzyżowej szeregów czasowych. W większości sytuacji odnoszę się do modeli danych stacjonarnych, którymi zwykle są modele. Np. Kiedy dopasujesz , z do szeregu, bierzesz różnice w szeregu i dopasowujesz model danych stacjonarnych do reszt.d > 0 dARIMA(p,d,q)d>0d

Aby krzyżowa walidacja działała jako narzędzie wyboru modelu, potrzebujesz przybliżonej niezależności między szkoleniem a danymi testowymi. Problem z danymi szeregów czasowych polega na tym, że sąsiednie punkty danych są często wysoce zależne, więc standardowe sprawdzanie krzyżowe zakończy się niepowodzeniem. Rozwiązaniem tego problemu jest pozostawienie luki między próbką testową a próbką treningową po obu stronach próbki testowej . Powodem, dla którego musisz również pominąć lukę przed próbą testową, jest to, że zależność jest symetryczna, gdy poruszasz się do przodu lub do tyłu w czasie (pomyśl o korelacji).

Podejście to nosi nazwę walidacji krzyżowej (pomiń , usuń obserwacje po obu stronach próbki testowej) i jest opisane w tym artykule. W twoim przykładzie wyglądałoby to tak:v hhvvh

  • fold 1: trening [1 2 3 4 5h], test [6]
  • fold 2: trening [1 2 3 4h h6], test [5]
  • fold 3: trening [1 2 3h h5 6], test [4]
  • fold 4: trening [1 2h h4 5 6], test [3]
  • fold 5: trening [1h h3 4 5 6], test [2]
  • fold 6: trening [h2 3 4 5 6], test [1]

Gdzie h wskazuje, że obserwacje h próbki treningowej są usuwane po tej stronie.

Matthias Schmidtblaicher
źródło
3

Jak skomentował @thebigdog, „O zastosowaniu walidacji krzyżowej do oceny predyktorów szeregów czasowych” Bergmeir i in. omawia walidację krzyżową w kontekście stacjonarnych szeregów czasowych i określa, że ​​Forward Chaining (proponowany przez innych odpowiedzi) jest nieprzydatny. Uwaga: w tym dokumencie łańcuchowanie do przodu nazywa się oceną ostatniego bloku:

Stosując standardową 5-krotną walidację krzyżową, nie można było znaleźć praktycznego efektu zależności w danych dotyczących tego, czy błąd końcowy jest niedoszacowany, czy przeszacowany. Wręcz przeciwnie, ocena ostatniego bloku daje mniej niezawodne miary błędów niż weryfikacja krzyżowa i blokowana weryfikacja krzyżowa.

Ocena modeli prognozowania szeregów czasowych: badanie empiryczne metod szacowania wydajności ” Cerqueira i in. zgadza się z tą oceną. Jednak w przypadku niestacjonarnych szeregów czasowych zamiast tego zalecają stosowanie odmiany Hold-Out, zwanej Rep-Holdout. W Rep-Holdout aw szeregu czasowym wybierany jest punkt Yoznaczający początek danych testowych. Punkt azostanie określony w oknie. Ilustruje to poniższy rysunek:

ilustracja rep-holdout

Ten artykuł jest długi i wyczerpująco testuje prawie wszystkie inne metody wymienione w odpowiedziach na to pytanie za pomocą publicznie dostępnego kodu . Obejmuje to twierdzenie @Matthias Schmidtblaicher o uwzględnianiu luk przed i po danych testowych. Poza tym streściłem tylko gazetę. Faktyczne zakończenie pracy dotyczy drzewa decyzyjnego do oceny modeli szeregów czasowych!

Seanny123
źródło