Creare previsioni accurate e interpretabili
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, holidays
ed special days
sono noto, variabile nel tempo eventi.
Il 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:
- Crea un dataframe panda con i nostri dati di serie temporali.
- Avvolgi il nostro dataframe in un file Set di dati TimeSeries esempio.
- Passa il nostro Set di dati TimeSeries istanza a
TemporalFusionTransformer.
Il 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.
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.
Il 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
edday_of_week
. - Seleziona tutti i giorni compresi
2014–01–01
ed2014–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:
Il 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:
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 canale 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).
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:
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:
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:
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:
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:
- Possiamo confermare che il nostro modello cattura l'apparente dinamica stagionale delle nostre sequenze.
- Il nostro modello può anche rivelare modelli nascosti perché i pesi dell’attenzione delle finestre di input attuali considerano tutti gli input passati.
- 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à
Il Rete di selezione delle variabili componente di TFT può facilmente stimare il importanza delle caratteristiche:
In Figure 10 , notiamo quanto segue:
- Il
hour
edday_of_week
hanno punteggi elevati, sia come osservazioni passate che come covariate future. Il punto di riferimento nel documento originale condivide la stessa conclusione. - Il
power_usage
è ovviamente la covariata osservata di maggior impatto. - Il
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
:
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
<!–
->
- Bitcoin
- bizbuildermike
- blockchain
- conformità blockchain
- conferenza blockchain
- Consulenti Blockchain
- coinbase
- geniale
- Consenso
- conferenza crittografica
- criptazione mineraria
- criptovaluta
- decentrata
- DeFi
- Risorse digitali
- Ethereum
- machine learning
- gettone non fungibile
- Platone
- platone ai
- Platone Data Intelligence
- Platoneblockchain
- PlatoneDati
- gioco di plato
- Poligono
- prova di palo
- W3
- zefiro