Introdução à Feature Engineering para Previsão com Séries Temporais

Kauã Fillipe
Turing Talks
Published in
12 min readOct 9, 2022

Texto escrito por: Kauã Fillipe e Letícia Falconer

Fonte: StudiousGuy

Olá, leitor! Seja bem-vindo a mais um Turing Talks!

No texto de hoje, trataremos sobre Feature Engineering para Séries Temporais, assunto bastante importante dentro da área de Ciência de Dados.

A proposta deste texto é ser uma introdução ao entendimento de como se dá o processo de feature engineering no contexto das séries temporais. Mas, para isso, primeiramente, vamos definir o que são séries temporais, feature engineering e features de uma série temporal. Partindo disso, podemos entender melhor qual a relação entre esses dois conceitos. Para isso, seguiremos a seguinte estrutura:

  1. Séries Temporais
  2. Feature Engineering
  3. Manipulando as Features de uma Série Temporal
  4. Time Features
  5. Lag Time Features
  6. Window Features
  7. Conclusões

Vamos lá?

Séries Temporais

Uma série temporal pode ser definida como um conjunto de observações relacionadas a uma variável disposto como uma sequência no tempo.

Para exemplificar este conceito, vamos utilizar o dataset monthly-airline-passengers.csv, do Datasets repository, fornecido pelo jbrownlee. Nele, temos o registro do número de passageiros em uma linha aérea por mês, dado da seguinte forma:

Veja que estamos trabalhando com um dataset que tem apenas uma variável e que os dados costumam ser registrados de maneira periódica. No nosso exemplo, como dito anteriormente, o registro é realizado considerando o intervalo de 1 mês.

Abaixo, uma visualização dos nossos dados:

Gráfico 1. Exemplo de série temporal: Passageiros de uma companhia área ao longo dos anos.

Feature Engineering

E outro conceito extremamente importante para o texto de hoje é a Feature Engineering. Do que ela se trata e para qual propósito ela serve? Bom, ela é um processo de seleção dos dados originais do nosso dataset e transformação deles em novas features, as quais podem ser utilizadas no aprendizado de máquina, simplificando e melhorando a acurácia do nosso modelo.

Um exemplo muito utilizado desse conceito é o de dados faltantes em um dataset e como lidar com eles, se o correto seria apagá-los ou reescrevê-los, e de que maneira fazer isso. Mas o exemplo do texto de hoje não é esse, e sim sobre manipulação de colunas para melhor aproveitamento dos nossos dados. Vejamos o dataset a seguir, Climate change dataset — Sheet1.csv, que contém coordenadas de cidades e se elas são afetadas pelas mudanças climáticas.

Como podemos ver nas primeiras colunas do dataset, as suas coordenadas estão divididas em latitude e longitude, separadamente. Contudo, essas informações não nos são úteis por si só, mas sim como um conjunto, e existem maneiras melhores de representar esses dados. Mas para relacionarmos um dado com o outro, basta concatenarmos as coordenadas?

Fonte: Giphy

Na verdade, existem maneiras mais fáceis de serem interpretadas pelo nosso modelo. Uma possível abordagem para solucionar esse problema seria transformar as colunas em coordenadas polares! Assim, vamos criar uma coluna que representa a distância da cidade em relação à coordenada zero, e outra com a inclinação, em graus.

Manipulando as Features de uma Série Temporal

Agora que temos os conceitos iniciais bem introduzidos, podemos dar um passo à frente e discutir como tudo isso pode ser aplicado em nossa série temporal.

Como dito anteriormente, podemos utilizar a Feature Engineering para criar colunas em nosso dataset que nos ajudem a fazer poderosas previsões sobre o futuro, mas por onde devemos começar?

Apesar de existirem alguns métodos que podem nos ajudar a criar features que nos beneficiem, como as de DateTime, as LagTime e as Window Features, os quais serão explicados adiante, não existe uma fórmula que nos diga qual a melhor abordagem para chegarmos no resultado esperado. Pelo contrário, é extremamente importante que tenhamos noção do nosso objetivo final, e levemos em consideração os dados que temos disponíveis para criar features específicas para o nosso problema.

Seria correto criar todas as features que conseguirmos, independente de nosso dataset e da previsão futura desejada? Seguramente não. Vejamos o dataset a seguir, cinemaTicket_Ref.csv, com informações a respeito de vendas de ingressos em diferentes cinemas.

