Prophet — Prevendo o futuro em Séries Temporais

Apesar de ser uma tarefa comum no campo de data science, realizar previsões em Séries Temporais é uma tarefa árdua e que exige profundo conhecimento.

Prophet — Prevendo o futuro em Séries Temporais
Economic photo created by rawpixel.com - www.freepik.com
...
Designed by Freepik

Séries temporais são amplamente utilizadas por empresas para identificar padrões ou prever valores futuros com base em resultados anteriores. Apesar de comum no campo de data science, realizar previsões (forecasting) em séries temporais é uma tarefa árdua e que exige profundo conhecimento.

Dada essa dificuldade, aliada a escassez de especialistas, a utilização de frameworks pode auxiliar na realização de previsões eficientes. Uma das ferramentas disponíveis capaz de realizar previsões de maneira eficiente e automatizada é o Prophet, um framework open-source desenvolvido e mantido pelo Facebook.

Objetivos

Neste artigo iremos demonstrar a utilização do Prophet realizando a previsão do número de desfechos positivos — que são adotados ou retornam para seu dono — sobre um dataset de um centro de animais de Austin, no Texas.

Ao final desse artigo você terá noções de:

  1. Como o Prophet funciona;
  2. Quais são os principais recursos do framework;
  3. Quais as suas limitações e
  4. Como criar, treinar e avaliar um modelo de forecasting simples.

Séries Temporais

Séries temporais tratam de observações de uma variável realizadas em diferentes instantes de tempo (seja diária, mensal ou trimestralmente) e podem ser utilizadas tanto para identificar padrões de comportamento quanto para realizar previsões a partir de dados históricos.

Forecasting

Forecasting (ou previsão) em séries temporais é uma técnica comum no campo de Data Science, capaz de auxiliar as organizações a realizarem previsão de demanda, detecção de anomalias e definição de metas.

Ainda que seja uma atividade comum, devido a sua variedade, é altamente complexa, exigindo conhecimentos avançados sobre séries temporais.

Diante dessa complexidade, a utilização de frameworks pode auxiliar na realização de previsões eficientes, mesmo sem possuir profundo conhecimento sobre a série.

O Prophet

O Prophet, framework open-source do Facebook, é uma das ferramentas utilizadas para de realizar previsões em séries temporais. Disponível para Python e R, ele é capaz de realizar previsões de maneira eficiente e automatizada.

Facebook Prophet example graphic

Construído para resolver problemas específicos do Facebook, o Prophet é eficiente para lidar com séries temporais que possuam as seguintes características:

  • Observações horárias, diárias ou semanais com pelo menos alguns meses (preferencialmente um ano) de histórico;
  • Sazonalidades, em escala humana, fortes e destacadas (dia da semana ou período do ano);
  • Feriados ou datas importantes previamente conhecidos; e
  • Tendência de crescimento não linear que se aproximam de um limite.

Ele utiliza o modelo de séries temporais decomposto com três componentes principais: tendência (g), sazonalidade (s) e feriados (h), combinados na seguinte equação:

y(t)=g(t)+s(t)+h(t)+εt

O Problema

Para este artigo realizamos previsões sobre o número de desfechos positivos de animais utilizando o conjunto de dados (dataset) do Austin Animal Center, no Texas. Esse dataset possui mais de 126.000 linhas e 12 colunas, onde cada linha representa um desfecho por animal por encontro.

Nota: as etapas intermediárias — análise exploratória e tratamento dos dados — foram omitidas pois fogem do objetivo deste artigo.

Criando o modelo de forecasting

Após analisar o dataset criamos um dataframe* adoptions_df contendo apenas os registros de desfechos positivos do conjunto original.

Esse dataframe possui 2 colunas, data do evento e contador, sendo que o contador possui valor 1 para todos os registros.

*Um dataframe é a principal estrutura de dados do pandas, ela é bidimensional, possui eixos nomeados (linhas e colunas) e nos permite realizar operações aritméticas tanto nas linhas quanto nas colunas.

Preparando os dados para o Prophet

Segundo a documentação oficial, para criar o modelo de forecasting, precisamos que o dataframe contenha apenas duas colunas: DS e Y, onde DS representa a data e Y é a medida que desejamos prever.

Conseguimos obter esse resultado facilmente no python utilizando pandas com o comando:

prophet_df = adoptions_df.resample('D').sum().reset_index().rename(columns=
{'DateTime': 'ds', 'OutcomeCount': 'y'})

No exemplo acima, criamos um novo dataframe prophet_df a partir dos dados contidos em adoptions_df agrupados por dia e no formato esperado pelo Prophet (com as colunas DS e Y)

Treinando o modelo

Com o dataframe preparado e no formato aceito, podemos criar nosso modelo de forecasting.

# importar bibliotecas
from fbprophet import Prophet

# instanciar o modelo
model = Prophet()

# adicionar feriados
model.add_country_holidays(country_name='US')

# treinar o modelo
model.fit(prophet_df)
  1. model.add_country_holidays(country_name="US")adicionamos os feriados americanos ao modelo — conforme descrito anteriormente, holidays (feriados) é um dos três componentes principais utilizados na equação do modelo utilizado pelo framework e como o dataset trata de dados norte americanos, utilizamos os feriados já definidos no Prophet.
  2. model.fit(prophet_df) Realizamos o treinamento do modelo instanciado utilizando os dados preparados na etapa anterior.

Realizando previsões

Para realizar previsões com base no modelo treinado, primeiro criamos um dataframe com as datas futuras do período que desejamos prever, lembrando que, quanto mais distante o período, menor será a taxa de acerto.

Nesse exemplo, utilizamos um período futuro de 365 dias.

# determinar o período de dias para previsão
future = model.make_future_dataframe(periods=365)

# realizar a previsão para o período estabelecido
forecast = model.predict(future)

Podemos visualizar os dados e as previsões em um gráfico:

model.plot(forecast, xlabel='Data', ylabel='Adoções')

Avaliação do modelo

Com o modelo criado e treinado, precisamos avaliar seu desempenho, para sabermos se ele é eficiente ou não e, se é necessário realizarmos ajustes em seus parâmetros.

Para avaliar nosso modelo utilizamos a técnica de cross validation, disponível no Prophet, especificando um horizonte de previsões de 180 dias.

# importar pacotes necessários
from fbprophet.diagnostics import cross_validation

#criamos o dataframe de validação
df_cv = cross_validation(model, horizon='180 days')

Com exceção do horizonte os demais valores foram utilizados conforme padrão do Prophet, que segundo a documentação são:

  1. tamanho do período inicial de treino: initial = 3x horizon;
  2. espaço entre as datas de corte: period = horizon / 2.

Assim nosso dataframe de validação foi gerado com um horizonte de 180 dias, iniciando com 540 dias de dados de treino no primeiro corte e fazendo previsões a cada 90 dias. Em nossa série temporal de 8 anos, isso corresponde a 23 previsões de teste.

Com os dados de validação prontos, extraímos as métricas de desempenho e visualizamos em um gráfico.

# importar pacotes
from fbprophet.plot import plot_cross_validation_metric
from fbprophet.diagnostics import performance_metrics

# extrair métricas de desempenho
df_p = performance_metrics(df_cv)

# exibir métricas de desempenho em um gráfico
fig = plot_cross_validation_metric(df_cv, metric='mape')

Conclusão

O Prophet é uma ferramenta simples que nos possibilita fazer previsões em séries temporais — desde que dentro das limitações do framework — sem que haja a necessidade de possuir conhecimentos profundos.

Ainda que simples ela é muito poderosa, pois, com sua abordagem analyst-in-the-loop, é possível atingir excelentes resultados realizando “tunning” dos parâmetros e/ou dados.

Para o dataset estudado, esse framework se mostrou eficiente mesmo em suas configurações padrão, mostrando ser acessível para todos os analistas.

Referências

Análise de séries temporais

https://www.inf.ufsc.br/~marcelo.menezes.reis/Cap4.pdf

Documentação do Pandas.DataFrame

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html

Documentação oficial do Prophet

https://facebook.github.io/prophet/docs/quick_start.html#python-api

Taylor SJ, Letham B. 2017. Forecasting at scale. PeerJ Preprints 5:e3190v2

https://doi.org/10.7287/peerj.preprints.3190v2

Austin Animal Center

https://www.austintexas.gov/content/austin-animal-center


Projeto

Confira o notebook contendo a análise completa desse dataset através do link:

https://github.com/virb30/data_science/blob/master/notebooks/010_Forecasting_em_S%C3%A9ries_Temporais.ipynb