Prophet

O Prophet é um pacote para R e Python usado em produção no Facebook (daí o nome do pacte, fbprophet). Ele implementa o algoritmo de previsão de séries temporais, programado para detectar automaticamente os padrões sazonais de uma série de input. Contudo, é possível customizar alguns inputs de parâmetros manualmente, como indicar a presença de períodos sazonais (semanal ou anual), feriados e changepoints.

No artigo em que os autores descrevem seus métodos (Taylor & Letham, 2017), observa-se uma abordagem prática para a previsão “em escala”, que combina modelos configuráveis com análises de desempenho analíticas em loop. É usado um modelo de regressão modular com parâmetros interpretáveis que podem ser intuitivamente ajustados por analistas com conhecimento de domínio sobre as séries temporais. Segundo a própria equipe de desenvolvimento, o Prophet funciona melhor com séries temporais de frequência diária, com pelo menos um ano de dado, sendo robusto a dados ausentes (NA), mudanças na tendência e outliers.

Os pacotes para R e Python são apenas uma simples interface para cálculos realizados em Stan. Stan é uma plataforma de última geração para modelagem estatística e computação estatística de alto desempenho, toda feita em software livre.

Implementação em python

O pacote e todas suas dependências podem ser instaladas através do pip, sendo recomendado instalar dois pacotes antes:

O prophet segue o modelo de API do sklearn. Cria-se uma instância da classe prophet e depois são chamados seus métodos de ajuste e previsão. A entrada para o Prophet é sempre um dataframe com duas colunas:

  • datas (ds) – em um formato esperado pelos Pandas, idealmente AAAA-MM-DD para uma data ou AAAA-MM-DD HH: MM: SS para um registro de data e hora;
  • dados (y) – numérica e representando a medida que deve ser prevista.

As colunas devem se chamar “ds” para as datas e “y” para os dados. Um arquivo de exemplo é dado pelo tutorial (link no fim do post).

As previsões são então feitas em um dataframe com uma coluna contendo as datas para as quais uma predição deve ser feita. Você pode obter um dataframe que estenda para o futuro um número específico de dias usando o método auxiliar “Prophet.make_future_dataframe”. Por padrão, ele também incluirá as datas do histórico, o que é útil para observar também o ajuste do modelo.

Veja um exemplo de implementação completa no GitHub (script prophet_simple.py).

A saída da previsão será uma dataframe contendo as seguintes colunas, cada uma com seus respectivos limites inferior e superior:

  • ds – data com o modelo calculado (pode ser observado ou previsto)
  • yhat – valor calculado
  • trend – tendência
  • additive_terms – termos aditivos
  • weekly – sazonalidade semanal
  • yearly – sazonalidade anual
  • multiplicative_terms – termos multiplicativos

É possível fazer um gráfico contendo a série observada junto com a modelada e sua previsão, contendo os limites superior e inferior de incertezas, simplesmente chamando o método “Prophet.plot”. Também pode-se fazer um gráfico contendo as componentes da previsão através do método “Prophet.plot_components” – tendência e componentes sazonais anual e semanal.

Exemplo de gráfico contendo valores observados (pontos pretos), modelados (traço azul escuro) e intervalos de incerteza (mancha azul claro).
Exemplo de gráfico com curvas de tendência e de sazonalidade.

Em analogia aos modelos (S)ARIMAX, é possível adicionar um regressor externo atraves do método “prophet.add_regressor”. Veja um exemplo no GitHub (script prophet_regressors.py).

Exemplo de projeção usando regressores exógenos para a mesma série de dados do exemplo anterior

Comparando-se-se os gráficos gerados, é possível ver que o novo modelo com regressores externos acompanha bem mais a série de valores observados, mas ainda não detecta os outliers. Muitas séries têm mudanças abruptas em seu comportamento.

Por padrão, o prophet detecta automaticamente pontos de mudança brusca e permite que a tendência se adapte adequadamente. No entanto, se você deseja ter um controle mais preciso sobre esse processo (por exemplo, se o modelo perdeu uma alteração de taxa ou está super ajustando alterações de taxa no histórico), há vários argumentos de entrada que você pode usar. O número de possíveis pontos de mudança pode ser definido usando o argumento “n_changepoints” e a força deles pode ser ajustada com o parâmetro “changepoint_prior_scale” (por padrão, vale 0,05).

Fontes