Séries temporais com Machine Learning — Parte 3

Uma breve comparação entre a abordagem usando a estatística clássica e o uso dos modelos de Machine Learning em quatro artigos

Carlos Eduardo Souza
Data Hackers
10 min readFeb 16, 2020

--

Photo by Djim Loic on Unsplash

No primeiro artigo fizemos uma breve introdução do que é uma série temporal, citamos os modelos da estatística clássica (ARMA, ARIMA, SARIMA, VARIMA, etc.) e propusemos o uso de modelos de Machine Learning para esse tipo de aplicação.

Escolhemos um tema a partir de dados de uma competição do Kaggle e estabelecemos um baseline com o Facebook Prophet.

No segundo artigo exploramos a suavização exponencial da nossa série, utilizamos o modelo de Holt Winters, passamos pelo calvário da estacionariedade e fizemos a predição com uso do modelo ARIMA. Em ambos os casos superamos nosso baseline.

Agora é hora de revisitar o Facebook Prophet e ver se com mais parâmetros conseguimos melhorar a predição.

De acordo com o artigo no Facebook Research, o Prophet foi desenvolvido inicialmente com o objetivo de criar previsões de negócios de alta qualidade, no paper há mais detalhes sobre o modelo. Essa biblioteca tenta solucionar as seguintes dificuldades comuns a muitas séries temporais de negócios:

  • Efeitos sazonais causados ​​pelo comportamento humano: ciclos semanais, mensais e anuais, quedas e picos nos feriados.
  • Mudanças na tendência devido a novos produtos e eventos de mercado.
  • Outliers.

Os autores afirmam que, mesmo com as configurações padrão, em muitos casos, sua biblioteca produz previsões tão precisas quanto as fornecidas por analistas experientes.

Além disso, o Prophet possui diversas personalizações intuitivas e facilmente interpretáveis ​​que permitem melhorar gradualmente a qualidade do modelo de previsão. O que é especialmente importante, esses parâmetros são bastante compreensíveis, mesmo para não especialistas em análise de séries temporais.

A propósito, o artigo original é chamado de “Previsão em Escala”, mas não se trata da escala no sentido “usual”, que trata dos problemas computacionais e de infraestrutura de um grande número de programas de trabalho. Segundo os autores, o Prophet deve ser bem dimensionado nas três áreas a seguir:

  • Acessibilidade a um amplo público de analistas, possivelmente sem profundo conhecimento em séries temporais.
  • Aplicabilidade a uma ampla gama de problemas de previsão distintos.
  • Estimativa de desempenho automatizada de um grande número de previsões, incluindo sinalização de problemas em potencial para sua inspeção subsequente pelo analista.

Agora, vamos dar uma olhada em como o Prophet funciona. Em sua essência, esta biblioteca utiliza o modelo de regressão aditiva 𝑦(𝑡) compreendendo os seguintes componentes:

𝑦(𝑡)=𝑔(𝑡)+𝑠(𝑡)+ℎ(𝑡)+ϵ𝑡

Onde:

  • Tendência 𝑔(𝑡) modela mudanças não periódicas.
  • Sazonalidade 𝑠(𝑡) representa mudanças periódicas.
  • Componente de feriados ℎ(𝑡) contribui com informações sobre feriados e eventos.

Abaixo, consideraremos algumas propriedades importantes desses componentes do modelo.

Tendência

A biblioteca do Prophet implementa dois possíveis modelos de tendência para 𝑔(𝑡). O primeiro é chamado de crescimento não linear e saturado. É representado na forma do modelo de crescimento logístico:

Onde:

  • 𝐶 é a capacidade de carga (que é o valor máximo da curva).
  • 𝑘 é a taxa de crescimento (que representa “a inclinação” da curva).
  • 𝑚 é um parâmetro de deslocamento.

Essa equação logística permite modelar o crescimento não linear com saturação, ou seja, quando a taxa de crescimento de um valor diminui com o seu crescimento. Um dos exemplos típicos seria representar o crescimento do público de um aplicativo ou site.

