Transformador de fusión temporal: pronóstico de series temporales con aprendizaje profundo: tutorial completo

Cree predicciones precisas e interpretables

Creado con DALLE [1]

Según [2], Transformador de fusión temporal supera a todos los modelos destacados de aprendizaje profundo para la previsión de series temporales.

Incluyendo un destacado Árbol de aumento de gradiente modelo para datos de series de tiempo tabulares.

Pero lo que es Transformador de fusión temporal (TFT)[3] ¿Y por qué es tan interesante?

En este artículo te explicamos brevemente las novedades de Transformador de fusión temporal y construir un proyecto de extremo a extremo sobre Previsión de la demanda de energía. Específicamente, cubriremos:

  • Cómo preparar nuestros datos para el formato TFT.
  • Cómo construir, entrenar y evaluar el modelo TFT.
  • Cómo obtener predicciones sobre datos de validación y predicciones fuera de muestra.
  • Como calcular importancia de las características, patrones de estacionalidad, y robustez ante eventos extremos usando el modelo incorporado atención interpretable mecanismo.

¡Vamos a bucear!

Para un análisis en profundidad de la arquitectura Temporal Fusion Transformer, consulte mi artículo anterior artículo.

Temporal Ffusión Trescatador (TFT) es un modelo basado en Transformer que aprovecha la autoatención para capturar la compleja dinámica temporal de múltiples secuencias de tiempo.

TFT admite:

  • Múltiples series temporales: Podemos entrenar un modelo TFT en miles de series temporales univariadas o multivariadas.
  • Pronóstico multihorizonte: El modelo genera predicciones de varios pasos de una o más variables objetivo, incluidos los intervalos de predicción.
  • Características heterogéneas: TFT admite muchos tipos de funciones, incluidas variables exógenas estáticas y variables en el tiempo.
  • Predicciones interpretables: Las predicciones pueden interpretarse en términos de importancia variable y estacionalidad.

Uno de esos rasgos es exclusivo de Transformador de fusión temporal. Cubriremos esto en la siguiente sección.

Entre los modelos de series temporales de DL notables (p. ej., AR profundo[4]), TFT se destaca porque admite varios tipos de funciones. Estos son:

  • variable en el tiempo conocido
  • variable en el tiempo desconocido
  • invariante en el tiempo real
  • invariante en el tiempo categórico

Por ejemplo, imaginemos que tenemos un caso de previsión de ventas:

Digamos que tenemos que predecir las ventas de 3 productos. El num sales es la variable objetivo. El CPI index o de number of visitors en desconocido que varía en el tiempo características porque sólo se conocen hasta el momento de la predicción. Sin embargo, holidaysy special days en conocido que varía en el tiempo eventos.

El product id is una categórica invariante en el tiempo (estática) característica. Otras características que son numéricas y no dependen del tiempo, como yearly_revenue se puede clasificar como real invariante en el tiempo.

Antes de pasar a nuestro proyecto, primero mostraremos un minitutorial sobre cómo convertir sus datos al formato formato de serie temporal extendida.

Nota: Todas las imágenes y figuras de este artículo son creadas por el autor.

Para este tutorial, utilizamos el TemporalFusionTransformer modelo de la Pronóstico de PyTorch biblioteca y PyTorch Lightning:

pip instalar antorcha pytorch-lightning pytorch_forecasting

Todo el proceso implica 3 cosas:

  1. Cree un marco de datos de pandas con nuestros datos de series de tiempo.
  2. Envuelva nuestro marco de datos en un Conjunto de datos de serie temporal ejemplo.
  3. Pasa nuestro Conjunto de datos de serie temporal instancia a TemporalFusionTransformer.

El Conjunto de datos de serie temporal es muy útil porque nos ayuda a especificar si las características varían en el tiempo o son estáticas. Además, es el único formato que TemporalFusionTransformer acepta.

Creemos un conjunto de datos de entrenamiento mínimo para mostrar cómo Conjunto de datos de serie temporal obras:

Debemos formatear nuestros datos de la siguiente manera: cada cuadro de color representa una serie de tiempo diferente, representada por su group .

