Potenziamenti delle serie temporali
Esaltare le serie temporali
Un modo semplice ma efficace per aumentare la quantità di dati di serie temporali
Questo post del blog è disponibile come quaderno Jupyter su GitHub.
Gli aumenti sono diventati un componente indispensabile nel campo delle pipeline di visione artificiale. Tuttavia, la loro popolarità non ha raggiunto le stesse altezze in altri ambiti, come le serie temporali. In questo tutorial, approfondirò il mondo degli aumenti delle serie temporali, illuminando la loro importanza e fornendo esempi concreti della loro applicazione utilizzando la potente libreria di modellazione di serie temporali generative, TSGM [5].
Il nostro punto di partenza è un dataset indicato come (𝐗, 𝐲). Qui, 𝐱ᵢ ∈ 𝐗 sono serie temporali multivariate (ossia, ogni punto temporale è un vettore di caratteristiche multidimensionale) e y sono etichette. Prevedere le etichette y viene chiamato un compito downstream. Il nostro obiettivo è utilizzare (𝐗, 𝐲) per produrre campioni aggiuntivi (𝐗*, 𝐲*), che potrebbero aiutarci a risolvere il compito downstream in modo più efficace (in termini di prestazioni predictive o robustezza). Per semplicità, in questo tutorial non lavoreremo con le etichette, ma i metodi che descriviamo qui sono facili da generalizzare al caso con etichette e le implementazioni software che usiamo possono essere facilmente estese al caso supervisionato aggiungendo parametri aggiuntivi al metodo .generate
(vedi esempi di seguito).
Senza ulteriori indugi, consideriamo gli aumenti delle serie temporali uno per uno. In TSGM, tutti gli aumenti sono organizzati in modo ordinato in tsgm.models.augmentations
, e puoi consultare la documentazione completa disponibile su TSGM documentation. Ora, diamo il via agli esempi di programmazione installando tsgm:
- Crea un grafico a barre annidate con Seaborn
- Le migliori aziende in India da considerare per l’impiego
- Hacking rapido e abuso di LLM
pip install tsgm
Andando avanti, importiamo tsgm e carichiamo un dataset esemplificativo. Un tensore X
contiene ora 100 serie temporali sinusoidali di lunghezza 64, con 2 caratteristiche ciascuna. Con traslazione casuale, frequenze e ampiezze (ampiezza massima è 20).
# importare le librerieimport matplotlib.pyplot as pltimport seaborn as snsimport numpy as npimport randomfrom tensorflow import kerasimport tsgm
# e ora generiamo il datasetX = tsgm.utils.gen_sine_dataset(100, 64, 2, max_value=20)
Jittering / Rumore Gaussiano
Prima di tutto, consideriamo come primo aumento il jittering.
Le serie temporali vengono aumentate con rumore casuale gaussiano (Wikipedia))
In tsgm, l’aumento del rumore gaussiano può essere applicato come segue:
modello_aum = tsgm.models.augmentations.GaussianNoise()campioni = modello_aum.generate(X=X, n_samples=10, varianza=0.2)
Il concetto alla base dell’aumento del rumore gaussiano è che l’aggiunta di una piccola quantità di jittering alle serie temporali probabilmente non le cambierà significativamente, ma aumenterà il numero di tali campioni rumorosi nel nostro dataset. Questo rende spesso i modelli downstream più robusti ai campioni rumorosi o migliora le prestazioni predictive. I parametri iper del rumore gaussiano e il modo di aggiungere il rumore (ad esempio, il rumore gaussiano può aumentare verso la fine di una serie temporale) sono una questione difficile e dipendono da un dataset specifico e dal problema downstream. Spesso vale la pena sperimentare e vedere come quei parametri influenzano le prestazioni del modello target. Qui forniamo una visualizzazione dei campioni provenienti dal dataset sinusoidale originale e dei campioni aumentati.
Shuffle delle Caratteristiche
Un altro approccio all’aumento delle serie temporali è semplicemente mischiare le caratteristiche. Questo approccio è adatto solo per serie temporali multivariate particolari, in cui sono invarianti a tutte o a particolari permutazioni delle caratteristiche. Ad esempio, può essere applicato a serie temporali in cui ogni caratteristica rappresenta misurazioni indipendenti uguali provenienti da vari sensori.
Per spiegare questo approccio, prendiamo ad esempio cinque sensori identici, etichettati come S_1, S_2, S_3, S_4 e S_5. Per illustrazione, assumiamo che i sensori 1-4 siano probabilmente interscambiabili rispetto alle rotazioni. Quindi ha senso provare ad aumentare i dati con rotazioni delle caratteristiche rispetto alle rotazioni dei sensori S_1, …, S_5.
In modo simile all’esempio precedente, l’implementazione può funzionare nel seguente modo:
aug_model = tsgm.models.augmentations.Shuffle()samples = aug_model.generate(X=X, n_samples=3)
Qui mostriamo un esempio di una serie temporale con 5 caratteristiche e un campione aumentato, in modo analogo all’immagine precedente.
Taglia e mescola
La tecnica di aumento della taglia e mescola [3] suddivide una serie temporale in segmenti e mescola quei pezzi. Questa tecnica può essere utilizzata su serie temporali che mostrano una certa forma di invarianza nel tempo. Ad esempio, immagina una serie temporale misurata da dispositivi indossabili per diversi giorni. Una buona strategia in questo caso è suddividere la serie temporale per giorni e, mescolando questi giorni, ottenere campioni aggiuntivi. La tecnica di taglia e mescola è visualizzata nell’immagine seguente:
aug_model = tsgm.models.augmentations.SliceAndShuffle()samples = aug_model.generate(X=X, n_samples=10, n_segments=3)
Vediamo ora i campioni originali e aumentati:
Deformazione di magnitudo
La deformazione di magnitudo [3] cambia la magnitudo di ogni campione in un dataset di serie temporali moltiplicando la serie temporale originale con una curva di spline cubica. Questo processo scala la magnitudo delle serie temporali, il che può essere vantaggioso in molti casi, come nel nostro esempio sintetico con sines n_knots
numero di nodi a magnitudo casuale distribuiti come N(1, σ^2) dove σ è impostato da un parametro sigma
nella funzione .generate
.
aug_model = tsgm.models.augmentations.MagnitudeWarping()samples = aug_model.generate(X=X, n_samples=10, sigma=1)
Ecco un esempio di dati originali e campioni aumentati generati con MagnitudeWarping
.
Deformazione della finestra
In questa tecnica [4], le finestre selezionate nei dati delle serie temporali vengono accelerati o rallentati. Successivamente, l’intera serie temporale risultante viene ridimensionata alle dimensioni originali al fine di mantenere gli intervalli di tempo alla lunghezza originale. Ecco un esempio di tale incremento:
Tale aumento può essere vantaggioso, ad esempio, nella modellazione di apparecchiature. In tali applicazioni, le misurazioni dei sensori possono modificare la velocità di cambiamento a seconda di come vengono utilizzati tali apparecchi.
In tsgm, come sempre, la generazione può essere effettuata tramite
aug_model = tsgm.models.augmentations.WindowWarping()samples = aug_model.generate(X=X, n_samples=10, scales=(0.5,), window_ratio=0.5)
Di seguito potete trovare un esempio di serie temporale generata.
Media barycentrica Dynamic Time Warping (DTWBA)
Dynamic Time Warping Barycentric Average (DTWBA)[2] è un metodo di incremento basato su Dynamic Time Warping (DTW). DTW è un metodo per misurare la similarità tra serie temporali. L’idea è “sincronizzare” queste serie temporali, come mostrato nell’immagine seguente.
Maggiori dettagli sul calcolo di DTW sono disponibili su https://rtavenar.github.io/blog/dtw.html.
DTWBA funziona nel seguente modo: 1. L’algoritmo seleziona una serie temporale per inizializzare il risultato di DTWBA. Questa serie temporale può essere data esplicitamente o può essere scelta casualmente dal dataset 2. Per ogni delle N
serie temporali, l’algoritmo calcola la distanza DTW e il percorso (il percorso è la mappatura che minimizza la distanza) 3. Dopo aver calcolato tutte le distanze DTW, l’algoritmo aggiorna il risultato di DTWBA facendo la media rispetto a tutti i percorsi trovati sopra 4. L’algoritmo ripete i passaggi (2) e (3) fino a quando il risultato di DTWBA converge
Un’implementazione di riferimento può essere trovata in tslearn, e una descrizione può essere trovata in [2].
In tsgm, i campioni possono essere generati come segue
aug_model = tsgm.models.augmentations.DTWBarycentricAveraging()initial_timeseries = random.sample(range(X.shape[0]), 10)initial_timeseries = X[initial_timeseries]samples = aug_model.generate(X=X, n_samples=10, initial_timeseries=initial_timeseries )
Aumento con modelli di apprendimento automatico generativi
Un altro approccio all’aumento è addestrare un modello di apprendimento automatico su dati storici e addestrarlo a generare nuovi campioni sintetici. È un metodo blackbox perché è difficile interpretare come sono stati generati i nuovi campioni. Nel caso delle serie temporali possono essere applicati diversi metodi, in particolare tsgm ha VAE, GAN e processi gaussiani. Un esempio di generazione di serie temporali sintetiche con i VAE è il seguente:
n, n_ts, n_features = 1000, 24, 5data = tsgm.utils.gen_sine_dataset(n, n_ts, n_features)scaler = tsgm.utils.TSFeatureWiseScaler() scaled_data = scaler.fit_transform(data)
architecture = tsgm.models.zoo["vae_conv5"](n_ts, n_features, 10)encoder, decoder = architecture.encoder, architecture.decodervae = tsgm.models.cvae.BetaVAE(encoder, decoder)vae.compile(optimizer=keras.optimizers.Adam())vae.fit(scaled_data, epochs=1, batch_size=64)samples = vae.generate(10)
Conclusione
Abbiamo esplorato diversi metodi per la generazione di serie temporali sintetiche. Molti di essi introducono dei bias induttivi nel modello e sono utili in contesti pratici.
Come scegliere? Prima di tutto, analizza se il tuo problema contiene invarianze. È invariante al rumore casuale? È invariante alla permutazione delle caratteristiche?
Successivamente, scegli un ampio insieme di metodi e verifica se alcuni dei metodi selezionati migliorano le prestazioni del tuo problema successivo (tsgm ha una metrica di prestazione successiva). Quindi, seleziona l’insieme di metodi di aumento che offre il maggiore miglioramento delle prestazioni.
Infine, ringrazio Letizia Iannucci e Georgy Gritsenko per l’aiuto e le utili discussioni sulla stesura di questo post. Salvo diversa indicazione, tutte le immagini sono dell’autore.
Questo post del blog fa parte del progetto TSGM, nel quale stiamo creando uno strumento per migliorare le pipeline di serie temporali tramite aumento e generazione di dati sintetici. Se ti è stato utile, dai un’occhiata al nostro repository e considera la possibilità di citare l’articolo su TSGM:
@article{ nikitin2023tsgm, title={TSGM: A Flexible Framework for Generative Modeling of Synthetic Time Series}, author={Nikitin, Alexander and Iannucci, Letizia and Kaski, Samuel}, journal={arXiv preprint arXiv:2305.11567}, year={2023}}
Riferimenti
[1] H. Sakoe e S. Chiba, “Dynamic programming algorithm optimization for spoken word recognition”. IEEE Transactions on Acoustics, Speech, and Signal Processing, 26(1), 43–49 (1978).
[2] F. Petitjean, A. Ketterlin & P. Gancarski. A global averaging method for dynamic time warping, with applications to clustering. Pattern Recognition, Elsevier, 2011, Vol. 44, Num. 3, pp. 678–693.
[3] Um TT, Pfister FM, Pichler D, Endo S, Lang M, Hirche S, Fietzek U, Kulic´ D (2017) Data augmentation of wearable sensor data for parkinson’s disease monitoring using convolutional neural networks. In: Proceedings of the 19th ACM international conference on multimodal interaction, pp. 216–220.
[4] Rashid, K.M. and Louis, J., 2019. Window-warping: a time series data augmentation of IMU data for construction equipment activity identification. In ISARC. Proceedings of the international symposium on automation and robotics in construction (Vol. 36, pp. 651–657). IAARC Publications.
[5] Nikitin, A., Iannucci, L. e Kaski, S., 2023. TSGM: un framework flessibile per la modellazione generativa di serie temporali sintetiche. Preprint di arXiv arXiv:2305.11567. Link Arxiv.