Exploración de varias métricas para la evaluación de series temporales sintéticas con ejemplos de código prácticos
Esta publicación de blog está disponible como cuaderno jupyter en GitHub y es parte de TSGM, una biblioteca para modelado generativo de series temporales.
Hoy discutiremos la evaluación de conjuntos de datos de series temporales sintéticas: conjuntos de datos que se crean artificialmente para representar datos reales. Digamos que hay un conjunto de datos sintéticos D* que tiene como objetivo representar un conjunto de datos real D. Es esencial evaluar cuantitativamente qué tan buenos son estos datos sintéticos: ¿D* representa bien a D? ¿Están seguros estos datos? ¿Son estos datos valiosos para los problemas posteriores? En este tutorial, recorreremos los métodos utilizados para evaluar cuantitativa y cualitativamente la calidad de los datos de series temporales sintéticas.
Primero, consideremos dos casos de [1] que describen posibles usos de datos sintéticos:
Escenario 1. Una organización desea emplear un agente externo para analizar datos confidenciales o estudiar métodos estadísticos para un problema determinado. Compartir datos reales puede resultar complicado debido a cuestiones comerciales o de privacidad. Las contrapartes sintéticas pueden proporcionar una solución conveniente a este problema.
Escenario 2. Una organización desea entrenar un modelo en un conjunto de datos relativamente pequeño. Sin embargo, el conjunto de datos no es suficiente para la calidad deseada del modelado. Estos conjuntos de datos limitados pueden ampliarse con datos sintéticos. Estos datos sintéticos, que deben ser similares a los datos reales, tienen como objetivo mejorar el rendimiento del modelo o, en otros casos, ayudar en las pruebas de confiabilidad del modelo.
En general, indicamos y describimos en este tutorial las siguientes métricas:
- similitud de datos reales (Sc. 1 y 2),
- métrica de distancia,
- métrica discriminativa,
- Puntuación máxima de discrepancia media
2. consistencia predictiva (Sc. 1),
3. efectividad aguas abajo (Sc. 2),
4. privacidad (Sc. 1),
5. diversidad (Sc. 1 y Sc. 2),
6. Justicia (Sc.1 y Sc.2),
7. Comparación visual (Sc. 1 y 2).
En TSGM, todas las métricas están perfectamente organizadas en tsgm.metrics. Sumérgete en los detalles con nuestra documentación completa.
Ahora, comencemos con los ejemplos de codificación instalando tsgm:
pip install tsgm
Generación de datos sintéticos. En el futuro, importamos tsgm y cargamos un conjunto de datos ejemplar. Un tensor Xr ahora contendrá 100 series de tiempo sinusoidales o constantes (según la clase objetivo año). Usaremos (Xr, año) como real (= histórico = original) conjunto de datos. Xs contiene datos sintéticos generados por un codificador automático variacional. (Nota: utilizamos solo una época para la demostración; aumente el número de épocas y verifique la convergencia del entrenamiento para aplicaciones prácticas).
import numpy as np
import functools
import sklearn
import tensorflow as tf
from tensorflow import keras
import tsgm
n, n_ts, n_features = 100, 100, 20
vae_latent_dim = 8
# Load data that will be used as real
Xr, yr = tsgm.utils.gen_sine_vs_const_dataset(n, n_ts, n_features, max_value=2, const=1)
Xr = Xr.astype(np.float32)
yr = keras.utils.to_categorical(yr).astype(np.float32)
ys = yr # use real labels as synthetic labels
# Using real data generate synthetic time series dataset
scaler = tsgm.utils.TSFeatureWiseScaler()
scaled_data = scaler.fit_transform(Xr)
architecture = tsgm.models.zoo["cvae_conv5"](n_ts, n_features, vae_latent_dim)
encoder, decoder = architecture.encoder, architecture.decoder
vae = tsgm.models.cvae.cBetaVAE(encoder, decoder, latent_dim=vae_latent_dim, temporal=False)
vae.compile(optimizer=keras.optimizers.Adam())
# Train VAE using historical data
vae.fit(scaled_data, yr, epochs=1, batch_size=64)
Xs, ys = vae.generate(ys)
d_real = tsgm.dataset.Dataset(Xr, yr)
d_syn = tsgm.dataset.Dataset(Xs, ys)
Similitud con datos reales
Métrica de distancia
Para empezar, conviene medir la similitud entre datos reales y sintéticos. Una forma de hacerlo es calcular la distancia entre un vector de estadísticas resumidas de datos sintéticos y datos reales.
Cuanto menor sea la distancia, más se alinearán los datos sintéticos con el realismo de los datos reales. Ahora, definamos un conjunto de estadísticas que servirán como base para nuestra métrica de distancia. Los métodos tsgm.metrics.statistics.axis_*_s calculan las estadísticas * sobre el eje proporcionado.
statistics = [
functools.partial(tsgm.metrics.statistics.axis_max_s, axis=None),
functools.partial(tsgm.metrics.statistics.axis_min_s, axis=None),
functools.partial(tsgm.metrics.statistics.axis_max_s, axis=1),
functools.partial(tsgm.metrics.statistics.axis_min_s, axis=1)]
Avanzando, establezcamos la métrica de distancia. En aras de la simplicidad, optaremos por la norma euclidiana.
discrepancy_func = lambda x, y: np.linalg.norm(x - y)
Reuniéndolo todo, utilizaremos el objeto tsgm.metrics.DistanceMetric.
dist_metric = tsgm.metrics.DistanceMetric(
statistics=statistics, discrepancy=discrepancy_func
)
print(dist_metric(d_real, d_syn))
Métrica de MMD
Un enfoque alternativo implica comparar distribuciones de datos sintéticos y reales. En este contexto, el uso de la Discrepancia Media Máxima (MMD) [3] resulta conveniente. MMD sirve como una prueba no paramétrica de dos muestras para determinar si las muestras se extraen de la misma distribución. A través de observaciones empíricas, hemos identificado la métrica MMD como un método particularmente conveniente para evaluar la similitud de datos reales.
mmd_metric = tsgm.metrics.MMDMetric()
print(mmd_metric(Xr, Xs))
Métrica discriminativa
En este enfoque, se entrena un modelo para distinguir entre datos reales y sintéticos. En TSGM, tsgm.metrics.DiscriminativeMetric demuestra ser una herramienta valiosa para este propósito. Esta métrica facilita la evaluación de la eficacia con la que un modelo puede discriminar entre conjuntos de datos reales y sintéticos, proporcionando una perspectiva adicional sobre la similitud de datos.
# use LSTM classification model from TSGM zoo.
model = tsgm.models.zoo["clf_cl_n"](
seq_len=Xr.shape[1], feat_dim=Xr.shape[2], output_dim=1).model
model.compile(
tf.keras.optimizers.Adam(),
tf.keras.losses.CategoricalCrossentropy(from_logits=False)
)
# use TSGM metric to measure the score
discr_metric = tsgm.metrics.DiscriminativeMetric()
print(
discr_metric(
d_hist=Xr, d_syn=Xs, model=model,
test_size=0.2, random_seed=42, n_epochs=10
)
)
Métrica de coherencia
A continuación, pasamos a la métrica de coherencia. La idea está alineada con escenario 1 escrito arriba. En este caso, nos centramos en medir la coherencia de un conjunto de modelos posteriores. Con más detalle, consideremos un conjunto de modelos ℳ y un evaluador E: ℳ × 𝒟 → ℝ.
Para evaluar la consistencia de ℳ en D y D*, medimos p(m₁ ∼ m₂| m₁, m₂ ∈ ℳ, D, D*) donde m₁ ∼ m₂ significa m₁ consistente con m₂: “si m₁ supera a m₂ donde se entrenaron los modelos D, entonces supera a m₂ en D* y viceversa”. Estimar esta probabilidad implica fijar un conjunto finito ℳ y evaluar los modelos utilizando datos reales, y evaluarlos por separado utilizando datos sintéticos.
En TSGM, nuestro primer paso es definir un conjunto de evaluadores. Para ello, aprovecharemos una colección de modelos LSTM, que van de uno a tres bloques LSTM.
class EvaluatorConvLSTM():
'''
NB an oversimplified classifier, for educational purposes only.
'''
def __init__(self, model):
self._model = model
def evaluate(self, D: tsgm.dataset.Dataset, D_test: tsgm.dataset.Dataset) -> float:
X_train, y_train = D.Xy
X_test, y_test = D_test.Xy
self._model.fit(X_train, y_train)
y_pred = np.argmax(self._model.predict(X_test), 1)
print(self._model.predict(X_test).shape)
y_test = np.argmax(y_test, 1)
return sklearn.metrics.accuracy_score(y_pred, y_test)
# Define a set of models
seq_len, feat_dim, n_classes = *Xr.shape[1:], 2
models = [tsgm.models.zoo["clf_cl_n"](seq_len, feat_dim, n_classes, n_conv_lstm_blocks=i) for i in range(1, 4)]
for m in models:
m.model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
evaluators = [EvaluatorConvLSTM(m.model) for m in models]
# Utilize the set of evaluators with ConsistencyMetric from tsgm
consistency_metric = tsgm.metrics.ConsistencyMetric(evaluators=evaluators)
print(consistency_metric(d_real, d_syn, d_real))
Rendimiento posterior
Ahora, exploremos cómo los datos generados pueden contribuir a mejorar el rendimiento predictivo en un problema posterior específico. Consideraremos dos enfoques distintos para evaluar el rendimiento posterior:
1. Aumento de datos reales con datos sintéticos.
Este enfoque resulta valioso cuando los datos son limitados. Al complementar los datos reales con contrapartes generadas, nuestro objetivo es mejorar el conjunto de capacitación para mejorar el rendimiento del modelo. Vea nuestra publicación de blog sobre aumentos de datos aquí [2].
2. Utilización de datos generados exclusivamente para la capacitación de modelos posteriores.
En escenarios donde los datos reales son escasos y privados, este enfoque entra en juego. Aquí, el modelo downstream se entrena únicamente con los datos generados y posteriormente se evalúa con datos reales.
downstream_model = tsgm.models.zoo["clf_cl_n"](seq_len, feat_dim, n_classes, n_conv_lstm_blocks=1).model
downstream_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
evaluator = EvaluatorConvLSTM(downstream_model)
downstream_perf_metric = tsgm.metrics.DownstreamPerformanceMetric(evaluator)
print(downstream_perf_metric(d_real, d_syn, d_real))
El resultado significa una ganancia en precisión al aumentar con datos sintéticos en comparación con el modelo entrenado exclusivamente con los datos de entrenamiento.
Privacidad: métrica de ataque de inferencia de membresía
Un enfoque para medir la privacidad de los datos sintéticos es medir la susceptibilidad a ataques de inferencia de membresía. El procedimiento de ataque por inferencia de membresía se muestra visualmente en la figura anterior. La idea es la siguiente. Imagine un atacante que tiene acceso a datos sintéticos y a una muestra de datos particular (que puede existir o no en el conjunto de datos original). El objetivo es **inferir** si esta muestra está presente en los datos reales.
`tsgm.metrics.PrivacyMembershipInferenceMetric` mide la susceptibilidad a ataques de inferencia de membresía utilizando datos sintéticos. El procedimiento de evaluación paso a paso se describe a continuación:
1. División de datos. Divida los datos históricos en conjuntos de entrenamiento y de reserva (denotados como Dₜ y Dₕ),
2. Entrenamiento del modelo generativo. Entrene un modelo generativo en Dₜ y genere un conjunto de datos sintéticos D*,
3. Entrenamiento del modelo de clasificación de una clase (OCC). Entrene un modelo de clasificación de una clase (OCC) con datos sintéticos D* y evalúelo en Dₜ y Dₕ,
4. Cálculo de puntuación objetivo. Utilice uno menos la precisión del modelo OCC como puntuación objetivo.
Este proceso de evaluación proporciona información sobre la vulnerabilidad potencial a los ataques de inferencia de membresía que aprovechan los datos sintéticos.
Introduzcamos ahora un modelo de atacante. Por motivos de demostración, definiremos un clasificador SVM de una clase.
class FlattenTSOneClassSVM:
def __init__(self, clf):
self._clf = clf
def fit(self, X):
X_fl = X.reshape(X.shape[0], -1)
self._clf.fit(X_fl)
def predict(self, X):
X_fl = X.reshape(X.shape[0], -1)
return self._clf.predict(X_fl)
attacker = FlattenTSOneClassSVM(sklearn.svm.OneClassSVM())
privacy_metric = tsgm.metrics.PrivacyMembershipInferenceMetric(
attacker=attacker
)
Ahora, definamos un conjunto de pruebas y midamos la métrica de privacidad:
X_test, y_test = tsgm.utils.gen_sine_vs_const_dataset(10, 100, 20, max_value=2, const=1)
d_test = tsgm.dataset.Dataset(X_test, keras.utils.to_categorical(y_test))
# 1 indicates high privacy and 0 -- low privacy.
privacy_metric(d_real, d_syn, d_test)
Diversidad
Con esta métrica, nuestro objetivo es cuantificar la diversidad de datos sintéticos. Considere la imagen a continuación, donde los puntos rojos representan datos reales y los puntos azules representan datos sintéticos. ¿Qué opción produce un conjunto de datos sintéticos superior? El de la derecha parece más favorable, pero ¿por qué? La respuesta está en su diversidad, lo que la hace potencialmente más versátil y útil. Sin embargo, la diversidad por sí sola no es suficiente; Es crucial considerar otras métricas en conjunto, como la distancia o el rendimiento posterior. En nuestra exploración, ejemplificaremos el concepto utilizando la entropía.
spec_entropy = tsgm.metrics.EntropyMetric()
print(spec_entropy(Xr))
print(spec_entropy(Xs))
Justicia
El tema de la equidad se cruza con la generación de series temporales sintéticas de dos maneras importantes. En primer lugar, es crucial evaluar si los datos sintéticos introducen nuevos sesgos. En segundo lugar, los datos sintéticos presentan una oportunidad para mitigar los sesgos inherentes a los datos originales. Definir procedimientos estandarizados para verificar la equidad resulta desafiante, ya que a menudo depende de las características específicas de los problemas posteriores. Algunas métricas ilustrativas para medir la equidad abarcan la paridad demográfica, los paradigmas predictivos de paridad de tasas y la igualdad de oportunidades.
Tomemos, por ejemplo, la igualdad de oportunidades. La igualdad de oportunidades sirve como una métrica de equidad diseñada para evaluar si, para una etiqueta preferida (una que confiere una ventaja o beneficio a una persona) y un atributo determinado, un clasificador predice esa etiqueta preferida igualmente bien para todos los valores de ese atributo. [6]. Esta métrica es fundamental para garantizar la imparcialidad y la igualdad de trato entre diversos valores de atributos. Un gran ejemplo de esta métrica se proporciona en [6]: “Supongamos que la Universidad de Glubbdubdrib admite tanto a liliputienses como a brobdingnagianos en un riguroso programa de matemáticas. Las escuelas secundarias de los liliputienses ofrecen un sólido plan de estudios de clases de matemáticas y la gran mayoría de los estudiantes están calificados para el programa universitario. Las escuelas secundarias de los habitantes de Brobdingnagian no ofrecen clases de matemáticas en absoluto y, como resultado, muchos menos estudiantes están calificados. La igualdad de oportunidades se cumple para la etiqueta preferida de “admitido” con respecto a la nacionalidad (liliputiense o brobdingnagiana) si los estudiantes calificados tienen las mismas probabilidades de ser admitidos independientemente de si son liliputienses o brobdingnagianos”.
Analisis cualitativo
Para evaluar cualitativamente los datos es conveniente:
a. extraer muestras y visualizar muestras individuales a partir de datos sintéticos y reales,
b. cree incrustaciones de las muestras generadas y visualícelas utilizando, por ejemplo, TSNE. Ejemplifiquemos (b) con TSGM:
tsgm.utils.visualize_tsne_unlabeled(Xr, Xs, perplexity=10, markersize=20, alpha=0.5)
Citación
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 le resultó útil, eche un vistazo a nuestro repositorio y considere citar el artículo 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}
}
Conclusión
En conclusión, hemos explorado varias técnicas de evaluación para datos de series temporales sintéticas, proporcionando una descripción general completa de diferentes escenarios. Para navegar por estos métodos de manera efectiva, es beneficioso considerar los escenarios descritos. En última instancia, seleccionar la métrica correcta depende del problema posterior, el área de aplicación y las regulaciones legales que rigen los datos en uso. El conjunto diverso de métricas proporcionado tiene como objetivo ayudar a crear un proceso de evaluación integral adaptado a su problema específico.
Referencias:
[1] 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.
[2] Aumentos de series temporales, publicación de TowardsDataScience, https://medium.com/towards-data-science/time-series-augmentations-16237134b29b.
[3] Gretton, A., Borgwardt, KM, Rasch, MJ, Schölkopf, B. y Smola, A., 2012. Una prueba de núcleo de dos muestras. Revista de investigación sobre aprendizaje automático, 13 (1), páginas 723–773. Enlace JMLR.
[4] Wen, Q., Sun, L., Yang, F., Song, X., Gao, J., Wang, X. y Xu, H., 2020. Aumento de datos de series temporales para el aprendizaje profundo: una encuesta. Preimpresión de arXiv arXiv:2002.12478. Enlace Arxiv.
[5] Wattenberg, M., Viégas, F. y Hardt, M., 2016. Atacar la discriminación con un aprendizaje automático más inteligente. Investigación de Google, 17. Enlace de investigación de Google.
[6] Glosario de aprendizaje automático: equidad. Blog de desarrolladores de Google.
Enlace al blog de desarrolladores de Google.
A menos que se indique lo contrario, todas las imágenes son del autor. Para obtener materiales adicionales sobre la generación de series temporales sintéticas, consulte TSGM en GitHuby suscríbete a publicaciones medianas.
Evaluación de series temporales sintéticas fue publicado originalmente en Hacia la ciencia de datos en Medium, donde las personas continúan la conversación resaltando y respondiendo a esta historia.