Figura 1: El marco de datos de los pandas sample_data

La columna más importante de nuestro marco de datos es la time_idx — determina la secuencia de muestras. Si no faltan observaciones, los valores deben aumentar en +1 para cada serie temporal.

A continuación, envolvemos nuestro marco de datos en un Conjunto de datos de serie temporal ejemplo:

Todos los argumentos se explican por sí solos: max_encoder_length define el período retrospectivo y max_prediction_length especifica cuántos puntos de datos se predecirán. En nuestro caso, miramos hacia atrás 3 pasos de tiempo en el pasado para generar 2 predicciones.

El Conjunto de datos de serie temporal La instancia ahora sirve como cargador de datos. Imprimamos un lote y verifiquemos cómo se pasarán nuestros datos a TFT:

Este lote contiene los valores de entrenamiento. [0,1] de la primera serie temporal (group 0) y los valores de prueba[2,3,4]. Si vuelve a ejecutar este código, obtendrá valores diferentes porque los datos se mezclan de forma predeterminada.

Nuestro proyecto utilizará el ElectricidadDiagramas de carga20112014 [ 5 ] conjunto de datos de la UCI. El cuaderno para este ejemplo se puede descargar desde esta página:

Este conjunto de datos contiene el uso de energía (en KW) de 370 clientes/consumidores con una frecuencia de 15 minutos. Los datos abarcan 4 años (2011-2014).

Algunos consumidores se crearon después de 2011, por lo que su consumo de energía inicialmente es cero.

Realizamos preprocesamiento de datos según [ 3 ]:

  • Agrega nuestra variable objetivo power_usage por hora
  • Encuentre la fecha más temprana para cada serie temporal donde la potencia sea distinta de cero.
  • Crear nuevas funciones: month, day, hour y day_of_week.
  • Seleccione todos los días entre 2014–01–01 y 2014–09–07.

Empecemos:

Descarga de datos

wget https://archive.ics.uci.edu/ml/machine-learning-databases/00321/LD2011_2014.txt.zip
!abrir la cremallera
LD2011_2014.txt.zip

Preprocesamiento de datos

Cada columna representa un consumidor. Más inicial power_usage los valores son 0.

A continuación, agregamos datos por horas. Debido al tamaño y la complejidad del modelo, entrenamos nuestro modelo solo en 5 consumidores (para aquellos con valores distintos de cero).

Ahora, preparamos nuestro conjunto de datos para el Conjunto de datos de serie temporal formato. Observe que cada columna representa una serie de tiempo diferente. Por lo tanto, "fundimos" nuestro marco de datos, de modo que todas las series temporales se apilen verticalmente en lugar de horizontalmente. En el proceso, creamos nuestras nuevas funciones.

El marco de datos preprocesado final se llama time_df. Imprimamos su contenido:

El time_df ahora está en el formato adecuado para el Conjunto de datos de serie temporal. Como ya habrás adivinado, dado que la granularidad es horaria, el hours_from_start variable será la índice de tiempo.

Análisis exploratorio de datos

La elección de 5 consumidores/series temporales no es aleatoria. El power usage de cada serie temporal tiene propiedades diferentes, como el valor medio:

time_df[['consumer_id','power_usage']].groupby('consumer_id').mean()

Tracemos el primer mes de cada serie temporal:

Figura 2: El primer mes de las 5 series temporales/consumidores.

No hay una tendencia notable, pero cada serie temporal tiene una estacionalidad y amplitud ligeramente diferentes. Podemos seguir experimentando y comprobar la estacionariedad, las descomposiciones de señales, etc., pero en nuestro caso, nos centramos únicamente en el aspecto de construcción del modelo.

Además, observe que otros métodos de pronóstico de series de tiempo como ARIMA debe satisfacer algunos requisitos (por ejemplo, la serie temporal primero debe volverse estacionaria). Con TFT, podemos dejar nuestros datos como están.

Crear cargadores de datos