Primeiramente, podemos observar que existem 246 cinemas e 48 filmes diferentes em nosso dataset. Desejamos prever as demandas futuras de compras de ingresso, mas como existem diferentes localidades e diversos filmes, suas demandas variam muito, e não é interessante analisarmos todos esses dados simultaneamente. Conhecendo o dataset, devemos considerar o histórico de cada um desses cinemas separadamente, para podermos prever cada um deles futuramente.

Tendo tudo isso em mente, qual o próximo passo a ser tomado? Bom, o correto seria analisarmos cada região de forma independente, verificando a maneira com que seu clima, seus feriados e até mesmo épocas do ano influenciam nas vendas de ingressos. E ainda, poderíamos colocar essas informações externas como novas features em nosso dataset, garantindo uma acurácia ainda melhor para nosso modelo. E isso tudo criando a quantidade mínima necessária de colunas novas em nosso dataset, evitando deixá-lo poluído.

Time Features

São as features que podem ser extraídas dos dados relacionados ao carimbo de data/hora. Nesse caso, temos horário, dia, mês, ano, etc. A partir disso, é possível determinar novas relações interessantes entre os dados e gerar insights importantes para a nossa análise de dados.

Fonte: Towards Data Science

As features de data e hora, ou time features, permitem modelar a dependência temporal, ou seja, se é possível fazer uma previsão a partir do tempo determinado em que o evento ocorreu.

A forma como se extraem as features vai depender da qualidade do dataset com o qual se trabalha. Voltando ao dataset com a quantidade de passageiros em uma linha aérea por mês, por exemplo, veja que podemos extrair features de Ano e Mês da coluna Month. Como o tipo dessa coluna é string e suas informações não estão no formato Timestamp ou dateformat do Pandas, poderíamos obter essas duas novas colunas aplicando o método split para dividir as duas informações de tempo da coluna Month, da seguinte maneira:

Com isso, poderíamos construir gráficos que nos informem sobre o comportamento da quantidade de passageiros ao longo dos meses dentro de cada ano:

Gráfico 2. Passageiros de uma companhia aérea ao longo dos meses de cada ano.

Uma ferramenta bastante útil nesse contexto é a função to_datetime, que transforma argumentos no formato datetime. Ao padronizar o formato de datas do nosso dataset, podemos utilizar uma maior gama de ferramentas disponíveis na biblioteca Pandas, o que nos permite criar outras visualizações, também.

Com o auxílio de bibliotecas interativas como o Plotly, podemos continuar a construir gráficos bem interessantes nesse caso, como o seguinte:

Gráfico 3. Diagrama de média móvel.

Nele, podemos ver que existe, de fato, uma relação entre o nosso alvo, a quantidade de passageiros e o tempo. Nesse gráfico, traçamos uma linha de tendência, disposta através da média móvel dos dados, que indica o comportamento geral da quantidade de passageiros ao longo do tempo. Assim, é possível identificar uma sazonalidade no seu comportamento, de tal modo que, independente do ano, nota-se um aumento significativo da quantidade de passageiros nos meses de julho e agosto em relação aos demais - muito provavelmente por conta do período de férias.

Fonte: Giphy

Além disso, vale mencionar outras técnicas igualmente úteis. Como exemplo, vamos utilizar um novo dataset, da biblioteca Plotly, que representa o preço de 6 ações de empresas de tecnologia em um período de tempo.

É possível extrair diretamente de objetos do tipo Timestamp features de Ano, Mês, Dia e Hora, da seguinte forma:

Mas poderíamos ter aplicado para o caso dos passageiros, se quiséssemos. Com isso, seria possível construir gráficos com a quantidade de passageiros ao longo dos meses de cada ano novamente, e ter uma visualização melhor do que o caminho escolhido no início. Dessa vez, conferimos, com maior clareza, o aspecto sazonal dessa distribuição nos meses de um ano e, também, o aumento do número de passageiros que trafegam por essa companhia com o decorrer dos anos, o que pode indicar um sucesso na imagem da empresa. Observe:

Gráfico 4. Subplots de passageiros de uma companhia área ao longo dos meses de cada ano.

