Séries Temporais — Previsões Utilizando Redes Neurais

Pandas Couple
9 min readJul 6, 2021

--

As séries temporais estão por toda a parte! Você as viu em preços de ações, previsões do tempo, em tendências históricas e demandas. Poderíamos ficar horas exemplificando onde as séries temporais estão presentes, então vamos em frente!

https://unsplash.com/

Mas, o que exatamente é uma série temporal?

É uma sequência ordenada de valores, geralmente espaçadas igualmente ao longo do tempo todos os anos, meses, dias ou mesmo a cada poucos microssegundos.

As séries temporais, vem com diversas formas e tamanhos, mas alguns padrões são mais comuns do que outros, portanto, é bastante útil reconhecê-los. Um desses padrões, é a tendência. Um série temporal, pode ter uma tendência de alta ou de baixa, por exemplo, as vendas de uma loja ao longo do tempo, podem estar aumentando ou diminuindo.

Outro padrão muito importante, é a sazonalidade. Ela se define quando os padrões de um determinado conjunto de dados se repetem em intervalos previsíveis, com “picos” e “vales” específicos nos gráficos. Por exemplo, as vendas de uma loja de chocolate, aumentam consideravelmente (picos) na época de pascoa, mas caem bruscamente durante as férias de verão (vales) e isso se repete todos os anos.

Por fim, outro padrão que é interessante reconhecer, é o ruído. Dessa forma, as séries ficam completamente imprevisíveis. Um exemplo, seria o ruído branco, nele, seria interessante encontrar apenas sua distribuição de probabilidade e os seus parâmetros, como a média e a variância.

  • Quando temos um único valor, em cada intervalo de tempo, dizemos que é uma série temporal univariada.
  • Quando temos mais de um valor, em cada intervalo de tempo, dizemos que é uma série temporal multivariada.

Como podemos ver, a série temporal pode ser utilizada para analisar quase tudo que evolui ao longo do tempo. Ela possui diversas aplicações, sendo a mais comum a previsão.

Este, portanto, será o objetivo desse projeto. Utilizar os dados de uma companhia aérea para prever a quantidade de passageiros que ela terá.

Aquisição dos dados

Os dados deste trabalho foram adquiridos do Kaggle. Lá você encontra esse e outros datasets muito interessantes para fazer projetos como esse ou até participar de competições entre cientistas de dados.

Análise Exploratória dos dados

Vamos, em primeiro lugar, fazer um reconhecimento do nosso dataset por meio da análise exploratória. Sabemos o quanto essa etapa de um projeto é importante!

https://unsplash.com/
  • Vamos começar verificando as 5 primeiras entradas do dataset.

Esse é um dataset que possui apenas duas colunas. Note como é nítido uma análise de série temporal, nesse caso. Temos uma coluna com uma sequência de valores (passageiros) ao longo de um período de tempo (meses). Vamos verificar esses valores em um gráfico para tudo ficar mais claro.

Antes da análise gráfica, vamos verificar os tipos das duas colunas, a quantidade de valores ausentes e alterar o que for necessário.

  • Verificar os tipos das colunas

Aqui alteramos o tipo da coluna ‘Month’ para ‘datetime’, pois, como é uma coluna que representa as datas do conjunto de dados, esse é o tipo correto a se trabalhar.

A coluna ‘Passengers’ se encontra como ‘int’. Esse é também o tipo correto a se trabalhar com essa coluna, já que temos números inteiros em suas entradas.

  • Vamos verificar a ausência de algum dado, bem como renomear as nossas colunas e passar a coluna que representa as datas (Month) para o index do dataframe.

Esse conjunto de dados não possui nenhum valor ausente, o que é ótimo para nossa análise. Ressalto que esse é um passo importante. Se por acaso existir um dado nulo em uma determinada data e isso representar uma queda drástica no gráfico, nossa análise se modificará completamente.

Feito isso, podemos partir para análises mais profundas!

  • Verificação do aumento de passageiros por período de mês e aceleração desse aumento.

Aqui, criamos um novo dataframe com algumas colunas novas. Essas novas colunas ‘aumento’ e ‘aceleracao’ nos dizem o quanto de passageiros aumentou (ou diminuiu) de um intervalo de tempo para o outro e com qual aceleração esse aumento aconteceu, respectivamente.

Os valores em ambas, são apenas a subtração de um valor em determinada data com a data anterior. A coluna ‘aumento’ tem seus valores vindo da coluna ‘passengers’ e a coluna ‘aceleracao’ tem seus valores vindo da coluna ‘aumento’.

  • Vamos plotar um gráfico para verificar esses valores.

Conseguimos ver claramente pelo primeiro gráfico (tempo x passageiros) uma nítida série temporal. Note que é um gráfico que possui padrões de tendência e sazonalidade.

Nesse caso, temos uma tendência ascendente, visto que o número de passageiros está aumentando ao longo do tempo.

Temos também uma sazonalidade bem perceptível. Note que ao longo do mesmo intervalo de tempo (mais ou menos), temos “picos” e “vales” bem característicos no gráfico. Os picos estão acontecendo, provavelmente, devido a determinadas datas mais propícias a viajar (Como nas férias escolares) e os vales exatamente ao contrário.

Com relação aos ruídos, percebemos melhor pelo terceiro gráfico, na relação tempo x aceleração. Veja como o gráfico apenas “sobe” e “desce” de maneira desordenada, deixando uma certa imprevisibilidade na análise.

Modelo de Machine Learning

Particionamento Fixo