En este paso, pasamos nuestro time_df En el correo electrónico “Su Cuenta de Usuario en su Nuevo Sistema XNUMXCX”. Conjunto de datos de serie temporal formato que es inmensamente útil porque:

  • Nos ahorra tener que escribir nuestro propio cargador de datos.
  • Podemos especificar cómo TFT manejará las características del conjunto de datos.
  • Podemos normalizar nuestro conjunto de datos con facilidad. En nuestro caso, la normalización es obligatoria porque todas las secuencias de tiempo difieren en magnitud. Así, utilizamos el Normalizador de grupo para normalizar cada serie temporal individualmente.

Nuestro modelo utiliza una ventana retrospectiva de una semana (7*24) para predecir el uso de energía de las próximas 24 horas.

Además, observe que el hours_from_start es tanto el índice de tiempo como una característica que varía en el tiempo. El power_usage es nuestra variable objetivo. A modo de demostración, nuestro conjunto de validación es el último día:

Modelo de línea de base

A continuación, el paso que casi todo el mundo olvida: un modelo de referencia. Especialmente en el pronóstico de series de tiempo, se sorprenderá de la frecuencia con la que un predictor ingenuo supera incluso a un modelo más sofisticado.

Como punto de partida ingenuo, predecimos la curva de uso de energía del día anterior:

Entrenamiento del modelo de transformador de fusión temporal

Podemos entrenar nuestro modelo TFT usando el familiar Formador interfaz de PyTorch Lightning.

Observe las siguientes cosas:

  • Usamos la Detención temprana devolución de llamada para monitorear la pérdida de validación.
  • Utilizamos Tablero de tensor para registrar nuestras métricas de capacitación y validación.
  • Nuestro modelo utiliza Pérdida cuantil - un tipo especial de pérdida que nos ayuda a generar los intervalos de predicción. Para obtener más información sobre la función de pérdida de cuantiles, mira este articulo.
  • usamos 4 cabezas de atencion, como el documento original.

Ahora estamos listos para construir y entrenar nuestro modelo:

¡Eso es todo! Después de 6 épocas, EarlyStopping se activa y detiene el entrenamiento.

Cargar y guardar el mejor modelo

No olvides guardar tu modelo. Aunque podemos conservarlo, la opción más segura es guardar la mejor época directamente:

!zip -r modelo.zip lightning_logs/lightning_logs/version_1/*

Para cargar el modelo nuevamente, descomprimir modelo.zip y ejecute lo siguiente; solo recuerde la mejor ruta del modelo:

Comprobar tablero tensor

Mire más de cerca las curvas de entrenamiento y validación con Tensorboard:

Evaluación del modelo

Obtenga predicciones sobre el conjunto de validación y calcule el promedio P50 (cuantil mediana) de:

Las últimas dos series temporales tienen una pérdida un poco mayor porque su magnitud relativa también es alta.

Trazar predicciones sobre datos de validación

Si pasamos el mode=raw en predecir() método, obtenemos más información, incluidas predicciones para los siete cuantiles. También tenemos acceso a los valores de atención (más sobre esto más adelante).

Eche un vistazo más de cerca al raw_predictions variable:

Usamos la predicción_trama() para crear nuestras tramas. Por supuesto, puedes crear tu propio gráfico personalizado: el predicción_trama() tiene el beneficio adicional de agregar los valores de atención.

Nota: Nuestro modelo predice los próximos 24 puntos de datos. en una ida. Este no es un escenario de pronóstico continuo en el que un modelo predice una soltero valora cada vez y "une" todas las predicciones.

Creamos una parcela para cada consumidor (5 en total).

Figura 3: Predicciones sobre datos de validación para MT_002
Figura 4: Predicciones sobre datos de validación para MT_004
Figura 5: Predicciones sobre datos de validación para MT_005
Figura 6: Predicciones sobre datos de validación para MT_006
Figura 7: Predicciones sobre datos de validación para MT_008

Los resultados son bastante impresionantes.

Nuestra oficina de Transformador de fusión temporal ¡El modelo pudo capturar el comportamiento de las 5 series temporales, tanto en términos de estacionalidad como de magnitud!

Además, observe que:

  • No realizamos ningún ajuste de hiperparámetros.
  • No implementamos ninguna técnica de ingeniería de funciones sofisticada.

En una sección posterior, mostramos cómo mejorar nuestro modelo con optimización de hiperparámetros.

Predicciones de la trama para una serie temporal específica

Anteriormente, trazamos predicciones sobre los datos de validación utilizando el idx argumento, que itera sobre todas las series de tiempo en nuestro conjunto de datos. Podemos ser más específicos y generar predicciones sobre una serie de tiempo específica:

Figura 7: Predicción del día siguiente para MT_004 en el set de entrenamiento

In Figura 7, trazamos el día siguiente de MT_004 consumidor por índice de tiempo = 26512.

Recuerde, nuestra columna de indexación del tiempo hours_from_start comienza desde 26304 y podemos obtener predicciones desde 26388 en adelante (porque configuramos antes min_encoder_length=max_encoder_length // 2 que es igual 26304 + 168//2=26388

Pronósticos fuera de la muestra

Creemos predicciones fuera de la muestra, más allá del punto de datos final de los datos de validación, que es 2014–09–07 23:00:00

Todo lo que tenemos que hacer es crear un nuevo marco de datos que contenga:

  • El número de N=max_encoder_length fechas pasadas, que actúan como ventana retrospectiva: datos del codificador en terminología TFT.
  • Las fechas futuras del tamaño. max_prediction_length para el cual queremos calcular nuestras predicciones: el datos del decodificador.

Podemos crear predicciones para las cinco series temporales, o solo para una. Figura 7 y XNUMX muestra las predicciones fuera de la muestra para el consumidor MT_002:

Figura 7: Predicción del día siguiente para MT_002

Una cosa es hacer pronósticos precisos, pero hoy en día la explicabilidad también es muy importante.

Y es aún peor para los modelos de Deep Learning, que se consideran cajas negras. Métodos como LIME y FORMA puede proporcionar explicabilidad (hasta cierto punto) pero no funciona bien para series temporales. Además, son métodos externos post-hoc y no están vinculados a ningún modelo en particular.

Transformador de fusión temporal Proporciona tres tipos de interpretabilidad:

  • En cuanto a estacionalidad: TFT aprovecha su novela Atención multicabezal interpretable Mecanismo para calcular la importancia de los pasos en el tiempo pasado.
  • En cuanto a características: TFT aprovecha su Red de selección de variables Módulo para calcular la importancia de cada característica.
  • Robustez ante eventos extremos: Podemos investigar cómo se comportan las series temporales durante eventos raros

Si quieres aprender en profundidad sobre el funcionamiento interno de Atención multicabezal interpretable y red de selección de variables, revisa mi articulo anterior.

Interpretabilidad según la estacionalidad

TFT explora los pesos de atención para comprender los patrones temporales en los pasos del tiempo pasados.

Las líneas grises en todos los gráficos anteriores representan las puntuaciones de atención. Mire esas tramas nuevamente: ¿nota algo? Figura 8 y XNUMX muestra los hallazgos de Figura 7 y XNUMX y también tiene en cuenta las puntuaciones de atención:

Figura 8: Predicción del día siguiente para MT_001 con estacionalidades mostradas

Las puntuaciones de atención revelan cuán impactantes son esos pasos de tiempo en los que el modelo genera su predicción. Los picos pequeños reflejan la estacionalidad diaria, mientras que el pico más alto hacia el final probablemente implica la estacionalidad semanal.

Si promediamos las curvas de atención en todos los pasos y series de tiempo (no solo las 5 que usamos en este tutorial), obtendremos la forma de apariencia simétrica en Figura 9 y XNUMX del documento TFT:

Figura 9: Patrones temporales para el conjunto de datos de electricidad (Fuente)

Pregunta: ¿De qué sirve esto? ¿No podemos simplemente estimar los patrones de estacionalidad con métodos como gráficos ACF, descomposición de señales temporales, etc.?

Respuesta Verdadero. Sin embargo, estudiar los pesos de atención de TFT tiene ventajas adicionales:

  1. Podemos confirmar que nuestro modelo captura la aparente dinámica estacional de nuestras secuencias.
  2. Nuestro modelo también puede revelar patrones ocultos porque los pesos de atención de las ventanas de entrada actuales consideran todas las entradas pasadas.
  3. El gráfico de ponderaciones de atención no es lo mismo que un gráfico de autocorrelación: el gráfico de autocorrelación se refiere a una secuencia particular, mientras que las ponderaciones de atención aquí se centran en el impacto de cada paso de tiempo al observar todas las covariables y series de tiempo.

Interpretabilidad en cuanto a características

El Red de selección de variables componente de TFT puede estimar fácilmente el importancia de las características:

Figura 10: Destaca la importancia de los datos de validación.

In Figura 10 y XNUMX, notamos lo siguiente:

  • El hour y day_of_week tienen puntuaciones sólidas, tanto como observaciones pasadas como covariables futuras. El punto de referencia del artículo original comparte la misma conclusión.
  • El power_usage es obviamente la covariable observada de mayor impacto.
  • El consumer_id No es muy significativo aquí porque utilizamos solo 5 consumidores. En el artículo TFT, donde los autores utilizan a los 370 consumidores, esta variable es más significativa.

Nota: Si su variable estática de agrupación no es importante, es muy probable que su conjunto de datos también pueda modelarse igualmente bien mediante un modelo de distribución único (como ARIMA).

Detección de eventos extremos

Las series temporales son conocidas por ser susceptibles a cambios repentinos en sus propiedades durante eventos raros (también conocidos como choques).

Peor aún, esos acontecimientos son muy esquivos. Imagínese si su variable objetivo se vuelve volátil durante un breve período porque una covariable cambia silenciosamente el comportamiento:

¿Se trata de algún ruido aleatorio o de un patrón persistente oculto que escapa a nuestro modelo?

Con TFT, podemos analizar la solidez de cada característica individual en su rango de valores. Desafortunadamente, el conjunto de datos actual no muestra volatilidad ni eventos raros; es más probable que se encuentren en datos financieros, de ventas, etc. Aún así, mostraremos cómo calcularlos:

Algunas características no tienen todos sus valores presentes en el conjunto de datos de validación, por lo que solo mostramos los hour y consumer_id:

Figura 11: Predicciones frente a datos reales (medias normalizadas) por hora
Figura 12: Predicciones frente a datos reales (medias normalizadas) en consumer_id

En ambos gráficos, los resultados son alentadores. En Figura 12 y XNUMX, notamos que el consumidor MT_004 tiene un rendimiento ligeramente inferior al de otros consumidores. Podríamos verificar esto si normalizamos la pérdida de P50 de cada consumidor con su uso de energía promedio que calculamos anteriormente.

Las barras grises indican la distribución de cada variable. Una cosa que siempre hago es encontrar qué valores tienen una frecuencia baja. Luego, compruebo cómo se desempeña el modelo en esas áreas. Por lo tanto, puedes detectar fácilmente si tu modelo captura el comportamiento de eventos raros.

En general, puede utilizar esta función TFT para probar su modelo en busca de debilidades y continuar con una investigación más profunda.

Podemos usar sin problemas Transformador de fusión temporal Optar para realizar un ajuste de hiperparámetros:

El problema es que, dado que TFT es un modelo basado en Transformer, necesitará importantes recursos de hardware.

Transformador de fusión temporal Es sin duda un hito para la comunidad de Time-Series.

El modelo no sólo logra resultados SOTA, sino que también proporciona un marco para la interpretabilidad de las predicciones. El modelo también está disponible en el Dardos Biblioteca Python, que se basa en la biblioteca PyTorch Forecasting.

Finalmente, si tienes curiosidad por conocer la arquitectura del Transformador de fusión temporal en detalle, consulte el artículo complementario en el papel original.

Transformador de fusión temporal: pronóstico de series temporales con aprendizaje profundo: tutorial completo republicado desde la fuente https://towardsdatascience.com/temporal-fusion-transformer-time-series-forecasting-with-deep-learning-complete-tutorial-d32c1e51cd91?source= rss—-7f60cf5620c9—4 a través de https://towardsdatascience.com/feed

<!–

->

Sello de tiempo:

Mas de Consultores Blockchain