Trasformatore di fusione temporale: previsione delle serie temporali con deep learning: tutorial completo

Creare previsioni accurate e interpretabili

Creato con DALLE [1]

Secondo [2], Trasformatore di fusione temporale supera tutti i principali modelli di deep learning per la previsione delle serie temporali.

Incluso un in primo piano Albero di potenziamento del gradiente modello per dati di serie temporali tabellari.

Ma cosa è Trasformatore di fusione temporale (TFT)[3] e perché è così interessante?

In questo articolo spieghiamo brevemente le novità di Trasformatore di fusione temporale e costruire un progetto end-to-end Previsione della domanda energetica. Nello specifico, tratteremo:

  • Come preparare i nostri dati per il formato TFT.
  • Come costruire, addestrare e valutare il modello TFT.
  • Come ottenere previsioni sui dati di convalida e previsioni fuori campione.
  • Come calcolare caratteristiche di importanza, modelli di stagionalità, ed robustezza agli eventi estremi utilizzando il modello integrato attenzione interpretabile meccanismo.

Immergiti!

Per un'analisi approfondita dell'architettura Temporal Fusion Transformer, consulta il mio precedente articolo.

Temporale Fuso Ttrasformatore (TFT) è un modello basato su Transformer che sfrutta l'autoattenzione per catturare le complesse dinamiche temporali di più sequenze temporali.

TFT supporta:

  • Serie temporali multiple: Possiamo addestrare un modello TFT su migliaia di serie temporali univariate o multivariate.
  • Previsioni multi-orizzonte: Il modello produce previsioni in più fasi di una o più variabili target, inclusi gli intervalli di previsione.
  • Caratteristiche eterogenee: TFT supporta molti tipi di funzionalità, comprese le variabili esogene statiche e variabili nel tempo.
  • Previsioni interpretabili: Le previsioni possono essere interpretate in termini di importanza variabile e stagionalità.

Uno di questi tratti è unico per Trasformatore di fusione temporale. Tratteremo questo nella prossima sezione.

Tra i modelli di serie temporali DL più importanti (ad esempio, DeepAR[4]), TFT si distingue perché supporta vari tipi di funzionalità. Questi sono:

  • Variabile nel tempo conosciuto
  • Variabile nel tempo Sconosciuto
  • Invariante nel tempo di rose
  • Invariante nel tempo categorico

Ad esempio, immaginiamo di avere a caso di previsione delle vendite:

Diciamo che dobbiamo prevedere le vendite di 3 prodotti. IL num sales è la variabile di destinazione. IL CPI index oppure number of visitors sono sconosciuto variabile nel tempo caratteristiche perché sono note solo fino al momento della previsione. Tuttavia, holidaysed special days sono noto, variabile nel tempo eventi.

I product id is una categoriale tempo-invariante (statica). caratteristica. Altre caratteristiche che sono numeriche e non dipendenti dal tempo come yearly_revenue può essere classificato come reale invariante nel tempo.

Prima di passare al nostro progetto, mostreremo innanzitutto un mini-tutorial su come convertire i tuoi dati nel file formato di serie temporali estese.

Nota: Tutte le immagini e le figure in questo articolo sono create dall'autore.

Per questo tutorial utilizziamo il file TemporalFusionTransformer modello dal Previsione PyTorch libreria e PyTorch Lightning:

pip installa la torcia pytorch-lightning pytorch_forecasting

L'intero processo coinvolge 3 cose:

  1. Crea un dataframe panda con i nostri dati di serie temporali.
  2. Avvolgi il nostro dataframe in un file Set di dati TimeSeries esempio.
  3. Passa il nostro Set di dati TimeSeries istanza a TemporalFusionTransformer.

I Set di dati TimeSeries è molto utile perché ci aiuta a specificare se le funzionalità sono variabili nel tempo o statiche. Inoltre, è l'unico formato che TemporalFusionTransformer accetta.

Creiamo un set di dati di training minimo per mostrare come Set di dati TimeSeries lavori:

Dovremmo formattare i nostri dati nel modo seguente: Ogni casella colorata rappresenta una serie temporale diversa, rappresentata dal suo group valore.

Figura 1: Il frame di dati panda sample_data

