Analiza szeregów czasowych z walidacją krzyżową

37

Korzystałem z pakietu Caret w R do budowania modeli predykcyjnych do klasyfikacji i regresji. Caret zapewnia zunifikowany interfejs do dostrajania hiperparametrów modelu poprzez weryfikację krzyżową lub wiązanie rozruchu. Na przykład, jeśli budujesz prosty model „najbliższych sąsiadów” do celów klasyfikacji, ilu sąsiadów powinieneś użyć? 2? 10? 100? Caret pomaga odpowiedzieć na to pytanie, ponownie próbkując dane, wypróbowując różne parametry, a następnie agregując wyniki, aby zdecydować, które dają najlepszą dokładność predykcyjną.

Podoba mi się to podejście, ponieważ zapewnia solidną metodologię wybierania hiperparametrów modelu, a po wybraniu ostatecznych hiperparametrów zapewnia weryfikację krzyżową oceny „dobrego” modelu przy użyciu dokładności do modeli klasyfikacji i RMSE dla modeli regresji.

Mam teraz pewne dane szeregów czasowych, dla których chcę zbudować model regresji, prawdopodobnie używając losowego lasu. Jaka jest dobra technika oceny dokładności predykcyjnej mojego modelu, biorąc pod uwagę charakter danych? Jeśli losowe lasy tak naprawdę nie dotyczą danych szeregów czasowych, jaki jest najlepszy sposób na zbudowanie dokładnego modelu zestawu do analizy szeregów czasowych?

Zach
źródło
Znalazłem naprawdę interesujące pytanie. Czy istnieje sposób, w jaki mogę zaznaczyć pytanie, aby na nie odpowiedzieć?
mariana soffer
1
@mariana soffer Kliknij ikonę „Gwiazda” pod strzałkami w górę / w dół.
Zach
4
Daszek obsługuje teraz szeregów czasowych krzyżowej walidacji - r-bloggers.com/time-series-cross-validation-5
captain_ahab
1
@Zach To jest stary post, ale zastanawiam się, czy masz jakieś nowe myśli? Czy znasz jakieś ostatnie prace nad sekwencyjną weryfikacją modelu?
horaceT

Odpowiedzi:

10

„Klasyczna” k-krotna technika walidacji krzyżowej opiera się na fakcie, że każda próbka w dostępnym zestawie danych jest używana (k-1) razy do trenowania modelu i 1 raz do testowania go. Ponieważ walidacja modeli szeregów czasowych na „przyszłych” danych jest bardzo ważna, takie podejście nie przyczyni się do stabilności modelu.

Jedną ważną właściwością wielu (najbardziej?) Szeregów czasowych jest korelacja między sąsiednimi wartościami. Jak zauważył IrishStat, jeśli użyjesz wcześniejszych odczytów jako zmiennych niezależnych twojego kandydata na model, ta korelacja (lub brak niezależności) odgrywa znaczącą rolę i jest kolejnym powodem, dla którego walidacja krzyżowa razy K nie jest dobrym pomysłem.

Jednym ze sposobów rozwiązania tego problemu jest „nadpróbkowanie” danych i ich korelacja. Jeśli proces dekorelacji zakończy się powodzeniem, wówczas stosowanie weryfikacji krzyżowej w szeregach czasowych stanie się mniej problematyczne. Nie rozwiąże to jednak problemu walidacji modelu na podstawie przyszłych danych

Wyjaśnienia

przez sprawdzanie poprawności modelu na przyszłych danych mam na myśli konstruowanie modelu, czekanie na nowe dane, które nie były dostępne podczas budowy modelu, testowania, dostrajania itp. i sprawdzanie poprawności na tych nowych danych.

przez nadpróbkowanie danych mam na myśli zbieranie danych szeregów czasowych z częstotliwością znacznie wyższą niż praktycznie potrzebna. Na przykład: pobieranie próbek cen akcji co 5 sekund, gdy naprawdę interesują Cię zmiany godzinowe. Tutaj, kiedy mówię „próbkowanie”, nie mam na myśli „interpolacji”, „szacowania” itp. Jeśli danych nie można zmierzyć z większą częstotliwością, technika ta nie ma znaczenia

Boris Gorelik
źródło
Jaki jest „klasyczny” sposób walidacji modelu na przyszłe dane? Co rozumiesz przez „oversampling”? Dziękuję Ci!
Zach
T.ppT.
@bgbg Mam bardzo podobny problem i właśnie znalazłem twój post. Czy możesz przytoczyć odniesienia do nadpróbkowania i dekorelowania danych szeregów czasowych? Pomyślałbym, że jeśli pamięć w szeregu czasowym jest wystarczająco krótka (mogłaby wykazać, że pasuje do arimy), można po prostu pobrać próbki „nie pokrywające się” i wykonać zwykłą walidację krzyżową. Każda myśl doceniona.
horaceT
9

