Exemplo de previsão de séries temporais usando redes neurais em R


8

Alguém tem um breve exemplo educacional rápido de como usar redes neurais ( nnetem R, por exemplo) para fins de previsão?

Aqui está um exemplo, em R, de uma série temporal

T <- seq(0,20,length=200)
Y <- 1 + 3*cos(4*T+2) +.2*T^2 + rnorm(200)
plot(T,Y,type="l")

Este é apenas um exemplo, mas o que tenho são dados sazonais agitados.

Respostas:


15

Rob Hyndman está fazendo uma pesquisa ativa sobre a previsão com redes náuticas. Recentemente, ele adicionou a nnetar()função ao forecastpacote que utiliza o nnetpacote que você faz referência para ajustar aos dados de séries temporais.

http://cran.r-project.org/web/packages/forecast/index.html

O exemplo dos documentos de ajuda:

fit <- nnetar(lynx)
fcast <- forecast(fit)
plot(fcast)

Rob fornece mais contexto nesta seção específica de seu texto on-line: Previsão: princípios e prática .

(E um grande obrigado a Rob, obviamente.)


É bom, mas há redes apenas alimentam-forward
Tommaso Guerrini

2

Estava procurando a mesma coisa e tropeçou nessa questão. Como não encontrei um exemplo, decidi fazer o meu. Esteja ciente, eu não sou especialista em redes neurais ou previsão :)

Para modelar séries temporais de forma eficaz com redes neurais (redes), acredito que uma propriedade importante que as redes devem ter é algum tipo de memória (mantendo o controle do que aconteceu no passado). Portanto, redes simples de feed-forward são provavelmente uma má idéia. Uma das famílias nas redes que podem simular efetivamente a memória é a família de redes neurais recorrentes e um dos tipos mais conhecidos de redes neurais recorrentes são provavelmente redes Elman (junto com redes de memória de curto prazo (LSTM), eu diria). Para saber mais sobre as redes Elman, você pode ler o artigo original introduzindo o conceito ou a Wikipedia . Em resumo, eles têm uma camada adicional chamada contexto usada como um tipo de memória. A figura a seguir ( fonte ) ilustra a ideia

Uma rede recorrente simples do tipo Elman

Felizmente para nós, existe o pacote RSNNS em R capaz de instalar redes Elman. O pacote é descrito em detalhes aqui .

Agora que passamos ao básico, vamos ver como podemos implementar um exemplo no R com o pacote RSNNS.

library(RSNNS)

#
# simulate an arima time series example of the length n
#
set.seed(10001)
n <- 100
ts.sim <- arima.sim(list(order = c(1,1,0), ar = 0.7), n = n-1)

#
# create an input data set for ts.sim
# sw = sliding-window size
#
# the last point of the time series will not be used
#   in the training phase, only in the prediction/validation phase
# 
sw <- 1
X <- lapply(sw:(n-2),
       function(ind){
           ts.sim[(ind-sw+1):ind]
       })
X <- do.call(rbind, X)
Y <- sapply(sw:(n-2),
       function(ind){
           ts.sim[ind+1]
       })

# used to validate prediction properties
# on the last point of the series
newX <- ts.sim[(n-sw):(n-1)]
newY <- ts.sim[n]

# build an elman network based on the input
model <- elman(X, Y,
               size = c(10, 10),
               learnFuncParams = c(0.001),
               maxit = 500,
               linOut = TRUE)

#
# plot the results
#
limits <- range(c(Y, model$fitted.values))

plot(Y, type = "l", col="red",
     ylim=limits, xlim=c(0, length(Y)),
     ylab="", xlab="")
lines(model$fitted.values, col = "green", type="l")

points(length(Y)+1, newY, col="red", pch=16)
points(length(Y)+1, predict(model, newdata=newX),
       pch="X", col="green")

Este código deve resultar na figura a seguir insira a descrição da imagem aqui

Então, o que fizemos com o código é o seguinte. Primeiro, criamos um exemplo de série temporal (a partir do modelo ARIMA). Depois disso, separamos / dividimos o exemplo da série temporal em entradas do formulário (sw pontos anteriores, próximo ponto) para todos os pares, exceto o último (com o próximo ponto como o último ponto do exemplo da série temporal). O parâmetro sw é usado para definir a "janela deslizante". Não discutirei aqui qual é o tamanho adequado para a janela deslizante, mas observe que, devido às redes Elman terem memória, a janela deslizante do tamanho um é mais do que uma abordagem razoável (também dê uma olhada neste post ).

Após os preparativos, podemos simplesmente construir uma rede Elman com a função elman. Existem dois parâmetros com os quais você deve ter cuidado; o tamanho e o learnFuncParams. O parâmetro size fornece uma maneira de definir o tamanho da rede (camada oculta) e a maneira como você escolhe esse parâmetro é mais uma arte do que uma ciência. Uma regra prática para learnFuncParams é mantê-lo pequeno, se possível, (seu poder de processamento permite mantê-lo pequeno / você tem tempo suficiente para esperar: D).

E pronto, você tem sua rede neural capaz de prever um / o ponto / valor futuro. O poder preditivo dessa abordagem para o nosso exemplo é ilustrado na figura anterior. A curva vermelha apresenta nossa série temporal simulada (sem o último ponto) e a curva verde que foi obtida com a rede Elman ajustada. O ponto vermelho indica o último ponto (aquele que não foi usado durante o processo de adaptação) e o ponto verde que foi previsto pela rede ajustada. Nada mal :)

Este foi um exemplo de como usar RNNs (redes Elman) com R para fazer previsões / previsões. Alguns podem argumentar que as RNNs não são as melhores para o problema e que existem melhores modelos de rede para previsão. Como não sou especialista no assunto, evitarei discutir essas questões.

Uma leitura interessante, se você quiser saber mais sobre as RNNs, é uma revisão crítica das RNNs no trabalho de aprendizado de sequência .


Uma avenida interessante para explorar, obrigado. Ficarei interessado em ver como isso progride em mais alguns períodos.
Morgan Ball

1
@ OrganBall: Obrigado. Não se esqueça de adaptar suas entradas / saídas para treinamento apropriado para previsões mais longas / futuras.
Iugrina
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.