La colonna più importante del nostro dataframe è il time_idx — determina la sequenza dei campioni. Se non ci sono osservazioni mancanti, i valori dovrebbero aumentare di +1 per ogni serie temporale.

Successivamente, avvolgiamo il nostro dataframe in un file Set di dati TimeSeries esempio:

Tutti gli argomenti sono autoesplicativi: Il max_encoder_length definisce il periodo di ricerca e max_prediction_length specifica il numero di punti dati che verranno previsti. Nel nostro caso, guardiamo indietro di 3 passaggi temporali nel passato per produrre 2 previsioni.

I Set di dati TimeSeries l'istanza ora funge da caricatore di dati. Stampiamo un batch e controlliamo come i nostri dati verranno passati a TFT:

Questo batch contiene i valori di training [0,1] dalla prima serie temporale (group 0) e i valori di prova[2,3,4]. Se esegui nuovamente questo codice, otterrai valori diversi perché i dati vengono mescolati per impostazione predefinita.

Il nostro progetto utilizzerà il file ElettricitàDiagrammi di carico20112014 , set di dati dell'UCI. Il notebook per questo esempio può essere scaricato da qui:

Questo set di dati contiene il consumo energetico (in KW) di 370 clienti/consumatori con una frequenza di 15 minuti. I dati abbracciano 4 anni (2011–2014).

Alcuni consumatori sono stati creati dopo il 2011, quindi il loro consumo energetico inizialmente è pari a zero.

Effettuiamo la preelaborazione dei dati secondo ,:

  • Aggrega la nostra variabile target power_usage per ora.
  • Trova la prima data per ogni serie temporale in cui la potenza è diversa da zero.
  • Crea nuove funzionalità: month, day, hour ed day_of_week.
  • Seleziona tutti i giorni compresi 2014–01–01 ed 2014–09–07.

Iniziamo:

Scarica i dati

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

Pre-elaborazione dei dati

Ogni colonna rappresenta un consumatore. La maggior parte iniziale power_usage i valori sono 0.

Successivamente, aggreghiamo i dati orari. A causa delle dimensioni e della complessità del modello, addestriamo il nostro modello solo su 5 consumatori (per quelli con valori diversi da zero).

Ora prepariamo il nostro set di dati per il Set di dati TimeSeries formato. Si noti che ciascuna colonna rappresenta una serie temporale diversa. Quindi, "sciogliamo" il nostro dataframe, in modo che tutte le serie temporali siano impilate verticalmente anziché orizzontalmente. Nel processo, creiamo le nostre nuove funzionalità.

Viene chiamato il dataframe preelaborato finale time_df. Stampiamo il suo contenuto:

I time_df è ora nel formato corretto per il file Set di dati TimeSeries. Come ormai avrai intuito, poiché la granularità è oraria, il file hours_from_start la variabile sarà la indice temporale.

Analisi dei dati esplorativi

La scelta di 5 consumatori/serie temporali non è casuale. IL power usage di ogni serie temporale ha proprietà diverse, come il valore medio:

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

Tracciamo il primo mese di ogni serie temporale:

Figura 2: Il primo mese di tutte e 5 le serie temporali/consumatori.

Non esiste una tendenza evidente, ma ogni serie temporale ha stagionalità e ampiezza leggermente diverse. Possiamo sperimentare ulteriormente e verificare la stazionarietà, le scomposizioni dei segnali e così via, ma nel nostro caso ci concentriamo solo sull'aspetto della costruzione del modello.

Inoltre, nota che altri metodi di previsione delle serie temporali come ARIMA deve soddisfare alcuni requisiti (ad esempio, la serie temporale deve prima diventare stazionaria). Con TFT, possiamo lasciare i nostri dati così come sono.

Crea DataLoader

In questo passaggio, passiamo il nostro time_df Vai all’email Set di dati di serie temporali formato che è immensamente utile perché:

  • Ci evita di scrivere il nostro Dataloader.
  • Possiamo specificare come TFT gestirà le funzionalità del set di dati.
  • Possiamo normalizzare il nostro set di dati con facilità. Nel nostro caso, la normalizzazione è obbligatoria perché tutte le sequenze temporali differiscono in grandezza. Pertanto, utilizziamo il GroupNormalizer per normalizzare ciascuna serie temporale individualmente.

