自回归滞后模型进行多变量时间序列预测

news2024/11/17 11:38:01

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。

假设要预测其中一个变量。比如,sparkling wine。如何建立一个模型来进行预测呢?

一种常见的方法是将该变量其视为单变量时间序列。这样就有很多方法可以用来模拟这些系列。比如 ARIMA、指数平滑或 Facebook 的 Prophet,还有自回归的机器学习方法也可以使用。

但是其他变量可能包含sparkling wine未来销售的重要线索。看看下面的相关矩阵。

可以看到sparkling wine的销量(第二排)与其他葡萄酒的销量有相当的相关性。所以在模型中包含这些变量可能是一个好主意。

本文将介绍可以通过一种称为自回归分布滞后(ARDL)的方法来做到这一点。

Auto-Regressive Distributed Lag

ARDL模型采用自回归。自回归是大多数单变量时间序列模型的基础。它主要分为两个步骤。

首先将(单变量)时间序列从一个值序列转换为一个矩阵。可以用用延时嵌入法(time delay embedding)来做到这一点。尽管名字很花哨,但这种方法非常简单。它基于之前的最近值对每个值进行建模。然后建立一个回归模型。未来值表示目标变量。解释变量是过去最近的值。

多元时间序列的思路与此类似,我们可以将其他变量的过去值添加到解释变量中。这就是了被称为自回归分布式滞后方法。分布式滞后的意思指的是使用额外变量的滞后。

现在我们把他们进行整合,时间序列中一个变量的未来值取决于它自身的滞后值以及其他变量的滞后值。

代码实现

多变量时间序列通常是指许多相关产品的销售数据。我们这里以葡萄酒销售时间序列为例。当然ARDL方法也适用于零售以外的其他领域。

转换时间序列

首先使用下面的脚本转换时间序列。

 import pandas as pd
 
 # https://github.com/vcerqueira/blog/
 from src.tde import time_delay_embedding
 
 wine = pd.read_csv('data/wine_sales.csv', parse_dates=['date'])
 
 # setting date as index
 wine.set_index('date', inplace=True)
 
 # you can simulate some data with the following code
 # wine = pd.DataFrame(np.random.random((100, 6)),
 #            columns=['Fortified','Drywhite','Sweetwhite',
 #                      'Red','Rose','Sparkling'])
 
 # create data set with lagged features using time delay embedding
 wine_ds = []
 for col in wine:
     col_df = time_delay_embedding(wine[col], n_lags=12, horizon=6)
     wine_ds.append(col_df)
 
 # concatenating all variables
 wine_df = pd.concat(wine_ds, axis=1).dropna()
 
 # defining target (Y) and explanatory variables (X)
 predictor_variables = wine_df.columns.str.contains('\(t\-')
 target_variables = wine_df.columns.str.contains('Sparkling\(t\+')
 
 X = wine_df.iloc[:, predictor_variables]
 Y = wine_df.iloc[:, target_variables]

将 time_delay_embedding 函数应用于时间序列中的每个变量(第 18-22 行)。第 23 行将结果与我们的数据集进行合并。

解释变量 (X) 是每个变量在每个时间步长的最后 12 个已知值(第 29 行)。以下是它们如何查找滞后 t-1(为简洁起见省略了其他滞后值):

目标变量在第30行中定义。这指的是未来销售的6个值:

建立模型

准备好数据之后,就可以构建模型了。使用随机森林进行一个简单的训练和测试循环。

 from sklearn.model_selection import train_test_split
 from sklearn.metrics import mean_absolute_error as mae
 from sklearn.ensemble import RandomForestRegressor
 
 
 # train/test split
 X_tr, X_ts, Y_tr, Y_ts = train_test_split(X, Y, test_size=0.3, shuffle=False)
 
 # fitting a RF model
 model = RandomForestRegressor()
 model.fit(X_tr, Y_tr)
 
 # getting forecasts for the test set
 preds = model.predict(X_ts)
 
 # computing MAE error
 print(mae(Y_ts, preds))
 # 288.13

拟合模型之后(第11行),得到了测试集中的预测(第14行)。该模型的平均绝对误差为288.13。

滞后参数的选择

上面的基线使用每个变量的 12 个滞后作为解释变量。这是在函数 time_delay_embedding 的参数 n_lags 中定义的。那么应该如何设置这个参数的值呢?

很难先验地说应该包括多少值,因为 这取决于输入数据和特定变量。

解决这个问题的一种简单方法是使用特征选择。从相当数量的值开始,然后根据重要性评分或预测性能来修改这个数字,或者直接使用GridSearch进行超参数的搜索。