Na verdade, 𝐶 e 𝑘 não são necessariamente constantes e podem variar ao longo do tempo. O Prophet suporta o ajuste automático e manual de sua variabilidade. A própria biblioteca pode escolher pontos ótimos de mudanças de tendência ajustando os dados históricos fornecidos.

Além disso, o Prophet permite que os analistas definam manualmente pontos de mudança da taxa de crescimento e valores de capacidade em diferentes momentos. Por exemplo, os analistas podem ter informações sobre datas de lançamentos anteriores que influenciaram de maneira proeminente alguns indicadores-chave do produto.

O segundo modelo de tendência é um modelo linear por partes simples, com uma taxa de crescimento constante. É mais adequado para problemas sem saturar o crescimento.

Sazonalidade

O componente sazonal 𝑠(𝑡) fornece um modelo flexível de mudanças periódicas devido à sazonalidade semanal e anual.

Os dados sazonais semanais são modelados com variáveis ​​fictícias. Seis novas variáveis ​​são adicionadas: segunda, terça, quarta, quinta, sexta, sábado, que assumem os valores 0 ou 1, dependendo do dia da semana. O recurso domingo não é adicionado porque seria uma combinação linear dos outros dias da semana, e esse fato teria um efeito adverso no modelo.

O modelo de sazonalidade anual no Prophet baseia-se na série de Fourier.

Desde a versão 0.2, você também pode usar séries temporais sub-diárias e fazer previsões sub-diárias, além de empregar o novo recurso de sazonalidade diária.

Feriados e Eventos

O componente ℎ(𝑡) representa dias anormais previsíveis do ano, incluindo aqueles com agendas irregulares, por exemplo, sextas-feiras negras.

Para utilizar esse recurso, o analista precisa fornecer uma lista personalizada de eventos.

Erro

O termo de erro ϵ(𝑡) representa informações que não foram refletidas no modelo. Geralmente é modelado como ruído distribuído normalmente.

Agora que já conhecemos o Prophet vamos recordar os resultados obtidos com a primeira abordagem.

Predição e análise de tendência com FB Prophet — MAPE 28.5876%

A abordagem inicial não considerou nenhum ajuste de parâmetros para o modelo, simplesmente foi passada a série com as observações e nenhuma outra informação adicional.

Para melhorar a predição vamos passar um calendário com os principais eventos envolvendo a NFL ao longo de 2015 e 2016, além disso vamos passar para o modelo, explicitamente, a informação dos feriados americanos, embora o modelo já possua essa informação internamente.
Ao fazer isso, você obtém mais poder e controle sobre as informações. Você pode especificar, inclusive, feriados locais. Para mais detalhes veja esse artigo.

Em resumo, foram passadas as seguintes datas para o modelo:

  • Feriados nacionais americanos.
  • Temporada regular.
  • Playoff.
  • Superbowl.
  • Dia da semana.
  • Final de semana.
  • Final de semana com jogo.
  • Final de semana do draft.

Abaixo a primeira predição com todas as datas declaradas explicitamente para o modelo:

Prophet com todas as datas MAPE 29.8722%

Tivemos uma piora considerável em relação ao baseline. Isso pode ser explicado pelo fato de explicitarmos todos os parâmetros de data para o modelo.

Vamos aplicar a regularização de datas do Prophet para melhorarmos a performance do modelo.

Prophet com todas as datas MAPE 29.54%

A regularização melhorou a performance do modelo, porém não mudou o comportamento dos elementos de predição.

Dado esse fato, vamos nos concentrar nas datas mais importantes da NFL, o período de temporada regular e se os domingos tem jogos ou não e usar a regularização do modelo.

Prophet com todas as datas MAPE 29.49%

Usando apenas duas informações de data e a regularização padrão do Prophet conseguimos melhorar a qualidade da predição em relação a combinação de parâmetros anteriores e ficamos ligeiramente acima ao baseline.

Entretanto, em nenhuma das situações o Prophet foi capaz de bater o Holt Winters ou o ARIMA.