As features de data e hora também podem vir em outros formatos, como o binário, e serem extraídas por meio de outras estratégias. Fica a cargo do cientista de dados decidir qual a melhor abordagem. Essas são features muito importantes em uma série temporal, mas não as únicas. No próximo tópico, trataremos das lag time features.

Lag Time Features

Utilizamos lag time features quando queremos estudar a dependência entre a nossa variável alvo e seus valores em instantes de tempo passado, os quais são chamados de lag. Essa abordagem é muito interessante em cenários como o da previsão de preços de ações de uma empresa. Nesse contexto, podemos tentar prever uma queda ou uma subida no preço de uma ação com base nos valores que ela assumiu em dias anteriores, por exemplo.

Diferente das features de data e hora, as lag time features ajudam a determinar a dependência serial, ou seja, se uma observação dessa série temporal depende e pode ser predita a partir de uma observação anterior no tempo. Se utilizarmos lag 1, estamos adotando uma defasagem de 1 unidade de tempo - 1 dia ou 1 mês atrás, por exemplo. Lag 2 se refere a uma defasagem de 2 unidades de tempo, lag 3, a 3 unidades de tempo, lag 7, a 7 unidades de tempo. Assim, 2 dias atrás, 3 semanas atrás ou 7 meses atrás, respectivamente, dependendo da unidade de tempo com a qual se estiver trabalhando.

Mas, antes de mais nada, precisamos tomar uma decisão: qual o período de atraso que devemos considerar? Usamos 1, 2 ou 8 dias para estudar essa relação? Para isso, existem algumas ferramentas que podem ser úteis para ajudar a determinar esse valor, como a autocorrelação.

A autocorrelação de uma lag (uma defasagem) l pode ser definida como a correlação de todos os pares de observação (v_t, v_t-l) que estão separados por l unidades de tempo, em que v é a nossa variável alvo, e t é um instante de tempo. Essa medida nos informa o quanto a observação de nossa variável alvo em um instante de tempo se relaciona com suas observações passadas, dada uma defasagem l e, portanto, permite ter uma ideia de qual valor adotar para esse atraso.

Podemos analisar a correlação por meio de uma função de autocorrelação (ACF), que pode ser representada graficamente através de um correlograma.

Vamos voltar ao dataset de preços de ações de mercado utilizado anteriormente. Preste atenção que os registros dos preços são feitos a cada semana. Dessa forma, a unidade de tempo que vamos adotar para as lags é de semanas, e não dias, como citado antes.

Podemos criar uma lag utilizando a função shift, indicando o tamanho da defasagem. Veja o exemplo abaixo, demonstrando como poderíamos obter lag 1 dos preços da empresa Amazon:

Note que, devido à defasagem de 1 semana que estamos realizando, há 1 dado faltante na nossa lag feature. Se fizéssemos um shift(5), ou seja, uma defasagem de 5 unidades de tempo (5 semanas, nesse caso), teríamos 5 dados faltantes na coluna de lag feature, e assim por diante.

Bom, foquemos na análise da empresa Netflix. Suponha que você queira predizer o preço das ações da Netflix com base no preço de semanas anteriores, mas não tenha certeza se é melhor predizer o preço com base no preço de 2, 3 ou 10 semanas atrás. Para ter mais segurança da sua escolha, você então utiliza a função plot_acf da biblioteca statsmodels em Python para criar um correlograma e estudar a autocorrelação do preço das ações dessa empresa.

Gráfico 5. Função correlograma (diagrama de autocorrelações) dos preços das ações da Netflix.

Perceba que a autocorrelação decai lentamente conforme o aumento do tamanho das lags e que, como esperado, o preço das ações da Netflix tem correlação com os preços da semana anterior mais do que com o preço de semanas mais distantes no tempo, o que faz bastante sentido. O gráfico abaixo confirma que, de fato, a melhor escolha é utilizar uma defasagem de 1 semana no seu modelo.

Gráfico 6. Regressão Linear.

Window Features

Semelhante às Lag Features, utilizamos as Window Features para relacionar a nossa variável target com as features do passado. Contudo, não estamos mais falando em um instante único de tempo, mas sim um intervalo até o momento atual. Podemos pensar que ela é algo como um resumo de todas as Lag Features até o presente, podendo ser a média desses valores, seu mínimo, seu máximo ou qualquer outra estatística que desejemos utilizar.

