Transformador de fusão temporal: previsão de séries temporais com aprendizado profundo — Tutorial completo

Crie previsões precisas e interpretáveis

Criado com DALLE [1]

De acordo com [2], Transformador de Fusão Temporal supera todos os modelos proeminentes de Deep Learning para previsão de séries temporais.

Incluindo um destaque Árvore de aumento de gradiente modelo para dados tabulares de séries temporais.

Mas o que é Transformador de Fusão Temporal (TFT)[3] e por que é tão interessante?

Neste artigo, explicamos brevemente as novidades do Transformador de Fusão Temporal e construir um projeto de ponta a ponta Previsão de Demanda Energética. Especificamente, cobriremos:

  • Como preparar nossos dados para o formato TFT.
  • Como construir, treinar e avaliar o modelo TFT.
  • Como obter previsões sobre dados de validação e previsões fora da amostra.
  • Como calcular importâncias do recurso, padrões de sazonalidade, e robustez em eventos extremos usando o modelo integrado atenção interpretável mecanismo.

Vamos mergulhar!

Para uma análise aprofundada da arquitetura do Temporal Fusion Transformer, verifique meu anterior artigo.

Temporal Fuso Ttransformador (TFT) é um modelo baseado em Transformer que aproveita a autoatenção para capturar a dinâmica temporal complexa de múltiplas sequências temporais.

TFT suporta:

  • Várias séries temporais: Podemos treinar um modelo TFT em milhares de séries temporais univariadas ou multivariadas.
  • Previsão multihorizonte: O modelo gera previsões em várias etapas de uma ou mais variáveis ​​alvo — incluindo intervalos de previsão.
  • Características heterogêneas: O TFT oferece suporte a muitos tipos de recursos, incluindo variáveis ​​​​exógenas estáticas e variantes no tempo.
  • Previsões interpretáveis: As previsões podem ser interpretadas em termos de importância variável e sazonalidade.

Uma dessas características é exclusiva Transformador de Fusão Temporal. Abordaremos isso na próxima seção.

Entre modelos notáveis ​​de séries temporais DL (por exemplo, DeepAR[4]), o TFT se destaca por suportar diversos tipos de recursos. Estes são:

  • Variável no tempo conhecido
  • Variável no tempo desconhecido
  • Invariante no tempo reais
  • Invariante no tempo categórico

Por exemplo, imagine que temos um caso de previsão de vendas:

Digamos que temos que prever as vendas de 3 produtos. O num sales é a variável de destino. O CPI index ou de number of visitors e guarante que os mesmos estão desconhecido variável no tempo recursos porque eles só são conhecidos até o momento da previsão. No entanto, holidayse special days e guarante que os mesmos estão conhecido variável no tempo eventos.

A product id is uma categórica invariante no tempo (estática) recurso. Outros recursos que são numéricos e não dependentes do tempo, como yearly_revenue pode ser categorizado como real invariante no tempo.

Antes de passar para o nosso projeto, mostraremos primeiro um mini-tutorial sobre como converter seus dados para o formato formato de série temporal estendida.

Observação: Todas as imagens e figuras deste artigo são criadas pelo autor.

Para este tutorial, usamos o TemporalFusionTransformer modelo do Previsão PyTorch biblioteca e PyTorch Lightning:

pip instalar tocha pytorch-lightning pytorch_forecasting

Todo o processo envolve 3 coisas:

  1. Crie um dataframe do pandas com nossos dados de série temporal.
  2. Envolva nosso dataframe em um Conjunto de dados da série temporal instância.
  3. Passe nosso Conjunto de dados da série temporal instância para TemporalFusionTransformer.

A Conjunto de dados da série temporal é muito útil porque nos ajuda a especificar se os recursos variam no tempo ou são estáticos. Além disso, é o único formato que TemporalFusionTransformer aceita.

Vamos criar um conjunto de dados de treinamento mínimo para mostrar como Conjunto de dados da série temporal obras:

Devemos formatar nossos dados da seguinte maneira: Cada caixa colorida representa uma série temporal diferente, representada por seu group valor.