Il nostro modello utilizza una finestra temporale di una settimana (7*24) per prevedere il consumo energetico delle prossime 24 ore.

Inoltre, si noti che il hours_from_start è sia l'indice temporale che una caratteristica che varia nel tempo. IL power_usage è la nostra variabile target. A scopo dimostrativo, il nostro set di convalida è l'ultimo giorno:

Modello di base

Successivamente, il passaggio che quasi tutti dimenticano: un modello di base. Soprattutto nelle previsioni di serie temporali, rimarrai sorpreso dalla frequenza con cui un predittore ingenuo supera anche un modello più elaborato!

Come riferimento ingenuo, prevediamo la curva di consumo energetico del giorno precedente:

Addestramento del modello del trasformatore di fusione temporale

Possiamo addestrare il nostro modello TFT utilizzando il familiare Tutor interfaccia da PyTorch Lightning.

Nota le seguenti cose:

  • Usiamo il Arresto anticipato callback per monitorare la perdita di convalida.
  • Usiamo Tensorboard per registrare le nostre metriche di formazione e convalida.
  • Il nostro modello utilizza Perdita quantilica - un tipo speciale di perdita che ci aiuta a produrre gli intervalli di previsione. Per ulteriori informazioni sulla funzione Perdita quantile, controlla questo articolo.
  • Usiamo 4 teste di attenzione, come il documento originale.

Ora siamo pronti per costruire e addestrare il nostro modello:

Questo è tutto! Dopo 6 epoche, EarlyStopping entra in azione e interrompe l'allenamento.

Carica e salva il modello migliore

Non dimenticare di salvare il tuo modello. Anche se possiamo metterlo in salamoia, l'opzione più sicura è salvare direttamente l'epoca migliore:

!zip -r model.zip lightning_logs/lightning_logs/version_1/*

Per caricare nuovamente il modello, decomprimerlo modello.zip ed esegui quanto segue: ricorda solo il percorso del modello migliore:

Controlla Tensorboard

Dai uno sguardo più da vicino alle curve di training e validazione con Tensorboard:

Valutazione del modello

Ottieni previsioni sul set di convalida e calcola la media P50 (mediana quantile) spento:

Le ultime due serie temporali presentano una perdita leggermente maggiore perché anche la loro grandezza relativa è elevata.

Tracciare previsioni sui dati di convalida

Se superiamo il mode=raw sul prevedere () metodo, otteniamo più informazioni, comprese le previsioni per tutti e sette i quantili. Abbiamo anche accesso ai valori di attenzione (ne parleremo più avanti).

Dai un'occhiata più da vicino a raw_predictions variabili:

Usiamo il plot_prediction() per creare le nostre trame. Naturalmente, potresti creare la tua trama personalizzata: il plot_prediction() ha l'ulteriore vantaggio di aggiungere i valori di attenzione.

Nota: Il nostro modello prevede i prossimi 24 punti dati in un colpo solo. Questo non è uno scenario di previsione mobile in cui un modello prevede a singolo valuta ogni volta e "cuce" insieme tutte le previsioni.

Creiamo una trama per ciascun consumatore (5 in totale).

Figura 3: Previsioni sui dati di convalida per MT_002
Figura 4: Previsioni sui dati di convalida per MT_004
Figura 5: Previsioni sui dati di convalida per MT_005
Figura 6: Previsioni sui dati di convalida per MT_006
Figura 7: Previsioni sui dati di convalida per MT_008

I risultati sono piuttosto impressionanti.

Il nostro Trasformatore di fusione temporale il modello è stato in grado di catturare il comportamento di tutte e 5 le serie temporali, sia in termini di stagionalità che di grandezza!

Inoltre, tieni presente che:

  • Non abbiamo eseguito alcuna ottimizzazione degli iperparametri.
  • Non abbiamo implementato alcuna tecnica di progettazione di funzionalità fantasiose.

In una sezione successiva, mostriamo come migliorare il nostro modello con l'ottimizzazione degli iperparametri.

Tracciare previsioni per una serie temporale specifica

In precedenza, tracciamo le previsioni sui dati di convalida utilizzando il metodo idx argomento, che itera su tutte le serie temporali nel nostro set di dati. Possiamo essere più specifici e produrre previsioni su una serie temporale specifica:

Figura 7: Previsione del giorno prima per MT_004 sul set di allenamento

In Figura 7, tracciamo il giorno prima MT_004 consumatore per indice temporale=26512.

Ricorda, la nostra rubrica sull'indicizzazione del tempo hours_from_start inizia da 26304 e possiamo ottenere previsioni da 26388 in poi (perché abbiamo impostato prima min_encoder_length=max_encoder_length // 2 che è uguale 26304 + 168//2=26388

Previsioni fuori campione

Creiamo previsioni fuori campione, oltre il punto dati finale dei dati di convalida, ovvero 2014–09–07 23:00:00

Tutto quello che dobbiamo fare è creare un nuovo dataframe che contenga:

  • Il numero di N=max_encoder_length date passate, che fungono da finestra di ricerca: il dati dell'encoder nella terminologia TFT.
  • Le date future delle dimensioni max_prediction_length per il quale vogliamo calcolare le nostre previsioni: il dati del decodificatore.

Possiamo creare previsioni per tutte e 5 le nostre serie temporali o solo per una. Figure 7 mostra le previsioni fuori campione per il consumatore MT_002:

Figura 7: Previsione per il giorno prima per MT_002

Fare previsioni accurate è una cosa, ma al giorno d’oggi conta molto anche la spiegabilità.

Ed è ancora peggio per i modelli di Deep Learning, che sono considerati scatole nere. Metodi come LIME ed FORMA può fornire spiegabilità (in una certa misura) ma non funziona bene per le serie temporali. Inoltre, si tratta di metodi post-hoc esterni e non sono legati a un modello particolare.

Trasformatore di fusione temporale prevede tre tipi di interpretabilità:

  • Per quanto riguarda la stagionalità: TFT sfrutta il suo romanzo Attenzione multitesta interpretabile meccanismo per calcolare l’importanza dei passaggi temporali passati.
  • Dal punto di vista delle funzionalità: TFT sfrutta la sua Rete di selezione delle variabili modulo per calcolare l'importanza di ogni caratteristica.
  • Robustezza agli eventi estremi: Possiamo studiare il comportamento delle serie temporali durante eventi rari

Se vuoi conoscere in modo approfondito il funzionamento interno di Attenzione multitesta interpretabile ed Rete di selezione variabile, controlla il mio articolo precedente.

Interpretabilità in base alla stagionalità

TFT esplora i pesi dell'attenzione per comprendere i modelli temporali attraverso i passaggi temporali passati.

Le linee grigie in tutti i grafici precedenti rappresentano i punteggi di attenzione. Guarda di nuovo quelle trame: noti qualcosa? Figure 8 mostra i risultati di Figure 7 e tiene conto anche dei punteggi di attenzione:

Figura 8: Previsione per il giorno successivo per MT_001 con stagionalità visualizzate

I punteggi di attenzione rivelano l’impatto che hanno i passaggi temporali in cui il modello produce la sua previsione. I piccoli picchi riflettono la stagionalità giornaliera, mentre il picco più alto verso la fine probabilmente implica la stagionalità settimanale.

Se calcoliamo la media delle curve di attenzione su tutti i passi temporali e le serie temporali (non solo le 5 che abbiamo usato in questo tutorial), otterremo la forma dall'aspetto simmetrico in Figure 9 dal documento TFT:

Figura 9: Modelli temporali per il set di dati sull'elettricità (Fonte)

Domanda: A cosa serve questo? Non possiamo semplicemente stimare i modelli di stagionalità con metodi come i grafici ACF, la scomposizione del segnale temporale ecc.?

Risposta: VERO. Tuttavia, studiare i pesi dell’attenzione del TFT presenta ulteriori vantaggi:

  1. Possiamo confermare che il nostro modello cattura l'apparente dinamica stagionale delle nostre sequenze.
  2. Il nostro modello può anche rivelare modelli nascosti perché i pesi dell’attenzione delle finestre di input attuali considerano tutti gli input passati.
  3. Il grafico dei pesi dell'attenzione non è uguale a un grafico dell'autocorrelazione: il grafico dell'autocorrelazione si riferisce a una sequenza particolare, mentre i pesi dell'attenzione in questo caso si concentrano sull'impatto di ogni fase temporale esaminando tutte le covariate e le serie temporali.

Interpretabilità in termini di funzionalità

I Rete di selezione delle variabili componente di TFT può facilmente stimare il importanza delle caratteristiche:

Figura 10: Presenta importanza sui dati di convalida

In Figure 10 , notiamo quanto segue:

  • I hour ed day_of_week hanno punteggi elevati, sia come osservazioni passate che come covariate future. Il punto di riferimento nel documento originale condivide la stessa conclusione.
  • I power_usage è ovviamente la covariata osservata di maggior impatto.
  • I consumer_id non è molto significativo qui perché utilizziamo solo 5 consumatori. Nel documento TFT, in cui gli autori utilizzano tutti i 370 consumatori, questa variabile è più significativa.

Nota: Se la variabile statica di raggruppamento non è importante, è molto probabile che il set di dati possa essere modellato altrettanto bene da un singolo modello di distribuzione (come ARIMA).

Rilevamento di eventi estremi

Le serie temporali sono note per essere suscettibili a cambiamenti improvvisi nelle loro proprietà durante eventi rari (noti anche come shock).

Ancora peggio, quegli eventi sono molto sfuggenti. Immagina se la tua variabile target diventa volatile per un breve periodo perché una covariata cambia silenziosamente il comportamento:

Si tratta di un rumore casuale o di uno schema persistente nascosto che sfugge al nostro modello?

Con TFT, possiamo analizzare la robustezza di ogni singola caratteristica nel suo intervallo di valori. Sfortunatamente, l’attuale set di dati non mostra volatilità o eventi rari: è più probabile che questi si trovino nei dati finanziari, di vendita e così via. Tuttavia, mostreremo come calcolarli:

Alcune funzionalità non hanno tutti i valori presenti nel set di dati di convalida, quindi mostriamo solo i valori hour ed consumer_id:

Figura 11: Previsioni rispetto ai valori effettivi (medie normalizzate) all'ora
Figura 12: Previsioni e valori effettivi (medie normalizzate) su consumer_id

In entrambe le figure i risultati sono incoraggianti. In Figure 12 , notiamo che consumer MT_004 ha prestazioni leggermente inferiori rispetto ad altri consumatori. Potremmo verificarlo se normalizziamo la perdita di P50 di ogni consumatore con il suo consumo energetico medio calcolato in precedenza.

Le barre grigie indicano la distribuzione di ciascuna variabile. Una cosa che faccio sempre è trovare quali valori hanno una frequenza bassa. Quindi, controllo come si comporta il modello in quelle aree. Pertanto, puoi facilmente rilevare se il tuo modello cattura il comportamento di eventi rari.

In generale, puoi utilizzare questa funzionalità TFT per sondare i punti deboli del tuo modello e procedere a ulteriori indagini.

Possiamo usarlo senza problemi Trasformatore di fusione temporale con Ottuna per eseguire l'ottimizzazione degli iperparametri:

Il problema è che, poiché TFT è un modello basato su Transformer, avrai bisogno di notevoli risorse hardware!

Trasformatore di fusione temporale è senza dubbio una pietra miliare per la comunità di Time-Series.

Il modello non solo raggiunge i risultati SOTA, ma fornisce anche un quadro per l’interpretabilità delle previsioni. Il modello è disponibile anche nella Freccette libreria python, basata sulla libreria PyTorch Forecasting.

Infine, se siete curiosi di conoscere l'architettura del Trasformatore di fusione temporale in dettaglio, controlla il articolo di accompagnamento sulla carta originale.

Temporal Fusion Transformer: previsione delle serie temporali con deep learning - tutorial completo ripubblicato dalla fonte https://towardsdatascience.com/temporal-fusion-transformer-time-series-forecasting-with-deep-learning-complete-tutorial-d32c1e51cd91?source= rss—-7f60cf5620c9—4 tramite https://towardsdatascience.com/feed

<!–

->

Timestamp:

Di più da Consulenti Blockchain