我们这里将简单的演示一个判断的过程:根据随机森林的重要性得分选择前 10 个特征。

 # getting importance scores from previous model
 importance_scores = pd.Series(dict(zip(X_tr.columns, model.feature_importances_)))
 
 # getting top 10 features
 top_10_features = importance_scores.sort_values(ascending=False)[:10]
 top_10_features_nm = top_10_features.index
 
 X_tr_top = X_tr[top_10_features_nm]
 X_ts_top = X_ts[top_10_features_nm]
 
 # re-fitting the model
 model_top_features = RandomForestRegressor()
 model_top_features.fit(X_tr_top, Y_tr)
 
 # getting forecasts for the test set
 preds_topf = model_top_features.predict(X_ts_top)
 
 # computing MAE error
 print(mae(Y_ts, preds_topf))
 # 274.36

前10个特征比原始预测显示出更好的预测性能。以下是这些功能的重要性:

目标变量(Sparkling)的滞后是最重要的。但是其他变量的一些滞后也是相关的。

ARDL 的扩展

多个目标变量预测,目前为止,我们都在预测单个变量(sparkling wine)。如果我们想要同时预测几个变量呢?

这种方法被称为:向量自回归 (VAR)

就像在 ARDL 中一样,每个变量都是根据其滞后和其他变量的滞后建模的。当想要预测多个变量而不仅仅是一个变量时,将使用 VAR。

与全局预测模型的关系

值得注意的是,ARDL并不等同于全局预测模型(Global Forecasting Models)。

在ARDL的前提下,每个变量的信息被添加到解释变量中。变量的数量通常很少,且大小相同。

全局预测模型汇集了许多时间序列的历史观测结果。模型通过这些所有观察结果进行建模。每一个新的时间序列都是作为新的观察结果加入到数据中。全局预测模型通常涉及多达数千个时间序列量级也很大。

总结

本文的主要内容如下:多变量时间序列包含两个或多个变量;ARDL 方法可用于多变量时间序列的监督学习;使用特征选择策略优化滞后数。如果要预测多个变量,可以使用 VAR 方法。

最后本文的数据集在这里:

https://avoid.overfit.cn/post/ff41c484a5cc452cbf2caa3071d768c1

作者:Vitor Cerqueira

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【从零开始学微服务】04.微服务架构的特点

大家好,欢迎来到万猫学社,跟我一起学,你也能成为微服务专家。 微服务架构被技术大牛们总结出了以下九个特点: 服务组件化围绕业务功能产品而不是项目强终端弱管道去中心化管理去中心化数据管理基础设施自动化容错性设计演进式设计…

Python 快速入门

文章目录Python 快速入门1 环境配置1.1 简介1.2 Python 安装1.3 其余软件1.4 编辑器的使用2 基础语法2.1 特点2.2 代码块2.3 注释3 数据类型3.1 变量类型3.2 数据结构3.3 运算符3.3.1 逻辑运算符3.3.2 比较运算符3.3.3 算术运算符3.3.4 布尔运算符4 流程语句4.1 循环语句4.1.1 …

Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)

需要全部源码或运行有问题请点赞关注收藏后评论区留言~~~ 一、通过okhttp调用HTTP接口 尽管使用HttpURLConnection能够实现大多数的网络访问操作,但是操作过于繁琐,于是Andorid从9.0是使用okhttp这个框架 由于okhttp属于第三方框架 所以使用前要修改模…

我们的程序是如何跑起来的?

1.我们写的代码写完并测试以后是如何部署给用户使用的? 1. 准备所需要的服务器 2. 在服务器上安装JDK、mysql、redis、Tomcat、Nginx等环境 3. 进行mysql、redis、nginx的连接配置 4. 项目打包。前端构建打包成功后在根目录dist文件夹中;后端打成jar包&#xff0c…

基于改进海洋捕食者算法求解单目标优化问题附matlab代码(NMPA)

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

VLAN网络支持ipv6的交换机和虚机配置

VLAN支持ipv6的交换机和虚机配置前言一、创建VLAN网络并配置交换机1.规划并在OpenStack上创建 VLAN网络2.在交换机上配置VLAN二、Ubuntu虚机配置1.创建虚机2.在OpenStack上查看port3.登录虚机配置网卡3.1登录虚机后,发现虚机没获取到openstack上对应port的ipv6地址。…

Qt编写跨平台视频监控系统(64通道占用7%CPU/支持win_linux_mac等)

一、前言 视频监控组件经历过数十年的迭代,从最初的只简单播放个rtsp视频流,到现在支持各种音频视频文件格式(mp3、wav、mp4、asf、rm、rmvb、mkv等)、支持各种视频流格式(rtp、rtsp、rtmp、http等)、支持…

