Análise de séries temporais de validação cruzada


37

Eu tenho usado o pacote de intercalação no R para criar modelos preditivos para classificação e regressão. O Caret fornece uma interface unificada para ajustar os hiper-parâmetros do modelo por validação cruzada ou correias de inicialização. Por exemplo, se você está construindo um modelo simples de 'vizinhos mais próximos' para classificação, quantos vizinhos você deve usar? 2? 10? 100? O Caret ajuda você a responder a essa pergunta re-amostrando seus dados, tentando parâmetros diferentes e, em seguida, agregando os resultados para decidir qual produz a melhor precisão preditiva.

Eu gosto dessa abordagem porque ela fornece uma metodologia robusta para a escolha de hiperparâmetros do modelo e, depois de escolher os hiperparâmetros finais, ele fornece uma estimativa validada cruzada de quão "bom" é o modelo, usando a precisão para modelos de classificação e RMSE para modelos de regressão.

Agora eu tenho alguns dados de séries temporais para os quais desejo criar um modelo de regressão, provavelmente usando uma floresta aleatória. Qual é uma boa técnica para avaliar a precisão preditiva do meu modelo, dada a natureza dos dados? Se florestas aleatórias não se aplicam realmente a dados de séries temporais, qual é a melhor maneira de criar um modelo de conjunto preciso para análise de séries temporais?


Achei muito interessante a pergunta. Existe uma maneira de marcar uma pergunta para segui-la?
Mariana soffer

1
@mariana soffer Clique no ícone 'Estrela' abaixo das setas para cima / para baixo.
Zach

4
Caret agora suporta séries temporais de validação cruzada - r-bloggers.com/time-series-cross-validation-5
captain_ahab

1
@ Zach Este é um post antigo, mas gostaria de saber se você tem alguma opinião nova. Você conhece algum trabalho recente sobre validação sequencial de modelos?
precisa saber é

Respostas:


10

A técnica "clássica" de validação cruzada de tempos k baseia-se no fato de que cada amostra no conjunto de dados disponível é usada (k-1) - vezes para treinar um modelo e 1 tempo para testá-lo. Como é muito importante validar modelos de séries temporais em dados "futuros", essa abordagem não contribuirá para a estabilidade do modelo.

Uma propriedade importante de muitas séries temporais (a maioria?) É a correlação entre os valores adjacentes. Conforme apontado pelo IrishStat, se você usar leituras anteriores como variáveis ​​independentes do seu candidato a modelo, essa correlação (ou falta de independência) desempenha um papel significativo e é outra razão pela qual a validação cruzada k-times não é uma boa idéia.

Uma maneira de superar esse problema é "exagerar" os dados e correlacioná-los. Se o processo de correlação for bem-sucedido, o uso da validação cruzada em séries temporais se tornará menos problemático. No entanto, não resolverá a questão da validação do modelo usando dados futuros

Esclarecimentos

validando o modelo em dados futuros, quero dizer construindo o modelo, aguardando novos dados que não estavam disponíveis durante a construção do modelo, testes, ajustes finos etc. e validando-os nesses novos dados.

Ao superexaminar os dados, quero dizer coletar dados de séries temporais com uma frequência muito maior do que o praticamente necessário. Por exemplo: faça uma amostragem dos preços das ações a cada 5 segundos, quando você estiver realmente interessado em alterações horárias. Aqui, quando digo "amostragem", não quero dizer "interpolar", "estimar" etc. Se os dados não puderem ser medidos com maior frequência, essa técnica não fará sentido.


Qual é a maneira 'clássica' de validar um modelo em dados futuros? O que você quer dizer com 'oversampling'? Obrigado!
Zach

TppT

@bgbg Estou enfrentando um problema muito parecido e acabei de encontrar sua postagem. Você pode citar algumas referências sobre superamostragem e correlação de dados de séries temporais? Eu acho que se a memória da série cronológica for curta o suficiente (poderia mostrar que é adequado um arima), seria possível coletar amostras "sem sobreposição" e fazer a validação cruzada usual. Qualquer pensamento apreciado.
horaceT

9

http://robjhyndman.com/researchtips/crossvalidation/ contém uma dica rápida para validação cruzada de séries temporais. Em relação ao uso de floresta aleatória para dados de séries temporais ... não tenho certeza, embora pareça uma escolha estranha, pois o modelo é ajustado usando amostras de autoinicialização. É claro que existem métodos clássicos de séries temporais (por exemplo, ARIMA) que podem ser usados, assim como técnicas de ML como redes neurais (exemplo exemplo pdf ). Talvez alguns especialistas em séries temporais possam comentar como as técnicas de ML funcionam em comparação com algoritmos específicos de séries temporais.


2
Isso praticamente atinge a unha na cabeça. Estou tentando descobrir aplicar técnicas de aprendizado de máquina à análise de séries temporais.
Zach

Eu tive sucesso usando florestas aleatórias para previsão antes. Confira: biomedcentral.com/1471-2105/15/276
captain_ahab

6

Aqui está um exemplo de código para validação cruzada de modelos de séries temporais. Eu expandi esse código no meu blog , incorporando o pacote foreach para acelerar as coisas e permitindo um possível termo xreg na validação cruzada.

Aqui está uma cópia do código do blog de Rob Hyndman:

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)

Resultados


Oi Zach. Eu implementei uma versão ligeiramente diferente do código de Hyndman para detectar o número apropriado de termos para um modelo de regressão com séries temporais. Infelizmente, o gráfico de erro CV mostrou vários mínimos locais, o que me fez questionar sobre como selecionar o número de termos corretamente. O problema completo é descrito aqui . Você já enfrentou algo semelhante antes?
jroberayalas

5

Se você tiver dados de séries temporais, poderá ter um "problema de graus de liberdade". Por exemplo, se você tiver 4 observações feitas em intervalos de hora em hora e decidir usar 241 observações em intervalos de 1 minuto, você terá 241 observações, mas elas não são necessariamente independentes. Quando você envia esses 241 valores / medições para um pacote analítico, o pacote pode esperar que sejam 241 valores independentes à medida que prossegue para executar sua mágica específica. Se você possui dados de séries temporais, pode ser necessário atualizar suas análises. Eu não conheço o programa que você se refere, mas é um palpite razoável da minha parte (eu posso estar errado!) Que seus testes (testes F / testes T ... etc) provavelmente não se aplicam ao seu conjunto de problemas.


1

Eu posso recomendar a você 2 artigos interessantes para ler que estão on-line 1. Aprendizagem em fluxo contínuo: SVMs de uma passagem, de Piyush Rai, Hal Daum´e III, Suresh Venkatasubramanian 2. Aproximação de k-meios de transmissão, de Nir Ailon

Espero que esclareça um pouco suas idéias


Você pode fornecer links para esses documentos? Obrigado.
Zach

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.