Análisis de series temporales VARMAX como un servicio

VARMAX time series analysis as a service.

VARMAX-As-A-Service es un enfoque de MLOps para la unificación y reutilización de modelos estadísticos y tuberías de implementación de modelos de aprendizaje automático. Es el primero de una serie de artículos que se construirán sobre ese proyecto, representando experimentos con varios modelos estadísticos y de aprendizaje automático, tuberías de datos implementadas utilizando herramientas DAG existentes y servicios de almacenamiento, tanto basados en la nube como soluciones alternativas locales.

Pero, ¿qué es VARMAX y los modelos estadísticos en general y cómo se diferencian de los modelos de aprendizaje automático?

Los modelos estadísticos son modelos matemáticos, al igual que los modelos de aprendizaje automático. Un modelo estadístico generalmente se especifica como una relación matemática entre una o más variables aleatorias y otras variables no aleatorias. Como tal, un modelo estadístico es “una representación formal de una teoría” y pertenece al campo de la inferencia estadística. Algunos modelos estadísticos se pueden utilizar para hacer predicciones utilizando fórmulas matemáticas predefinidas y estimando coeficientes basados en datos históricos. Los modelos estadísticos especifican explícitamente un modelo probabilístico para los datos e identifican variables que suelen ser interpretables y de especial interés, como los efectos de las variables predictoras. Además de identificar las relaciones entre variables, los modelos estadísticos establecen tanto la escala como la significación de la relación.

Los modelos de aprendizaje automático también se pueden interpretar como modelos matemáticos. Los modelos de ML también pueden construir predicciones basadas en datos históricos sin programación explícita. Sin embargo, esos modelos son más empíricos. El aprendizaje automático generalmente no impone relaciones entre predictores y resultados, ni aísla el efecto de ninguna variable individual. Las relaciones entre variables pueden no ser comprensibles, pero lo que se proporciona después son predicciones.

Ahora, centrémonos en las predicciones o pronósticos aplicados a datos de series temporales. Los datos de series temporales se pueden definir como mediciones sucesivas realizadas desde la misma fuente durante un intervalo de tiempo fijo utilizando modelado estadístico y aprendizaje automático. Ambos están representados por un modelo matemático subyacente; necesitan datos para ser entrenados/parametrizados y producen nuevas series temporales que representan valores pronosticados. Con esas similitudes, aplicaremos el enfoque utilizado para exponer modelos de aprendizaje automático como servicios a un modelo estadístico utilizado para el pronóstico de series temporales llamado VARMAX.

VARMAX es un modelo estadístico o, en términos generales, un procedimiento que estima los parámetros del modelo y genera pronósticos. A menudo, las variables económicas o financieras no solo están correlacionadas entre sí de manera contemporánea, sino también correlacionadas con los valores pasados de las demás. El procedimiento VARMAX se puede utilizar para modelar estos tipos de relaciones temporales.

Este artículo se basa en una aplicación llamada VARMAX-As-A-Service que se puede encontrar en un repositorio dedicado de GitHub. Está compuesto por dos componentes principales:

  • Componente de tiempo de ejecución – un servicio REST dockerizado y desplegable
  • Componente de preprocesamiento – un conjunto de funciones de Python responsables de la carga de datos, la optimización del modelo, la instanciación del modelo y la serialización del modelo, lo que permite su reutilización futura

La arquitectura del componente de tiempo de ejecución que comprende la aplicación se muestra en la siguiente imagen:

El usuario envía una solicitud a través de un navegador a un servidor web Apache que aloja el modelo. En segundo plano, esto es una aplicación Flask de Python que llama a un modelo de archivo pickle previamente configurado y serializado. Tenga en cuenta que Pickle es un módulo de serialización en la biblioteca estándar de Python.

Flask es un marco de aplicación web WSGI ligero. Está diseñado para que sea rápido y fácil comenzar, con la capacidad de escalar a aplicaciones complejas. Flask es una buena elección como marco para la implementación de un servicio web que expone la API del modelo estadístico, y también proporciona un servidor web para pruebas. Sin embargo, para el despliegue en producción, necesitamos un servidor web y una interfaz de puerta de enlace. La imagen Docker creada en ese proyecto está desplegando la aplicación Flask utilizando Apache httpd y WSGI (Interfaz de Puerta de Enlace de Servidor Web) en un sistema basado en Linux. Apache es un servidor web potente y ampliamente utilizado, mientras que WSGI es una interfaz estándar entre servidores web y aplicaciones de Python. Apache httpd es un servidor HTTP rápido de nivel de producción. Al servir como un “proxy inverso”, puede manejar solicitudes entrantes, TLS y otras preocupaciones de seguridad y rendimiento mejor que un servidor WSGI.