Tanto no ajuste dos parâmetros do Holt Winters, quanto do ARIMA, usamos métodos exaustivos de detecção do melhor intervalo de valores para predição. Já a documentação e exemplos de ajustes de parâmetros envolvendo o Prophet é menos explicita e aparentemente menos abundante.

Sobre otimização de parâmetros

A primeira dica para otimizar um modelo é não sair fazendo testes aleatórios, alterar valores, criar enormes loops ou ranges enormes de valores em um Grid Search ou Random Search para otimizar hiper parâmetros. Isso é especialmente verdadeiro quando se observa os modelos de séries temporais, onde os hiper parâmetros têm um grande efeito nas previsões.

Os valores desses parâmetros não precisam ser perfeitos. Em vez disso, colocá-los na zona correta é o que trará a maior precisão ao modelo. Você consegue isso analisando os dados e entendendo o que seu modelo fará com esses dados quando você alterar cada parâmetro.

A seguir listei os parâmetros do Prophet, no caso das predições da NFL não fiz uma busca exaustiva pelas melhores combinações, portanto uma exploração aprofundada, futuramente, pode trazer melhores resultados.

Crescimento

Esse parâmetro é o mais fácil de entender e implementar, pois você só precisa plotar seus dados para saber o que deve ser. Se você plotar seus dados e vir uma tendência que continua a crescer sem uma percepção real da saturação (ou se o seu especialista em domínio informar que não há saturação com que se preocupar), você definirá esse parâmetro como “linear”.

Se você plotá-lo e vir uma curva que mostra promessas de saturação (ou se estiver trabalhando com valores que você sabe que devem saturar, por exemplo, uso da CPU), você o definirá como “logístico”.

A parte mais difícil desse parâmetro ocorre quando você escolhe o crescimento logístico, pois precisa fornecer o limite (valor máximo que seus dados atingirão) e o piso (valor mínimo que seus dados atingirão) de suas previsões e também dos dados históricos. Esses valores de limite podem mudar ao longo do tempo ou ser um valor definido que você insere o tempo todo.

Este é um daqueles casos em que conversar com um especialista em domínio o ajudará mais. Eles têm uma ideia muito boa do que pode ser esperado para o ano seguinte e quais seriam os valores impossíveis por um período de tempo. Depois de falar com eles, você pode fornecer tetos e pisos muito mais precisos ao longo do tempo.

Feriados

Feriados são períodos em que os dias têm o mesmo tipo de efeito a cada ano. Por exemplo, se você deseja modelar o número de assinantes em uma cidade para onde as pessoas migram durante os períodos festivos, é possível inserir as datas do período festivo em seu modelo usando o parâmetro de feriados.

No caso da NFL, explicitar os parâmetros de feriados, pode ter "roubado" informação de outras variáveis fazendo com que a performance do modelo fosse pior.

No caso do Prophet um outro parâmetro que lida com feriados é holidays_prior_scale. Este parâmetro determina quanto efeito as férias devem ter nas suas previsões.

Pontos de mudança

Os pontos de mudança são os pontos nos seus dados em que há mudanças repentinas e abruptas na tendência. Um exemplo disso seria se você tivesse uma campanha e de repente tivesse 50.000 visitantes mais constantes no seu site. O ponto de mudança será o intervalo de tempo em que essa grande mudança ocorreu.

Existem quatro hiperparâmetros para pontos de mudança: pontos de mudança, n_changepoints, changepoint_range e changepoint_prior_scale.

O parâmetro changepoints é usado quando você fornece as datas do changepoint em vez de o Prophet determiná-las. Depois de fornecer seus próprios pontos de mudança, o Prophet não estimará mais nenhum ponto de mudança. Portanto, é importante que você saiba o que está fazendo.

O changepoint_range geralmente não tem tanto efeito no desempenho. O outro parâmetro, changepoint_prior_scale, está lá para indicar a flexibilidade que os pontos de mudança podem ter. Em outras palavras, quanto os pontos de mudança podem se ajustar aos dados.

