Previsão de adoções de animais com Prophet

Read in English

Capa do artigo Previsão de adoções de animais com Prophet

Figura 1 do artigo Previsão de adoções de animais com Prophet

Uma coisa que sempre me interessou, foi preservação ambiental, em especial nossa fauna, houve tempos que fui vegetariano, e devido a alguns problemas que não vem ao caso, hoje ajudo de outras formas, conscientizar a preservação e alimentar e dar carinho para aqueles animais de rua.

Ao pensar nisso lembro da minha universidade, onde nossa pedagoga, Hortência Pessoa, com outros colaboradores administram o projeto Unidos Pelas Patinhas, tal projeto retira os animais das ruas, em especial cachorro e gatos, os vacinam e cuidam até conseguirem alguém que os adote.

Instigado por isso, quando vi o projeto prático da Escola de Data Science do Carlos Melo, não perdi tempo em aplicar ferramentas de Machine Learning em especial o Prophet framework do Facebook aplicado a prevenção de entradas e saídas de animais de institutos como este.

No entanto, a iniciativa Unidos Pelas Patinhas, não possuem um vasto banco de dados organizado, desta forma usarei o dataset da Austin Animal Center. Essa instituição americana provê os serviços públicos de controle dos animais de rua ou os que se perderam dos seus donos, disponibilizando água, abrigo e apoio veterinário para os animais, trabalho muito parecido com a ONG brasileira.

Os dados providos pela instituição do dia 30 de abril de 2020, onde ele contém 117K entradas e 12 variáveis. Estes dados podem ser baixados diretamente no City o Austin Open Data Portal.

Quanto ao modelo utilizado, o Prophet, como já disse é um framework usado nos problemas do Facebook para lidar com séries temporais. Ou seja, é muito forte para lidar com problemas que tenham características de dados de longos períodos (meses ou anos), e que possuam o maior detalhamento histórico possível, com sazonalidades fortes e destacadas e possuindo feriados ou datas especiais conhecidas e tendência de crescimento não linear, que se aproxima de um limite. O framework usa um modelo de séries temporal decomposto, com três componentes principais, sendo eles:


onde:
é a tendência, que modela as mudanças não-periódicas no valor da série temporal;
representa as mudanças periódicas (como sazonalidade semanal, anual, etc);
representa os efeitos dos feriados;
é o erro, as mudanças que não são capturadas pelo modelo.

Desta maneira, podemos unir os dois e analisar dentre os animais que entraram na organização, quanto foram adotados ou retornaram aos seus donos. Mas primeiros vamos conhecer seu dicionário de variáveis:

  • Animal ID - Número de identificação do animal
  • Name - Nome do animal
  • DateTime - Data e hora de entrada do animal
  • MonthYear - Mês e ano de entrada do animal
  • Date of Birth - Data de aniversário do animal.
  • Outcome Type - Tipo de resultado
  • Outcome Subtype - Subtipo de resultado
  • Animal Type - Espécie do animal
  • Sex upon Outcome - Sexo do animal
  • Age Upon Outcome - Idade após o resultado.
  • Breed - Raça do animal.
  • Color - Cor do animal

Assim, podemos ver a cinco primeiras entradas.

Animal ID Name DateTime MonthYear Date of Birth Outcome Type Outcome Subtype Animal Type Sex upon Outcome Age upon Outcome Breed Color
0 A794011 Chunk 2019-05-08 18:20:00 05/08/2019 06:20:00 PM 05/02/2017 Rto-Adopt NaN Cat Neutered Male 2 years Domestic Shorthair Mix Brown Tabby/White
1 A776359 Gizmo 2018-07-18 16:02:00 07/18/2018 04:02:00 PM 07/12/2017 Adoption NaN Dog Neutered Male 1 year Chihuahua Shorthair Mix White/Brown
2 A720371 Moose 2016-02-13 17:59:00 02/13/2016 05:59:00 PM 10/08/2015 Adoption NaN Dog Neutered Male 4 months Anatol Shepherd/Labrador Retriever Buff
3 A674754 NaN 2014-03-18 11:47:00 03/18/2014 11:47:00 AM 03/12/2014 Transfer Partner Cat Intact Male 6 days Domestic Shorthair Mix Orange Tabby
4 A689724 *Donatello 2014-10-18 18:52:00 10/18/2014 06:52:00 PM 08/01/2014 Adoption NaN Cat Neutered Male 2 months Domestic Shorthair Mix Black

Podemos ver então, que cada entrada simboliza um animal que passou na instituição, por exemplo, o Animal A794011 de nome Chunck é um gato macho de 2 anos de idades e entrou no dia oito de maio de 2019 sendo adotado.

Além de entender os dados, antes mesmo de começar a implementação Prophet, efetuei uma análise exploratória identificando a presença de muitos dados nulos, como podemos ver aqui abaixo:

Animal ID               0
Name                36817
DateTime                0
MonthYear               0
Date of Birth           0
Outcome Type            8
Outcome Subtype     64169
Animal Type             0
Sex upon Outcome        3
Age upon Outcome       47
Breed                   0
Color                   0
dtype: int64

Além disto, fiz uma contagem dos tipos de resultado prováveis (Outcome Type ).

Adoption           51722
Transfer           34892
Return to Owner    20636
Euthanasia          7890
Died                1075
Rto-Adopt            611
Disposal             495
Missing               67
Relocate              20
Name: Outcome Type, dtype: int64

