Redes neurais de séries temporais no R

Uma rede neural artificial é um método de previsão baseado na modelagem matemática do cérebro: os neurônios são organizados em camadas de entrada (preditores) e uma camada de saída (previsão), podendo haver camadas intermediárias/ocultas. O modo mais simples seria uma regressão linear, cujos regressores (variáveis independentes) são multiplicados por coeficientes (pesos), que são reajustados a cada loop de modo a minimizar o erro. Ao adicionar camadas ocultas, a rede torna-se não-linear. Veja mais sobre o que são redes neurais artificias clicando no link.

Série temporal com valores prevstos usando redes neurais no R

Os valores atrasados de uma série temporal (inclusive com sazonalidade) podem ser usados como entradas para uma rede neural. Considerando-se uma rede unidirecional (feedfoward) com uma camada oculta, utiliza-se a notação NNAR(p,P,k)[m] para indicar que o atraso (lag) é de p observações (por exemplo, para p=9, são as 9 últimas observações), com ordens de sazonalidade P e m (por exemplo, para P=1 e m=12, é considerado o valor de 12 amostras/meses atrás) e k nós (neurônios) na camada oculta.

A função nnetar() do pacote forecast do R ajusta um modelo do modo apresentado acima. Para uma série não-sazonal, o valor padrão de p é definido pelo número ótimo de uma AR(p), conforme dado pelo AIC; para uma série sazonal, o valor padrão de P é 1, p é escolhido a partir do modelo linear ótimo ajustado aos dados sazonais e o valor inteiro arredondado da conta k=(p+P+1)/2.

Se rodar o cálculo da rede neural (função nnetar) mais de uma vez, os resultados saem diferentes (já que a inicialização dos pesos é dada com valores aleatórios), mas todos estão dentro do intervalo de confiança. É possível definir a semente randômica usando “set.seed(12345)” logo antes de chamar a nnetar. No entanto, salvando os resultados e fazendo uma média, o valor resultante da previsão não varia muito se rodar o script várias vezes.

Assim, em vez de usar diretamente a função forecast() aplicada à rede neural, pode-se usar forecast.nnetar() para controlar quantas simulações serão feitas (o padrão é 1000, mas pode ser especificado outro valor usando o parâmetro “npaths=”). Outros parâmetros podem ser especificados, como “repeats”, que dá o número de redes calculadas com diferentes pesos iniciais aleatórios e que serão calculados como média quando produzem previsões; “decay” é a taxa de aprendizagem e “maxit” é o máximo de interações permitidas.

O script a seguir pode ser copiado para um arquivo e salvo como “rede_neural.R”, sendo executado diretamente no terminal (./rede_neural.R) após ter sua permissão de execução incluída (chmod +x rede_neural.R). Ele abre os arquivos com a variável a ser prevista e os regressores (passados e futuros), além de um período usado para testes (os valores são conhecidos, mas não fazem parte do grupo de treinamento da rede). Foram construídas séries temporais para entrada no modelo e na previsão para 12 meses (h=12) – intervalos de confiança podem ser calculados incluindo “PI=TRUE”. Pode-se utilizar uma transformação Box-Cox (lambda) para garantir que os resíduos sejam aproximadamente homoscedásticos.

A saída imprime (na sequência) o valor previsto, o esperado e a diferença entre eles. Note que a série ainda precisa receber mais tratamentos. através da aplicação de outras técnicas, para gerar valores melhores.

Outra opção é o multilayer perceptrons (MLP).

Fontes