La imagen Docker, así como el código del modelo, se pueden encontrar en un repositorio dedicado de GitHub.

Los servicios REST se pueden integrar fácilmente en aplicaciones web existentes como parte de un algoritmo o como un paso en una DAG de una tubería de datos de predicción (consulte Apache Airflow, Apache Beam, AWS Step Functions, Azure ML Pipeline). La integración como parte de la tubería será el enfoque de un próximo artículo, mientras que este expone el servicio como un punto final documentado por Swagger y una interfaz de usuario de Swagger para realizar pruebas y experimentar con varios conjuntos de datos de entrada.

Después de implementar el proyecto, la API de Swagger es accesible a través de <host>:<port>/apidocs (por ejemplo, 127.0.0.1:80/apidocs). Se implementan dos puntos finales, utilizando los parámetros de entrada del usuario y enviando un archivo de entrada:

Internamente, el servicio utiliza el archivo de modelo deserializado pickle:

Las solicitudes se envían al modelo inicializado de la siguiente manera:

Antes de implementar el servicio REST y su implementación, es necesario preparar el modelo real. En la imagen de abajo, el paso necesario para preparar el modelo para su implementación se llama paso de preprocesamiento. No debe confundirse con el término procesamiento de datos de los analistas de datos. En el proyecto de ejemplo, el conjunto de datos utilizado para optimizar los parámetros del modelo se llama datos macroeconómicos de Estados Unidos y se proporciona mediante la biblioteca de Python statsmodels sin necesidad de aplicar un procesamiento adicional de datos. El algoritmo de preprocesamiento consta de los siguientes pasos:

  • Cargar datos
  • Dividir los datos en un conjunto de datos de entrenamiento y prueba
  • Preparar variables exógenas
  • Encontrar los parámetros óptimos del modelo (p, q)
  • Instanciar el modelo con los parámetros óptimos identificados
  • Serializar el modelo instanciado en un archivo pickle

Y finalmente, los pasos necesarios para ejecutar la aplicación son:

  1. Ejecutar el algoritmo de preparación del modelo: python varmax_model.py
  2. Implementar la aplicación: docker-compose up -d
  3. Probar el modelo: http://127.0.0.1:80/apidocs

El proyecto presentado es un flujo de trabajo simplificado que se puede ampliar paso a paso con funcionalidades adicionales como:

  • Almacenar archivos de modelo en un repositorio remoto (por ejemplo, una base de datos relacional, el servicio MinIO, almacenamiento S3)
  • Explorar formatos de serialización estándar y reemplazar el pickle con una solución alternativa
  • Integrar herramientas de visualización de datos de series temporales como Kibana o Apache Superset
  • Almacenar datos de series temporales en una base de datos de series temporales como Prometheus, TimescaleDB, InfluxDB
  • Ampliar el pipeline con pasos de carga y preprocesamiento de datos
  • Hacer un seguimiento de las versiones del modelo
  • Incorporar informes de métricas como parte de la 
  • Implementar pipelines utilizando herramientas específicas como Apache Airflow o AWS Step Functions o herramientas más estándar como Gitlab o GitHub
  • Comparar el rendimiento y la precisión de los modelos estadísticos con los modelos de aprendizaje automático
  • Implementar soluciones integradas en la nube de extremo a extremo, incluyendo Infraestructura como Código
  • Exponer otros modelos estadísticos y de ML como servicios

Algunas de estas mejoras futuras serán el foco de los próximos artículos y proyectos. El objetivo de este artículo es construir la estructura básica del proyecto y un flujo de trabajo de procesamiento simple que se puede ampliar y mejorar con el tiempo. Sin embargo, representa una solución infraestructural de extremo a extremo que se puede implementar en producción y mejorar como parte de un proceso de CI/CD a lo largo del tiempo.