Figura 1: O quadro de dados sample_data do pandas

A coluna mais importante do nosso dataframe é a time_idx — determina a sequência de amostras. Se não houver observações faltantes, os valores devem aumentar em +1 para cada série temporal.

A seguir, envolvemos nosso dataframe em um Conjunto de dados da série temporal instância:

Todos os argumentos são autoexplicativos: o max_encoder_length define o período de lookback e max_prediction_length especifica quantos pontos de dados serão previstos. Em nosso caso, olhamos 3 etapas de tempo no passado para produzir 2 previsões.

A Conjunto de dados da série temporal instância agora serve como um dataloader. Vamos imprimir um lote e verificar como nossos dados serão repassados ​​ao TFT:

Este lote contém os valores de treinamento [0,1] da primeira série temporal (group 0) e os valores de teste[2,3,4]. Se você executar este código novamente, obterá valores diferentes porque os dados são embaralhados por padrão.

Nosso projeto usará o Diagramas De Carga De Eletricidade20112014 [5] conjunto de dados da UCI. O notebook para este exemplo pode ser baixado em SUA PARTICIPAÇÃO FAZ A DIFERENÇA:

Este conjunto de dados contém o uso de energia (em KWs) de 370 clientes/consumidores com frequência de 15 minutos. Os dados abrangem 4 anos (2011–2014).

Alguns consumidores foram criados depois de 2011, portanto seu consumo de energia inicialmente é zero.

Fazemos pré-processamento de dados de acordo com [3]:

  • Agregue nossa variável alvo power_usage por hora.
  • Encontre a data mais antiga para cada série temporal em que a potência é diferente de zero.
  • Crie novos recursos: month, day, hour e day_of_week.
  • Selecione todos os dias entre 2014–01–01 e 2014–09–07.

Vamos começar:

Baixar dados

wget https://archive.ics.uci.edu/ml/machine-learning-databases/00321/LD2011_2014.txt.zip
!descompactar
LD2011_2014.txt.zip

Pré-processamento de dados

Cada coluna representa um consumidor. Mais inicial power_usage os valores são 0.

A seguir, agregamos dados por hora. Devido ao tamanho e complexidade do modelo, treinamos nosso modelo apenas em 5 consumidores (para aqueles com valores diferentes de zero).

Agora, preparamos nosso conjunto de dados para o Conjunto de dados da série temporal formatar. Observe que cada coluna representa uma série temporal diferente. Conseqüentemente, ‘derretemos’ nosso dataframe, de modo que todas as séries temporais sejam empilhadas verticalmente em vez de horizontalmente. No processo, criamos nossos novos recursos.

O dataframe final pré-processado é chamado time_df. Vamos imprimir seu conteúdo:

A time_df agora está no formato adequado para o Conjunto de dados da série temporal. Como você já deve ter adivinhado, como a granularidade é horária, o hours_from_start variável será a índice de tempo.

Análise exploratória de dados

A escolha de 5 consumidores/série temporal não é aleatória. O power usage de cada série temporal tem propriedades diferentes, como o valor médio:

time_df[['consumer_id','power_usage']].groupby('consumer_id').mean()

Vamos representar graficamente o primeiro mês de cada série temporal:

Figura 2: O primeiro mês de todas as 5 séries temporais/consumidores.

Não há tendência perceptível, mas cada série temporal tem sazonalidade e amplitude ligeiramente diferentes. Podemos experimentar e verificar ainda mais a estacionariedade, decomposições de sinais e assim por diante, mas no nosso caso, nos concentramos apenas no aspecto de construção do modelo.

Além disso, observe que outros métodos de previsão de séries temporais, como ARIMA deve satisfazer alguns requisitos (por exemplo, a série temporal deve primeiro tornar-se estacionária). Com o TFT, podemos deixar nossos dados como estão.

Criar DataLoaders