Sazonalidades

Esses parâmetros são onde o Prophet brilha, pois você pode fazer grandes melhorias e obter grandes insights alterando apenas alguns valores.

O primeiro grande parâmetro é seasonality_mode. Este parâmetro indica como seus componentes de sazonalidade devem ser integrados às previsões.

O valor padrão aqui é aditivo, com multiplicativo sendo a outra opção. O método aditivo é usado quando sua tendência de sazonalidade for “constante” durante todo o período. Por exemplo, quando você deseja que o seu impacto no crescimento anual da tendência seja o mesmo que em 2010 e 2018. Isso é aplicável nos dados em que a mudança de tendência parece permanecer constante, por exemplo, o número de pessoas que vivem em uma cidade pequena. Isso ocorre porque não esperamos que o crescimento aumente repentinamente em milhões, porque não há infraestrutura para isso.

Por outro lado, quando queremos prever a quantidade de pessoas que vivem em uma cidade em crescimento, o número anual de tendências pode ser muito mais importante nos últimos anos, pois a infraestrutura existe. A taxa de crescimento populacional pode ser muito mais rápida do que teria sido nos primeiros anos. Em um caso como esse, você usará multiplicativo para aumentar a importância das sazonalidades ao longo do tempo.

Como é o caso em todos os lugares, também há um parâmetro seasonality_prior_scale. Esse parâmetro permitirá novamente que suas sazonalidades sejam mais flexíveis.

Ao fazer isso, você obtém mais poder e controle sobre a sazonalidade. Você pode especificar os períodos exatos de cada estação, o que significa que você pode criar “novas” estações. Por exemplo, ao fazer o período 93.3125, você pode adicionar sazonalidade trimestral ao seu modelo. Você também pode adicionar para cada sazonalidade qual deve ser a escala anterior, em vez de todas compartilharem uma escala. Agora, gostaria de poder dizer quais sazonalidades adicionar e qual período elas devem ser, mas cada caso de uso é completamente diferente e um especialista em domínio deve ser contatado para obter recomendações e insights.

Por questões de clareza, se o período for definido em 35, você informará ao modelo que o que aconteceu em um determinado momento provavelmente ocorrerá novamente em 35 dias.

O outro parâmetro que você pode ajustar usando essa técnica é o número de componentes de Fourier (fourier_order) de que a sazonalidade é composta. Agora, para aqueles que conhecem um pouco de matemática, qualquer sinal pode ser representado por uma soma de ondas senoidais e cossenoidais. É assim que o Prophet gera seus sinais de sazonalidade. Com isso, você pode alterar a precisão com que deve começar a representar a curva ou quantas outras curvas podem estar presentes na curva.

MCMC Samples

Este é um assunto complicado. Este parâmetro determina se o modelo usa a estimativa Máxima a posteriori (PAM) ou uma inferência bayesiana completa com o número especificado de amostras de Monte Carlo em Cadeia de Markov (MCMC) para treinar e prever.

Portanto, se você zerar o MCMC, ele fará a estimativa do MAP; caso contrário, será necessário especificar o número de amostras a serem usadas com o MCMC. A inferência bayesiana tem um custo computacional alto, pois você precisa usar pelo menos 1.000 amostras para obter resultados satisfatórios.

Amostras de incerteza

Esse é outro parâmetro que não afeta muito o resultado e deve ser explorado para cada caso de uso.

Conclusões sobre o Prophet

O Prophet é um modelo bastante prático de usar, pode rapidamente ser implantado na fase de prototipagem de um projeto. Com poucas linhas de código é possível gerar predições de qualidade. Há oportunidades de desenvolver métodos para busca dos parâmetros.

Acesse o projeto completo no Github:

https://github.com/SouzaCadu/Time-Series

Referências

https://medium.com/open-machine-learning-course/open-machine-learning-course-topic-9-time-series-analysis-in-python-a270cb05e0b3

https://towardsdatascience.com/implementing-facebook-prophet-efficiently-c241305405a3

--

--