10个JavaScript常见高级知识点

今天,给大家分享的是一篇干货知识《10个JavaScript常见高级知识点》,主要针对初级前端和想要面试找工作的同学,想要学好前端,除了要掌握JavaScript的基础知识外,还需要掌握一些高级的知识点。 学会了下面这些常见的高…

鼠标经过图片在边框内放大动效

鼠标没有经过: 鼠标经过的时候,看图,应该可以看出变化吧!图有放大的效果。 样式:图片由一个盒子包着,盒子加上overflow:hidden的样式,即可以保证图片在边框内放大。 然后给图片加上动画效果就可…

JavaWeb开发之——数据库设计(20)

一 概述 数据库设计-简介数据库设计-多表关系实现数据库设计-案例 二 数据库设计-简介 2.1 软件的研发步骤 2.2 数据库设计概念 数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS(Database Management System-数据库管理系统),为这个业务系…

运动哪种耳机好用,推荐五款适合运动的耳机分享

​经常佩戴耳机的小伙伴都知晓传统的蓝牙耳机相对于有线耳机来说比较方便,但也存在着耳道一直堵塞导致细菌的滋生等因素的存在,但在近些年火热的骨传导耳机却能够将这些问题一一化解,基本可以说是百利而无一害,所以今天我就给小伙…

第一章 计算机系统体系结构

1.1 什么是计算机体系结构 本章的第一个概念是计算机系统(computer system)。 计算机系统包括读取并执行程序的 中央处理单元(CPU, 保存程序和数据的存储器以及将芯片转换为实用系统的 其他子系统。 这些子系统会使CPU与显示器、打印机、Internet等外部设备之间的…

【优化求解】整数规划求解机票超售优化赔付问题【含Matlab源码 2182期】

⛄一、问题 A航空公司每天有6班航班从上海到北京,从上午10点到晚上8点,每两小时发一班航班。某天获知,前三班机每班可以容纳100名旅客,后三班机每班可以容纳150名旅客。如果某次航班超售,A航空公司可以把某预定了该次…

【JSP/Servlet】基于WEB的通讯录系统

巩固JSP/Servlet系统开发描述步骤系统功能描述一、创建一个登录页面二、模拟数据(用数据库模拟用户名和密码还有用户的通讯录)三、创建一个JDBC工具类四、判断在登录页面输入的用户名和密码是否正确五、利用cookie实现保存六、以表格形式显示出我的通讯录…

2022最新MySQL面试题-有详细完整的答案解析

MySQL专题面试题 MySQL中有哪些存储引擎? InnoDB存储引擎 InnoDB是MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期(short-lived)事务,应该优先考虑InnoDB引擎。 MylSAM存储引擎 在MySQL 5.1及之前的…

操作简单的BI数据分析软件有哪些?实际体验如何?

使用者没有IT基础,不懂代码,又需要对大量复杂的数据进行深度分析;分析效率要高;报表要直观易理解;最好能让每个浏览者都自己动手做分析。现在市面上,能够满足这些要求的BI数据分析软件有哪些?实…

一文速通MybatisPlus

目录 Mybatis-plus简介 MP特性 框架的结构 MP快速入门 配置日志输出 主键生成策略 自动填充 方式一:数据库级别 方式二:代码控制级别(常用) 乐观锁和悲观锁 测试乐观锁单线程成功的例子 乐观锁多线程失败案例 查询操作 分页查询 删除操作 删除…

C++ 手动实现单向循环链表(课后作业版)

单向循环链表&#xff0c;并实现增删查改等功能 首先定义节点类&#xff0c;类成员包含当前节点的值&#xff0c; 指向下一个节点的指针 循环链表的尾节点指向头节点 节点定义&#xff1a; //node definition template <typename T> class Node { public:T value;Nod…

Vue的生命周期快速入门

图示 流程 new Vue()实例化一个vue实例&#xff0c;然后init初始化event 和 lifecycle&#xff0c; 其实这个过程中分别调用了3个初始化函数&#xff08;initLifecycle(), initEvents(), initRender()&#xff09;&#xff0c;分别初始化了生命周期&#xff0c;事件以及定义cr…

k8s 资源管理及查看命令

关注 迪答数据 公众号获取更多 技术/数据 干货文章 文章传送门&#xff1a;数据治理之指标体系管理 管理容器的计算资源 参考文档&#xff1a; Kubernetes Managing Compute Resources for Containers(opens new window)https://kubernetes.io/docs/concepts/configuration/m…