Nesta etapa, passamos nosso time_df ao TimeSeriesDataSet formato que é imensamente útil porque:

  • Isso nos poupa de escrever nosso próprio Dataloader.
  • Podemos especificar como o TFT lidará com os recursos do conjunto de dados.
  • Podemos normalizar nosso conjunto de dados com facilidade. No nosso caso, a normalização é obrigatória porque todas as sequências temporais diferem em magnitude. Assim, usamos o Normalizador de grupo para normalizar cada série temporal individualmente.

Nosso modelo usa uma janela lookback de uma semana (7*24) para prever o uso de energia nas próximas 24 horas.

Além disso, observe que o hours_from_start é o índice de tempo e um recurso que varia no tempo. O power_usage é nossa variável alvo. Para fins de demonstração, nosso conjunto de validação é o último dia:

Modelo de linha de base

A seguir, a etapa que quase todo mundo esquece: um modelo básico. Especialmente na previsão de séries temporais, você ficará surpreso com a frequência com que um preditor ingênuo supera até mesmo um modelo mais sofisticado!

Como base ingênua, prevemos a curva de uso de energia do dia anterior:

Treinando o modelo do transformador de fusão temporal

Podemos treinar nosso modelo TFT usando o familiar Treinador interface do PyTorch Lightning.

Observe o seguinte:

  • Usamos o Parada antecipada retorno de chamada para monitorar a perda de validação.
  • Usamos Quadro tensor para registrar nossas métricas de treinamento e validação.
  • Nosso modelo usa Perda de Quantil — um tipo especial de perda que nos ajuda a gerar os intervalos de previsão. Para mais informações sobre a função Quantile Loss, verifique este artigo.
  • usamos 4 cabeças de atenção, como o artigo original.

Agora estamos prontos para construir e treinar nosso modelo:

É isso! Após 6 épocas, o EarlyStopping entra em ação e interrompe o treinamento.

Carregue e salve o melhor modelo

Não se esqueça de salvar seu modelo. Embora possamos resolver isso, a opção mais segura é salvar a melhor época diretamente:

!zip -r model.zip relâmpago_logs/lightning_logs/versão_1/*

Para carregar o modelo novamente, descompacte modelo.zip e execute o seguinte - lembre-se apenas do melhor caminho do modelo:

Verifique o Tensorboard

Dê uma olhada mais de perto nas curvas de treinamento e validação com o Tensorboard:

Avaliação de modelo

Obtenha previsões no conjunto de validação e calcule a média P50 (mediana quantílica) fora:

As duas últimas séries temporais apresentam perdas um pouco maiores porque sua magnitude relativa também é alta.

Plotar previsões em dados de validação

Se passarmos o mode=raw na prever() método, obtemos mais informações, incluindo previsões para todos os sete quantis. Também temos acesso aos valores de atenção (mais sobre isso mais tarde).

Dê uma olhada mais de perto no raw_predictions variável:

Usamos o plot_predição() para criar nossos enredos. Claro, você pode criar seu próprio gráfico personalizado — o plot_predição() tem o benefício extra de adicionar os valores de atenção.

Observação: Nosso modelo prevê os próximos 24 pontos de dados numa única tentativa. Este não é um cenário de previsão contínua onde um modelo prevê um solteiro valoriza cada vez e ‘costura’ todas as previsões.

Criamos uma parcela para cada consumidor (5 no total).

Figura 3: Previsões sobre dados de validação para MT_002
Figura 4: Previsões sobre dados de validação para MT_004
Figura 5: Previsões sobre dados de validação para MT_005
Figura 6: Previsões sobre dados de validação para MT_006
Figura 7: Previsões sobre dados de validação para MT_008

Os resultados são bastante impressionantes.

NOSSO Transformador de Fusão Temporal o modelo foi capaz de capturar o comportamento de todas as 5 séries temporais, tanto em termos de sazonalidade quanto de magnitude!

Além disso, observe que:

  • Não realizamos nenhum ajuste de hiperparâmetros.
  • Não implementamos nenhuma técnica sofisticada de engenharia de recursos.

Em uma seção subsequente, mostramos como melhorar nosso modelo com otimização de hiperparâmetros.

Traçar previsões para uma série temporal específica

Anteriormente, traçamos previsões nos dados de validação usando o idx argumento, que itera em todas as séries temporais em nosso conjunto de dados. Podemos ser mais específicos e produzir previsões em uma série temporal específica:

Figura 7: Previsão do dia seguinte para MT_004 no conjunto de treinamento

In Figura 7, traçamos o dia seguinte MT_004 consumidor para índice de tempo=26512.

Lembre-se, nossa coluna de indexação de tempo hours_from_start começa em 26304 e podemos obter previsões a partir de 26388 (porque definimos anteriormente min_encoder_length=max_encoder_length // 2 que é igual a 26304 + 168//2=26388

Previsões fora da amostra

Vamos criar previsões fora da amostra, além do ponto de dados final dos dados de validação – que é 2014–09–07 23:00:00

Tudo o que precisamos fazer é criar um novo dataframe que contenha:

  • O número de N=max_encoder_length datas anteriores, que funcionam como a janela de lookback - o dados do codificador na terminologia TFT.
  • As datas futuras de tamanho max_prediction_length para o qual queremos calcular nossas previsões - o dados do decodificador.

Podemos criar previsões para todas as nossas 5 séries temporais ou apenas uma. Figura 7 mostra as previsões fora da amostra para o consumidor MT_002:

Figura 7: Previsão do dia seguinte para MT_002

A previsão precisa é uma coisa, mas a explicabilidade também é muito importante hoje em dia.

E é ainda pior para os modelos de Deep Learning, que são considerados caixas pretas. Métodos como LIME e FORMAR podem fornecer explicabilidade (até certo ponto), mas não funcionam bem para séries temporais. Além disso, são métodos post-hoc externos e não estão vinculados a um modelo específico.

Transformador de Fusão Temporal fornece três tipos de interpretabilidade:

  • Em termos de sazonalidade: TFT aproveita seu romance Atenção Multi-Cabeça Interpretável mecanismo para calcular a importância dos passos de tempo passados.
  • Em termos de recursos: TFT aproveita sua Rede de seleção variável módulo para calcular a importância de cada recurso.
  • Robustez de eventos extremos: Podemos investigar como as séries temporais se comportam durante eventos raros

Se você quiser aprender em profundidade sobre o funcionamento interno do Atenção Multi-Cabeça Interpretável e Rede de seleção variável, verifique meu artigo anterior.

Interpretabilidade em termos de sazonalidade

O TFT explora os pesos da atenção para compreender os padrões temporais em intervalos de tempo passados.

As linhas cinzas em todos os gráficos anteriores representam os escores de atenção. Olhe para esses gráficos novamente – você percebe alguma coisa? Figura 8 mostra as descobertas de Figura 7 e também leva em conta as pontuações de atenção:

Figura 8: Previsão do dia seguinte para MT_001 com sazonalidades exibidas

As pontuações de atenção revelam o quão impactantes são esses intervalos de tempo em que o modelo produz sua previsão. Os pequenos picos reflectem a sazonalidade diária, enquanto o pico mais elevado no final provavelmente implica a sazonalidade semanal.

Se calcularmos a média das curvas de atenção em todos os intervalos de tempo e séries temporais (não apenas nas 5 que usamos neste tutorial), obteremos a forma de aparência simétrica em Figura 9 do papel TFT:

Figura 9: Conjunto de dados de padrões temporais para eletricidade (fonte)

Questão: Que bom é isso? Não podemos simplesmente estimar os padrões de sazonalidade com métodos como gráficos ACF, decomposição do sinal temporal, etc.?

Responda: Verdadeiro. No entanto, estudar os pesos de atenção do TFT tem vantagens extras:

  1. Podemos confirmar que nosso modelo captura a aparente dinâmica sazonal de nossas sequências.
  2. Nosso modelo também pode revelar padrões ocultos porque os pesos de atenção das janelas de entrada atuais consideram todas as entradas passadas.
  3. O gráfico de pesos de atenção não é o mesmo que um gráfico de autocorrelação: o gráfico de autocorrelação refere-se a uma sequência específica, enquanto os pesos de atenção aqui se concentram no impacto de cada intervalo de tempo, observando todas as covariáveis ​​e séries temporais.

Interpretabilidade em termos de recursos

A Rede de seleção variável componente do TFT pode facilmente estimar o importâncias do recurso:

Figura 10: Apresenta importâncias nos dados de validação

In Figura 10, notamos o seguinte:

  • A hour e day_of_week têm pontuações fortes, tanto como observações passadas quanto como covariáveis ​​futuras. O benchmark no artigo original compartilha a mesma conclusão.
  • A power_usage é obviamente a covariável observada de maior impacto.
  • A consumer_id não é muito significativo aqui porque usamos apenas 5 consumidores. No artigo do TFT, onde os autores utilizam todos os 370 consumidores, esta variável é mais significativa.

Observação: Se sua variável estática de agrupamento não for importante, é muito provável que seu conjunto de dados também possa ser modelado igualmente bem por um único modelo de distribuição (como ARIMA).

Detecção de eventos extremos

As séries temporais são notórias por serem suscetíveis a mudanças repentinas em suas propriedades durante eventos raros (também chamados de choques).

Pior ainda, esses eventos são muito elusivos. Imagine se sua variável alvo se tornasse volátil por um breve período porque uma covariável muda silenciosamente o comportamento:

Isso é algum ruído aleatório ou um padrão persistente oculto que escapa ao nosso modelo?

Com o TFT, podemos analisar a robustez de cada recurso individual em toda a sua faixa de valores. Infelizmente, o conjunto de dados atual não apresenta volatilidade ou eventos raros – estes são mais prováveis ​​de serem encontrados em dados financeiros, de vendas e assim por diante. Ainda assim, mostraremos como calculá-los:

Alguns recursos não têm todos os seus valores presentes no conjunto de dados de validação, então mostramos apenas os hour e consumer_id:

Figura 11: Previsões versus valores reais (médias normalizadas) por hora
Figura 12: Previsões versus valores reais (médias normalizadas) em consumer_id

Em ambas as Figuras, os resultados são animadores. Em Figura 12, percebemos que o consumidor MT_004 apresenta desempenho ligeiramente inferior em comparação com outros consumidores. Poderíamos verificar isso se normalizarmos a perda P50 de cada consumidor com o uso médio de energia que calculamos anteriormente.

As barras cinzas denotam a distribuição de cada variável. Uma coisa que sempre faço é descobrir quais valores têm frequência baixa. Em seguida, verifico o desempenho do modelo nessas áreas. Assim, você pode detectar facilmente se o seu modelo captura o comportamento de eventos raros.

Em geral, você pode usar esse recurso TFT para testar pontos fracos em seu modelo e prosseguir com uma investigação mais aprofundada.

Podemos usar perfeitamente Transformador de Fusão Temporal com Optar para realizar o ajuste de hiperparâmetros:

O problema é que como o TFT é um modelo baseado em Transformer, você precisará de recursos de hardware significativos!

Transformador de Fusão Temporal é sem dúvida um marco para a comunidade Time-Series.

O modelo não apenas alcança resultados SOTA, mas também fornece uma estrutura para a interpretabilidade das previsões. O modelo também está disponível no Dardos biblioteca python, que é baseada na biblioteca PyTorch Forecasting.

Por fim, se você tem curiosidade em conhecer a arquitetura do Transformador de Fusão Temporal detalhadamente, verifique artigo complementar no papel original.

Transformador de fusão temporal: previsão de séries temporais com aprendizado profundo — Tutorial completo republicado da fonte https://towardsdatascience.com/temporal-fusion-transformer-time-series-forecasting-with-deep-learning-complete-tutorial-d32c1e51cd91?source= rss—-7f60cf5620c9—4 via https://towardsdatascience.com/feed

<!–

->

Carimbo de hora:

Mais de Consultores Blockchain