Press "Enter" to skip to content

时间序列分析:VARMAX作为服务

VARMAX-作为服务(VARMAX-As-A-Service)是一种用于统计模型和机器学习模型部署流水线的MLOps方法。这是该项目的第一篇文章,该项目将在此基础上构建一系列实验,涉及各种统计和机器学习模型、使用现有DAG工具实现的数据流水线以及云端和本地备选存储服务。

但是,VARMAX和统计模型以及机器学习模型有何不同呢?

统计模型是数学模型,机器学习模型也是如此。统计模型通常被指定为一个或多个随机变量与其他非随机变量之间的数学关系。因此,统计模型是“一个理论的形式表示”,属于统计推断领域。一些统计模型可以使用预定义的数学公式进行预测,并根据历史数据估计系数。统计模型明确地为数据指定了概率模型,并确定了通常是可解释且特别感兴趣的变量,例如预测变量的影响。除了确定变量之间的关系,统计模型还确定了关系的规模和显著性。

机器学习模型也可以被解释为数学模型。机器学习模型也可以根据历史数据进行预测,而无需显式编程。然而,这些模型更加经验性。机器学习通常不会强制预测变量和结果之间的关系,也不会隔离任何单个变量的影响。变量之间的关系可能无法理解,但我们得到的是预测结果。

现在,让我们关注应用于时间序列数据的预测。时间序列数据可以使用统计建模和机器学习来定义为从同一源连续测量的数据(在固定时间间隔内)。两者都由底层的数学模型表示;它们需要数据进行训练/参数化,并生成代表预测值的新时间序列。由于存在这些相似之处,我们将将用于将机器学习模型作为服务公开的方法应用于用于时间序列预测的统计模型VARMAX。

VARMAX是一个统计模型,或者一般来说,是一个估计模型参数并生成预测的过程。经济或金融变量通常不仅与彼此同时相关,而且与彼此的过去值相关。VARMAX过程可以用于建模这些类型的时间关系。

本文基于一个名为VARMAX-As-A-Service的应用程序,该应用程序可以在专用的GitHub存储库上找到。它由两个主要组件组成:

  • 运行时组件 – 一个经过docker化的可部署REST服务
  • 预处理组件 – 一组负责数据加载、模型优化、模型实例化和模型序列化的Python函数,使其能够在未来进行复用

该应用程序所包含的运行时组件的架构如下图所示:

用户通过浏览器向托管该模型的Apache Web服务器发送请求。在幕后,这是一个Python Flask应用程序,它调用了之前配置和序列化的pickle文件模型。注意,Pickle是Python标准库中的一个序列化模块。

Flask是一个轻量级的WSGI Web应用程序框架。它旨在快速、容易上手,并具备扩展到复杂应用程序的能力。Flask是作为实现公开统计模型API的Web服务的框架的良好选择,它还提供了用于测试的Web服务器。然而,对于在生产环境中部署,我们需要一个Web服务器和网关接口。该项目中创建的Docker镜像在Linux系统上使用Apache httpd和WSGI(Web服务器网关接口)部署Flask应用程序。Apache是一个功能强大且广泛使用的Web服务器,而WSGI是Web服务器和Python应用程序之间的标准接口。Apache httpd是一个快速、生产级别的HTTP服务器。作为“反向代理”,它可以处理传入的请求、TLS和其他安全性和性能问题,比WSGI服务器更好地处理这些问题。

可以在专用的GitHub存储库上找到Docker镜像以及模型代码。

REST服务可以轻松集成到现有的Web应用程序中,作为算法的一部分或作为预测数据流水线的DAG中的一步(例如Apache Airflow、Apache Beam、AWS Step Functions、Azure ML Pipeline)。将其作为流水线的一部分进行集成将成为即将发布的文章的重点,而本文将公开服务作为Swagger文档化的端点和Swagger UI进行测试和实验,以使用各种输入数据集。

部署项目后,Swagger API可以通过<host>:<port>/apidocs(例如127.0.0.1:80/apidocs)访问。已实现两个端点,分别使用用户的输入参数和发送输入文件。

在内部,该服务使用反序列化的模型pickle文件:

请求发送到初始化的模型如下:

在实施REST服务及其部署之前,需要准备实际的模型。在下面的图片中,为了部署模型,需要进行预处理步骤。这个术语不应与数据分析师的数据处理术语混淆。在示例项目中,用于优化模型参数的数据集称为美国宏观经济数据,由Python库statsmodels提供,无需应用额外的数据处理。预处理算法包括以下步骤:

  • 加载数据
  • 将数据分成训练集和测试集 
  • 准备外生变量
  • 寻找最佳模型参数(p, q) 
  • 使用确定的最佳参数实例化模型
  • 将实例化的模型序列化为pickle文件 

最后,运行应用程序所需的步骤如下:

  1. 执行模型准备算法:python varmax_model.py
  2. 部署应用程序:docker-compose up -d
  3. 测试模型:http://127.0.0.1:80/apidocs

所呈现的项目是一个简化的工作流,可以逐步扩展功能,例如:

  • 将模型文件存储在远程存储库中(例如关系数据库、MinIO服务、S3存储)
  • 探索标准序列化格式,并用替代解决方案替换pickle
  • 集成时间序列数据可视化工具,如Kibana或Apache Superset
  • 将时间序列数据存储在时间序列数据库中,如Prometheus、TimescaleDB、InfluxDB
  • 扩展管道以进行数据加载和数据预处理步骤
  • 跟踪模型版本
  • 作为的一部分,包括指标报告
  • 使用特定工具(如Apache Airflow或AWS Step Functions)或更标准的工具(如Gitlab或GitHub)实施管道
  • 比较统计模型与机器学习模型的性能和准确性
  • 实施端到端的云集成解决方案,包括基础设施即代码
  • 将其他统计和机器学习模型作为服务公开

这些未来改进中的一些将是下一篇文章和项目的重点。本文的目标是构建基本的项目结构和简单的处理工作流,可以随着时间的推移进行扩展和改进。然而,它代表了一个端到端的基础设施解决方案,可以在生产环境中部署并随着时间的推移作为CI/CD过程的一部分进行改进。

Leave a Reply

Your email address will not be published. Required fields are marked *