http://robjhyndman.com/researchtips/crossvalidation/ zawiera szybką wskazówkę dotyczącą krzyżowej weryfikacji szeregów czasowych. Jeśli chodzi o użycie losowego lasu do danych szeregów czasowych ... nie jestem pewien, chociaż wydaje się to dziwnym wyborem, biorąc pod uwagę, że model jest dopasowany przy użyciu próbek bootstrap. Istnieją oczywiście klasyczne metody szeregów czasowych (np. ARIMA), podobnie jak techniki ML, takie jak sieci neuronowe (przykładowy przykład pdf ). Być może niektórzy eksperci od szeregów czasowych mogą komentować, jak dobrze działają techniki ML w porównaniu do algorytmów specyficznych dla szeregów czasowych.

B_Miner
źródło
2
To prawie uderza w gwóźdź na głowie. Próbuję wymyślić techniki uczenia maszynowego do analizy szeregów czasowych.
Zach
Miałem wcześniej powodzenie w stosowaniu losowych lasów do prognozowania. Sprawdź: biomedcentral.com/1471-2105/15/276
captain_ahab
6

Oto przykładowy kod do sprawdzania poprawności modeli szeregów czasowych. I rozszerzony na ten kod w moim blogu , włączenie pakietu foreach do rzeczy przyspieszyć i pozostawienie do ewentualnego terminu xreg w przekroju walidacji.

Oto kopia kodu z bloga Roba Hyndmana:

library(fpp) # To load the data set a10
plot(a10, ylab="$ million", xlab="Year", main="Antidiabetic drug sales")
plot(log(a10), ylab="", xlab="Year", main="Log Antidiabetic drug sales")

k <- 60 # minimum data length for fitting a model
n <- length(a10)
mae1 <- mae2 <- mae3 <- matrix(NA,n-k,12)
st <- tsp(a10)[1]+(k-2)/12

for(i in 1:(n-k))
{
  xshort <- window(a10, end=st + i/12)
  xnext <- window(a10, start=st + (i+1)/12, end=st + (i+12)/12)
  fit1 <- tslm(xshort ~ trend + season, lambda=0)
  fcast1 <- forecast(fit1, h=12)
  fit2 <- Arima(xshort, order=c(3,0,1), seasonal=list(order=c(0,1,1), period=12), 
      include.drift=TRUE, lambda=0, method="ML")
  fcast2 <- forecast(fit2, h=12)
  fit3 <- ets(xshort,model="MMM",damped=TRUE)
  fcast3 <- forecast(fit3, h=12)
  mae1[i,1:length(xnext)] <- abs(fcast1[['mean']]-xnext)
  mae2[i,1:length(xnext)] <- abs(fcast2[['mean']]-xnext)
  mae3[i,1:length(xnext)] <- abs(fcast3[['mean']]-xnext)
}

plot(1:12, colMeans(mae1,na.rm=TRUE), type="l", col=2, xlab="horizon", ylab="MAE",
     ylim=c(0.65,1.05))
lines(1:12, colMeans(mae2,na.rm=TRUE), type="l",col=3)
lines(1:12, colMeans(mae3,na.rm=TRUE), type="l",col=4)
legend("topleft",legend=c("LM","ARIMA","ETS"),col=2:4,lty=1)

Wyniki

Zach
źródło
Cześć Zach. Zaimplementowałem nieco inną wersję kodu Hyndmana, aby wykryć odpowiednią liczbę terminów dla modelu regresji z szeregami czasowymi. Niestety wykres błędu CV pokazał kilka lokalnych minimów, co skłoniło mnie do pytania, jak prawidłowo wybrać liczbę terminów. Pełny problem opisano tutaj . Czy napotkałeś już coś podobnego?
jroberayalas
5

Jeśli masz dane szeregów czasowych, możesz mieć „problem ze stopniami swobody”. Na przykład, jeśli masz 4 obserwacje wykonane w odstępach godzinnych, a następnie zdecydujesz się na użycie 241 obserwacji w odstępach 1-minutowych, masz 241 obserwacji, ale niekoniecznie są one niezależne. Gdy prześlesz te 241 wartości / pomiarów do pakietu analitycznego, pakiet może spodziewać się, że są to 241 niezależnych wartości w miarę wykonywania określonej magii. Jeśli masz dane szeregów czasowych, być może będziesz musiał zaktualizować swoje dane analityczne. Nie znam programu, do którego się odwołujesz, ale z mojej strony rozsądnie zgaduję (mogę się mylić!), Że to testy (testy F / testy T ... itd.) Prawdopodobnie nie dotyczą twojego zestawu problemów.

IrishStat
źródło
1

Mogę polecić Ci 2 ciekawe artykuły do ​​przeczytania, które są dostępne online 1. Uczenie się w trybie ciągłym: One-Pass SVM, autor: Piyush Rai, Hal Daum´e III, Suresh Venkatasubramanian 2. Mówienie w przybliżeniu k-oznacza, autor: Nir Ailon

Mam nadzieję, że to trochę wyjaśni twoje pomysły

mariana bardziej miękka
źródło
Czy możesz podać linki do tych dokumentów? Dzięki.
Zach
Zach tutaj jest pierwszy snowbird.djvuzone.org/2008/abstracts/180.pdf, a drugi to www1.cs.columbia.edu/~rjaiswal/ajmNIPS09.pdf . Mam nadzieję, że to pomoże
Marianna Soffer