Desta forma, identifiquei que dos 117.416 para esta data, 445 animais foram adotados e infelizmente 6.7% sofreram eutanásia. Então devido então ao maior número de casos de adoção, realizei as prevenções com o modelo para os casos dos animais adotados ou retornaram aos seus donos.

É possível salientar que estas representações poderão ser utilizadas quaisquer filtros temporais como dados semanais e diários. Porém, para melhor apresentação neste artigo somente mostrarei os dados semanais, se tiver interesse de observar o trabalho completo o notebook comentado apresenta tais análises.

Como é a distribuição temporal semanal dos dados?

#gráfico semanaris
fig,ax=plt.subplots(figsize=   (10,5))adoptions_dd.resample('W').sum().plot(ax=ax)plt.show()

Pude ver então, que os dados apresentam uma certa constância de distribuição temporal, mesmo sem fazer o treino para separar as partes da série temporal, já é possível deduzir que estes dados apresentam certa tendência e sazonalidade, com uma presença pequena de ruído.

Primeiro foi necessário adicionar as datas de feriados dos Estados Unidos.

#adicionando datas de feriados nacionais do Estado Unidos
modelo=Prophet()modelo2.add_country_holidays(country_name="US")modelo2.fit(prophet_dd)

E então determinar qual período que analisaremos, adotado o valor de 52, o número de semanas em um ano.

#determinar o período
val_fut = modelo.make_future_dataframe(periods=52)

Com parâmetros todos os prontos, realizei as previsões.

# realizar a previsão para o período
forest = modelo.predict(val_fut)

Dessa maneira, podemos ver nossas séries de previsões para os dados semanais, realizando o plot desta.

#Visualizando as previsões
modelo.plot(forest, xlabel="Data", ylabel = "Adoções")

Figura 2 do artigo Previsão de adoções de animais com Prophet

Mesmo já tendo uma noção dos componentes do modelo, realizei a separação, tais componentes podem ser vistas abaixo respectivamente tendência, feriados, finais de semana e férias:

# separar os componentes do modelo
modelo.plot_components(forest2)

Figura 3 do artigo Previsão de adoções de animais com Prophet

Figura 4 do artigo Previsão de adoções de animais com Prophet

Os componentes apresentados, demonstram uma tendência alta, no entanto, com futuro comportamento a linearização no final de 2019, além disso, pude ver a distribuição anual dos feriados, finais de semana e férias, no qual apresentaram que ocorre mais adoções em feriados, com uma maior sazonalidade para os finais de semana e as férias de verão, que ocorrem para o hemisfério no mês de julho.

Para confirmar se o meu modelo funcionou bem, utilizei como métrica de desempenho a validação cruzada para 365 dias, a qual utiliza toda a base de dados, como amostra de teste e treino, particionando e treinando achada interação, como na figura abaixo:


Obtendo então a seguinte tabela, que indica a adaptação dos dados em relação ao tempo, para os cinco primeiros períodos.

from fbprophet.diagnostics import cross_validation
df_cross = cross_validation(modelo, horizon = '365 days')
df_cross.head()
ds yhat yhat_lower yhat_upper y cutoff
0 2016-10-31 15.595742 2.984438 27.270178 16 2016-10-30 12:00:00
1 2016-11-01 16.120902 4.142163 27.308199 16 2016-10-30 12:00:00
2 2016-11-02 14.068885 1.687266 24.864342 13 2016-10-30 12:00:00
3 2016-11-03 13.692068 1.367335 24.736610 21 2016-10-30 12:00:00
4 2016-11-04 14.611005 3.616050 28.060690 26 2016-10-30 12:00:00

Além disso, foi necessário calcular as métricas de desempenho, como podemos observar nos cinco primeiros períodos apresentados abaixo.

from fbprophet.diagnostics import performance_metrics
df_per = performance_metrics(df_cross)
df_per.head()
horizon mse rmse mae mdape coverage
0 36 days 12:00:00 96.537963 9.825373 7.186419 0.262747 0.858447
1 37 days 00:00:00 96.422144 9.819478 7.172768 0.262747 0.858447
2 37 days 12:00:00 97.372306 9.867741 7.265063 0.268853 0.858447
3 38 days 00:00:00 96.863575 9.841929 7.246640 0.269114 0.858447
4 38 days 12:00:00 96.506757 9.823785 7.218155 0.268853 0.863014

Assim foi possível notar que o modelo apresentou uma excelente adaptação aos dados, como pode constatar no gráfico da métrica MDAPE (Median Absolute Percentage Error) abaixo:

from fbprophet.plot import plot_cross_validation_metric
figura = plot_cross_validation_metric(df_cross,metric = 'mdape')

Figura 5 do artigo Previsão de adoções de animais com Prophet

Tal gráfico acima demonstra a adaptação do modelo aos dados, indicando uma excelente atuação, mesmo sendo um teste inicial, demonstra efetivamente que modelos preditivos podem ser aplicados a qualquer categoria de base de dados.

Saliento que o presente projeto tem finalidade didática, tendo em vista que este foi uma prática do curso. Porém, tal projeto mostrou-se claramente a eficiência do uso de técnicas preditivas, aplicado a quaisquer dados, a exemplo de casas de acolhimento de animais, veja o projeto completo no notebook.

Agradeço por ler até aqui, se quiser mais informações sobre tal projeto, entrar em contato comigo. Gostou do trabalho? Se sim, compartilha com os amigos. :)

Continue lendo

Todos os artigos