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:

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.

Serie temporali originali e dati sintetici generati tramite jittering.

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 questo esempio, ci sono cinque sensori e le misurazioni di questi sensori generano dati di serie temporali a cinque dimensioni. I sensori da 1 a 4 possono essere ruotati in modo arbitrario per generare nuovi campioni sintetici (ad esempio, 1->2, 2->3, 3->4, 4->1). Quindi, applicando tali trasformazioni ai dati originali, è possibile generare nuovi campioni sintetici.

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.

Serie temporali originali e dati sintetici generati tramite la miscelazione delle caratteristiche.

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:

Visualizzazione schematica di taglia e mescola.
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:

Serie temporali originali e dati sintetici generati tramite taglia e mescola.

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.

Serie temporali originali e dati sintetici generati tramite deformazione della magnitudine.

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.

Serie temporali originali e dati sintetici generati tramite deformazione della finestra.

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.

DTW è misurato per i segnali di due serie temporali $\sin(x)$ e $\sin(2x)$. La misurazione DTW è mostrata con la linea bianca. Inoltre, viene visualizzata una matrice di similarità incrociata.

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 )
Serie temporali originali e dati sintetici generati tramite DTWBA.

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.