Esta publicación de blog está disponible como cuaderno jupyter en GitHub.
Los aumentos se han convertido en un componente indispensable en el ámbito de los canales de visión por computadora. Sin embargo, su popularidad no ha alcanzado las mismas alturas en otros ámbitos, como las series temporales. En este tutorial, profundizaré en el mundo de los aumentos de series temporales, arrojando luz sobre su importancia y proporcionando ejemplos concretos de su aplicación utilizando la poderosa biblioteca generativa de modelado de series temporales, TSGM. [5].
Nuestro punto de partida es un conjunto de datos denominado (𝐗, 𝐲). Aquí, 𝐱ᵢ ∈ 𝐗 son series de tiempo multivariadas (es decir, cada punto de tiempo es un vector de características multidimensional), y y son etiquetas. Predecir las etiquetas y se denomina tarea posterior. Nuestro objetivo es utilizar (𝐗, 𝐲) para producir muestras adicionales (𝐗*, 𝐲*), que podrían ayudarnos a resolver la tarea posterior de manera más efectiva (en términos de rendimiento predictivo o robustez). Para simplificar, no trabajaremos con etiquetas en este tutorial, pero los métodos que describimos aquí son sencillos de generalizar al caso con etiquetas, y las implementaciones de software que utilizamos se extienden fácilmente al caso supervisado agregando parámetros adicionales al .generate método (ver ejemplos a continuación).
Sin más preámbulos, consideremos los aumentos de series temporales uno por uno.
En TSGM, todos los aumentos están perfectamente organizados en tsgm.models.augmentationsy puede consultar la documentación completa disponible en Documentación TSGM.
Ahora, comencemos con los ejemplos de codificación instalando tsgm:
pip install tsgm
En el futuro, importamos tsgm y cargamos un conjunto de datos ejemplar. un tensor X ahora contiene 100 series temporales sinusoidales de longitud 64, con 2 funciones cada una. Con desplazamiento, frecuencias y amplitudes aleatorias (la amplitud máxima es 20).
# import the libraries
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import random
from tensorflow import keras
import tsgm
# and now generate the dataset
X = tsgm.utils.gen_sine_dataset(100, 64, 2, max_value=20)
Primero, como primer aumento consideramos el jittering.
Los datos de series temporales se aumentan con ruido gaussiano aleatorio (Wikipedia)
En tsgm, el aumento de ruido gaussiano se puede aplicar de la siguiente manera:
aug_model = tsgm.models.augmentations.GaussianNoise()
samples = aug_model.generate(X=X, n_samples=10, variance=0.2)
La idea detrás del aumento de ruido gaussiano es que agregar una pequeña cantidad de fluctuación a la serie temporal probablemente no la cambiará significativamente, pero aumentará la cantidad de muestras ruidosas en nuestro conjunto de datos. A menudo hace que los modelos posteriores sean más robustos frente a muestras ruidosas o mejora el rendimiento predictivo.
Los hiperparámetros del ruido gaussiano y la forma de agregar el ruido (por ejemplo, el ruido gaussiano puede aumentar hacia el final de una serie temporal) es una cuestión difícil y depende de un conjunto de datos particular y de un problema posterior. A menudo vale la pena experimentar y ver cómo esos parámetros afectan el rendimiento del modelo objetivo.
Aquí, proporcionamos una visualización de muestras del conjunto de datos sinusoidal original y muestras aumentadas.
Otro enfoque para el aumento de series temporales es simplemente mezclar las características. Este enfoque es adecuado sólo para series temporales multivariadas particulares, donde son invariantes para todas o permutaciones particulares de características. Por ejemplo, se puede aplicar a series temporales donde cada característica representa las mismas mediciones independientes de varios sensores.
Para explicar este enfoque, tomemos el ejemplo de cinco sensores idénticos, etiquetados como S_1, S_2, S_3, S_4 y S_5. A modo de ilustración, supongamos que los sensores 1 a 4 probablemente sean intercambiables con respecto a las rotaciones. Entonces tiene sentido intentar aumentar los datos con rotaciones de características con respecto a las rotaciones de los sensores S_1,…, S_5.
De manera similar al ejemplo anterior, el aumento puede funcionar de la siguiente manera:
aug_model = tsgm.models.augmentations.Shuffle()
samples = aug_model.generate(X=X, n_samples=3)
Aquí, mostramos una muestra de una serie temporal con 5 características y una muestra aumentada, de manera análoga a la imagen de arriba.
Aumento de corte y reproducción aleatoria [3] corta una serie de tiempo en porciones y mezcla esas piezas. Este aumento se puede realizar para series temporales que exhiben algún tipo de invariancia a lo largo del tiempo. Por ejemplo, imaginemos una serie temporal medida desde dispositivos portátiles durante varios días. La buena estrategia para este caso es dividir las series temporales por días y, al mezclar esos días, obtener muestras adicionales. El aumento de división y reproducción aleatoria se visualiza en la siguiente imagen:
aug_model = tsgm.models.augmentations.SliceAndShuffle()
samples = aug_model.generate(X=X, n_samples=10, n_segments=3)
Veamos muestras aumentadas y originales:
Deformación de magnitud [3] cambia la magnitud de cada muestra en un conjunto de datos de series temporales multiplicando la serie temporal original con una curva spline cúbica. Este proceso escala la magnitud de las series de tiempo, lo que puede resultar beneficioso en muchos casos, como en nuestro ejemplo sintético con senos. n_knots número de nudos en magnitudes aleatorias distribuidas como norte(1, σ^2) dónde σ se establece mediante un parámetro sigma en función .generate.
aug_model = tsgm.models.augmentations.MagnitudeWarping()
samples = aug_model.generate(X=X, n_samples=10, sigma=1)
A continuación se muestra un ejemplo de datos originales y muestras aumentadas generadas con MagnitudeWarping.
En esta técnica [4], las ventanas seleccionadas en los datos de series temporales se aceleran o disminuyen. Luego, toda la serie temporal resultante se reduce al tamaño original para mantener los pasos de tiempo en la duración original. Vea un ejemplo de dicho aumento a continuación:
Tal aumento puede ser beneficioso, por ejemplo, en equipos de modelado. En tales aplicaciones, las mediciones de los sensores pueden cambiar la velocidad de cambio dependiendo de cómo se utilicen esos equipos.
En tsgm, como siempre, la generación se puede realizar vía
aug_model = tsgm.models.augmentations.WindowWarping()
samples = aug_model.generate(X=X, n_samples=10, scales=(0.5,), window_ratio=0.5)
A continuación se puede encontrar un ejemplo de una serie temporal generada.
Promedio baricéntrico de deformación dinámica del tiempo (DTWBA)[2] es un método de aumento que se basa en Dynamic Time Warping (DTW). DTW es un método para medir la similitud entre series temporales. La idea es “sincronizar” esas series temporales, como se demuestra en la siguiente imagen.
Más detalles sobre el cálculo DTW están disponibles en https://rtavenar.github.io/blog/dtw.html.
DTWBA dice así:
1. El algoritmo elige una serie temporal para inicializar el resultado DTWBA. Esta serie de tiempo puede darse explícitamente o puede elegirse aleatoriamente del conjunto de datos.
2. Para cada uno de los N serie de tiempo, el algoritmo calcula la distancia DTW y la ruta (la ruta es el mapeo que minimiza la distancia)
3. Después de calcular todo N Distancias DTW, el algoritmo actualiza el resultado DTWBA haciendo el promedio con respecto a todos los caminos encontrados arriba
4. El algoritmo repite los pasos (2) y (3) hasta que el resultado DTWBA converja
Una implementación de referencia se puede encontrar en aprendery se puede encontrar una descripción en [2].
En tsgm, las muestras se pueden generar de la siguiente manera
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 )
Otro enfoque de aumento es entrenar un modelo de aprendizaje automático con datos históricos y entrenarlo para generar nuevas muestras sintéticas. Es un método de caja negra porque es difícil interpretar cómo se generaron nuevas muestras. Se pueden aplicar varios métodos en el caso de series temporales; en particular, tsgm tiene procesos VAE, GAN y gaussianos. Un ejemplo de generación de series temporales sintéticas con VAE es
n, n_ts, n_features = 1000, 24, 5
data = 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)
Exploramos varios métodos para la generación de series temporales sintéticas. Muchos de ellos introducen sesgos inductivos en el modelo y son útiles en entornos prácticos.
¿Como escoger? Primero, analice si su problema contiene invarianzas. ¿Es invariante al ruido aleatorio? ¿Es invariante presentar la mezcla?
A continuación, elija un amplio conjunto de métodos y verifique si alguno de los métodos seleccionados mejora el rendimiento de su problema posterior (tsgm tiene métrica de rendimiento aguas abajo). Luego, seleccione el conjunto de métodos de aumento que brinde el mayor aumento de rendimiento.
Por último, pero no menos importante, agradezco a Letizia Iannucci y Georgy Gritsenko por su ayuda y sus útiles debates sobre la redacción de esta publicación. A menos que se indique lo contrario, todas las imágenes son del autor.
Esta publicación de blog es parte del proyecto TSGM, en el que estamos creando una herramienta para mejorar los canales de series de tiempo mediante el aumento y la generación de datos sintéticos. Si te resultó útil, echa un vistazo a nuestro repositorio y considere citar el documento sobre 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}
}
[1] H. Sakoe y S. Chiba, “Optimización del algoritmo de programación dinámica para el reconocimiento de palabras habladas”. Transacciones IEEE sobre acústica, habla y procesamiento de señales, 26 (1), 43–49 (1978).
[2] F. Petitjean, A. Ketterlin y P. Gancarski. Un método de promedio global para la distorsión dinámica del tiempo, con aplicaciones para la agrupación en clústeres. Reconocimiento de patrones, Elsevier, 2011, vol. 44, núm. 3, págs. 678–693
[3] Um TT, Pfister FM, Pichler D, Endo S, Lang M, Hirche S,
Fietzek U, Kulic´ D (2017) Aumento de datos de sensores portátiles para el seguimiento de la enfermedad de Parkinson mediante redes neuronales convolucionales. En: Actas de la 19ª conferencia internacional ACM sobre interacción multimodal, págs. 216-220
[4] Rashid, KM y Louis, J., 2019. Deformación de ventanas: un aumento de datos de series temporales de datos IMU para la identificación de actividades de equipos de construcción. En ISARC. Actas del simposio internacional sobre automatización y robótica en la construcción (Vol. 36, págs. 651–657). Publicaciones de la IAARC.
[5] Nikitin, A., Iannucci, L. y Kaski, S., 2023. TSGM: Un marco flexible para el modelado generativo de series temporales sintéticas. preimpresión de arXiv arXiv:2305.11567. enlace arxiv.