Ainda, dependendo se a janela escolhida for fixa ou móvel, as Window Features podem ser categorizadas em Rolling Window e Expanding Window Features.

Rolling Window Features

As Rolling Window Features, como diz no próprio nome, são janelas que se deslocam junto com a série temporal, mas permanecem com um tamanho fixo. A imagem abaixo demonstra esse processo com mais clareza: em laranja temos a janela, com um tamanho de 3, que percorre a série temporal, calculando a soma dos valores.

Imagem 1. Representação das Rolling Window Features por instante de tempo.

Além disso, podemos perceber que os primeiros dois valores da nossa soma se encontram nulos. Isso ocorre, pois como escolhemos uma janela de tamanho 3, não haviam dados o suficiente nos dois primeiros instantes de tempo!

E como aplicar esse conceito em nossa série temporal? No Pandas existe uma função chamada rolling(), que faz todo esse processo por nós. Para demonstrá-la, iremos utilizar o mesmo exemplo da foto acima, mas agora em código!

Observe que a função rolling retorna as janelas com o tamanho desejado, de forma que tivemos que aplicar a função sum() nela para obtermos o resultado esperado. Dessa forma, também poderíamos utilizar qualquer outra estatística, como a média (popularmente conhecida como moving average) ou até mesmo o valor mínimo ou máximo da janela! Abaixo temos um exemplo de como ficaria essa Rolling Window utilizando a média:

Expanding Window Features

Já as Expanding Window Features, são janelas que não possuem tamanho fixo, de modo que incluem todos os dados anteriores ao atual. Na imagem abaixo podemos observar esse processo: em laranja temos a janela, com um tamanho variável, que calcula a média dos valores.

Imagem 2. Representação das Expanding Window Features por instante de tempo.

Abaixo temos um exemplo de como utilizar as Expanding Window Features com python no dataset acima, para calcular a média, utilizando uma função do Pandas chamada expanding():

Além disso, assim como nas Rolling Window Features, também poderíamos utilizar qualquer outra estatística, como o valor mínimo ou máximo da janela! Abaixo temos outro exemplo, agora utilizando o valor máximo da janela:

Conclusões

Lidar com séries temporais é uma das tarefas mais comuns e importantes dentro da área de Ciência de Dados, sendo um ramo com diversas aplicações em empresas. Antes de construir um modelo preditivo com séries temporais, é essencial garantir um bom processo de feature engineering, manipulando os dados do nosso dataset e assegurando que ele possua todas as informações necessárias para que seja feita a previsão e, com isso, melhore a performance do algoritmo usado.

Fonte: Giphy

Podemos adaptar nossos dados de diversas maneiras, levando sempre em consideração a melhor abordagem para nosso problema específico. No Turing Talks de hoje, explicamos sobre as features de data e hora, lag time e window features, além de alguns métodos que podem ser usados para gerá-las. Criamos o mapa mental abaixo com os conceitos básicos para te ajudar a relembrar a teoria.

Imagem 3. Mapa mental de Feature Engineering aplicada em Séries Temporais.

Mas não se confunda, esses métodos não são uma regra! O tema de Feature Engineering vai muito além do contexto das séries temporais e é utilizado na abordagem de outros cenários de modelagem. Caso se interesse em saber mais sobre séries temporais e como manipulá-las utilizando a biblioteca Pandas, recomendamos a leitura do Turing Talks “Manipulação de Séries Temporais com Pandas”. Pode ser que você encontre alguns conceitos e funções que utilizamos aqui também!

Esperamos que você tenha gostado, e muito obrigado por chegar até aqui. Se quiser conhecer um pouco mais sobre o que fazemos no Turing-USP, não deixe de nos seguir nas redes sociais: Facebook, Instagram, LinkedIn e, claro, acompanhar nossos posts no Medium. Para acompanhar ainda mais de perto e participar de nossas discussões e eventos, entre no nosso servidor do Discord.

Um abraço, e até breve!

Referências:

https://machinelearningmastery.com/basic-feature-engineering-time-series-data-python/

https://www.analyticsvidhya.com/blog/2019/12/6-powerful-feature-engineering-techniques-time-series/

https://www.youtube.com/watch?v=KrbV75Mby5E

https://medium.com/data-science-at-microsoft/introduction-to-feature-engineering-for-time-series-forecasting-620aa55fcab0

--

--