Após fazer todas as análises na etapa anterior, temos condições de finalmente montar nosso algoritmo de machine learning.

A abordagem mais simples é pegar o último valor e supor que o próximo valor será o mesmo. Isso é chamado de “previsão ingênua”. Muitas vezes é interessante utilizar essa previsão ingênua, apenas para obter uma linha de base do desempenho do modelo.

Para medir o desempenho do modelo de previsão, o ideal é dividir a série temporal em um período de treinamento, um período de validação e outro de teste. Isso é chamado de particionamento fixo.

Se a série temporal tiver alguma sazonalidade, geralmente, temos que garantir que cada período contenha um número inteiro de “temporadas”, como, um ano, dois anos, três anos, etc. Não queremos um ano e meio ou dois anos e meio, pois, alguns meses seriam mais representativos do que outros, causando uma confusão na análise.

Vamos descrever aqui um passo a passo do algoritmo:

  • Primeiro, deve-se treinar o modelo no período de treinamento;
  • Depois, deve-se avalia-lo no período de validação. Aqui podemos itera-lo várias vezes (entre o período de treinamento e validação) para achar uma boa arquitetura da nossa rede neural e ajustar os hyperparâmetros;
  • Após finalizar os dois primeiros passos, teste o modelo no período de teste, para ter uma ideia de como será o desempenho do modelo em produção.

Nem sempre teremos um excelente desempenho, porque a série temporal pode se comportar de maneira diferente no futuro, mas geralmente conseguiremos desempenhos razoáveis e aplicáveis.

  • Para fechar o nosso passo a passo, devemos treinar a série temporal uma última vez, incluindo nesse treino o período que antes era de teste, para implantar o modelo. Isso é diferente das práticas recomendadas usuais de machine learning, onde nunca treinamos no período de teste.

Aqui, contrariando as práticas recomendadas, isso vai ser necessário, pois, o período mais recente da série temporal costuma ser o que mais contém informações úteis para a previsão.

Agora, como o período de teste não é tão confiável quanto nas práticas usuais de machine learning, porque precisamos usá-lo para treinamento antes de implantar o modelo, é comum utilizar apenas um período de treinamento e um de validação. Em outras palavras, o período de teste estará no futuro.

Particionamento Rollforward

O particionamento fixo é simples e intuitivo, mas há outra maneira de fazer previsões. O particionamento rollforward.

Nesse método, começamos com um curto período de treinamento e gradualmente aumentamos, um dia de cada vez ou uma semana de cada vez. A cada iteração, treinamos o modelo no período de treinamento e o usamos para prever o dia seguinte ou a semana seguinte no período de validação.

Sua desvantagem é que exigirá muito mais tempo de treinamento, mas o benefício é que será mais próximo de imitar as condições de produção, pois você geralmente irá treinar regularmente o modelo a medida que novos dados são obtidos na produção.

Para simplificar, neste projeto iremos seguir com o particionamento fixo.

Esses são os nossos dados de treino e validação respectivamente. Reservamos os últimos doze meses dos dados para a validação. Também fizemos uma normalização para melhorar o desempenho do modelo.

Antes de treinar nosso modelo final, vamos criar um baseline utilizando a previsão ingênua. Vamos utilizar o mean squared error como métrica de avaliação.

Previsão ingênua

Temos o baseline pela previsão ingênua! Vamos então treinar o algoritmo utilizando as redes neurais.

Modelo Final — LSTM

LSTM (Long Short-Term Memory) é uma arquitetura baseada em Rede Neural Recorrente (RNN) que é amplamente usada no processamento de linguagem natural e previsão de séries temporais. O LSTM corrige um grande problema que as redes neurais recorrentes sofrem: memória curta.

Vamos então ao que interessa!

Treinamos a nossa rede, e, para finalizar vamos fazer previsões e comparar o desempenho com o baseline.

Aqui estão nossas predições! Vamos dar uma olhada graficamente e calcular seu desempenho na métrica que adotamos.

Vejam o desempenho na métrica adotada, veja como o erro caiu quase pela metade! Nada mal, não é mesmo?

Conclusão

Independente das vantagens/desvantagens de usar uma rede neural sobre os métodos clássicos, gostaria de pontuar algumas coisas:

  1. É muito importante pesar o custo/benefício de usar um modelo complexo versus um modelo mais simples. Um ligeiro aumento na precisão pode não valer o tempo, esforço e perda de interpretabilidade introduzidos pelos modelos mais complexos.
  2. Existem muitas outras técnicas que podemos utilizar, como os modelos ARIMA e suas vertentes. Essa última, em muitos casos geralmente superam os modelos de machine learning para séries temporais.
  3. Com todas essas diversas possibilidades de criar um modelo preditivo, ressalto a importância de sempre realizar diversos testes de pré-processamento dos dados, de testar algoritmos diferentes (que enquadrem na solução) e também do tunning dos hyperparâmetros. Dificilmente iremos encontrar uma solução ótima logo de primeira, na prática esses testes fazem parte do trabalho.

Para fechar, ressalto o quanto a previsão de séries temporais é complexa. Caso contrário o mercado de ações estaria resolvido. Há um elemento inerente de ruído em todos os dados de série temporal que não podemos capturar de forma viável, assim como fatores externos incontroláveis, independente do quão bom seja o modelo.

Espero ter contribuído!

--

--

Pandas Couple
Pandas Couple

Written by Pandas Couple

Casal de Cientistas de Dados, contribuindo para a comunidade de Data Science.

No responses yet