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

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

假设要预测其中一个变量。比如,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://rdrr.io/cran/Rssa/man/AustralianWine.html

作者:Vitor Cerqueira

本文转载于网络 如有侵权请联系删除

相关文章

  • Apache自定义日志格式

    大家好,又见面了,我是你们的朋友全栈君。1.Apache日志参数说明:Apache日志格式字符串的含义 %%百分号(Apache2.0.44或更高的版本) %a远端IP地址 %A本机IP地址 %B除HTTP头以外传送的字节数 %b以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示’-‘而不是0。 %{Foobar}C在请求中传送给服务端的cookieFoobar的内容。 %D服务器处理本请求所用时间,以微为单位。 %{FOOBAR}e环境变量FOOBAR的值 %f文件名 %h远端主机 %H请求使用的协议 %{Foobar}i发送到服务器的请求头Foobar:的内容。 %l远端登录名(由identd而来,如果支持的话),除非IdentityCheck设为”On“,否则将得到一个”-”。 %m请求的方法 %{Foobar}n来自另一个模块的注解Foobar的内容。 %{Foobar}o应答头Foobar:的内容。 %p服务器服务于该请求的标准端口。 %P为本请求提供服务的子进程的PID。 %{format}P服务于该请求的PID或TID(线程ID),format的取

  • typora安卓_Markdown编辑器:Typora

    大家好,又见面了,我是你们的朋友全栈君。免费好用的Markdown写作工具,支持图片,代码高亮、插入表格、自定义主题、CSS完全配置等。如果你懂一点计算机基础,它还可以是一个“浏览器”。Typora(V0.9.9.26)关于Typora的介绍如下:Readable&WritableTyporawillgiveyouaseamlessexperienceasbothareaderandawriter.Itremovesthepreviewwindow,modeswitcher,syntaxsymbolsofmarkdownsourcecode,andallotherunnecessarydistractions.Replacethemwithareallivepreviewfeaturetohelpyouconcentrateonthecontentitself.DistractionsFreeSeamlessLivePreviewWhatYouSeeIsWhatYouMean软件下载地址:https://www.typora.io/download/Typora-0.9.9.2

  • 大厂面试系列一些问题的解答(三)

    为什么要用volatile关键字?答:在高并发时会出现并发模式异常,volatile可以防止指令重排,创建对象操作并不是一个原子操作,分为三个步骤(1)构建对象:根据Person类元信息确定对象的大小,向JVM堆中申请一块内存区域并构建对象的默认信息(加载Person对象成员变量信息并赋默认值如int类型为0,引用类型为null)。(2)初始化对象:然后执行对象内部生成的init方法,初始化成员变量值,同时执行搜集到的{}代码块逻辑,最后执行对象构造方法。(3)引用对象:对象实例化完毕后,再把栈中的Person对象引用地址指向Person对象在堆内存中的地址......java并发锁机制。(1)偏向锁:JDK1.6提出来的一种锁优化的机制。其核心的思想是,如果程序没有竞争,则取消之前已经取得锁的线程同步操作。也就是说,若某一锁被线程获取后,便进入偏向模式,当线程再次请求这个锁时,就无需再进行相关的同步操作了,从而节约了操作时间,如果在此之间有其他的线程进行了锁请求,则锁退出偏向模式(2)轻量级锁:如果偏向锁失败,Java虚拟机就会让线程申请轻量级锁,轻量级锁在虚拟机内部,使用一个成为B

  • js逐步实现原生flex系统

    html部分:<divclass="panels"> <divclass="panelpanel1"> <p>Hey</p> <p>Let's</p> <p>Dance</p> </div> <divclass="panelpanel2"> <p>Give</p> <p>Take</p> <p>Receive</p> </div> <divclass="panelpanel3"> <p>Experience</p> <p>It</p> <p>Today</p> </div> <divclass="panelpanel4"> <p>Give</p>

  • web自动化测试实战之批量执行测试用例

    本文参考Python自动化测试实战(作者:无涯)+网上教程+小编实战操练,感谢前人的教程学学他人的知识点,一步一步变为自己的知识点,也可以从中衍生新的测试思想与方法. 01实战之分离测试固件 在UI自动化测试中,不管编写哪个模块的测试用例,都需要首先在测试类中编写测试固件初始化WebDriver类及打开浏览器,执行登录,才能进行下一步业务逻辑的操作,测试用例执行完成后还需要关闭浏览器,这部分的代码如下: importunittest fromseleniumimportwebdriver importtime,os classInitTest(unittest.TestCase): @classmethod defsetUpClass(cls): #print('start!进入初始化环境') cls.dr=webdriver.Chrome() cls.dr.maximize_window() #print('测试浏览器为:{0}'.format(cls.dr.name)) time.sleep(1) ulr1='http://**

  • - `Yoga (= 0.44.0.React)` required by `React/Core (0.44.0)`

    bug出现环境背景使用Cocospod安装RN的时候,报错bug分析[!]Unabletosatisfythefollowingrequirements:-`Yoga(=0.44.0.React)`requiredby`React/Core(0.44.0)`Noneofyourspecsourcescontainaspecsatisfyingthedependency:`Yoga(=0.44.0.React)`.Youhaveeither: *out-of-datesourcereposwhichyoucanupdatewith`podrepoupdate`. *mistypedthenameorversion. *notaddedthesourcerepothathoststhePodspectoyourPodfile.Note:asofCocoaPods1.0,`podrepoupdate`doesnothappenon`podinstall`bydefault.分析可知React/core依赖于Yoga所以咱应该使用pod添加Yoga,那么Yaga在什么目录下呢。如果你已经使用n

  • 去伪存真 厘清云计算的五大误解

    今年,企业在云方面的支出将达到约1740亿美元,到2017年预计将增长到2350亿美元。云业务的巨大商机,使我们有必要简单描述有关云计算的常见的五大误解,以厘清事实真相。误解1:公有云是采购IT服务的最廉价方式公有云的一个特征是采用相对便宜的“按用付费”计费模式。但一旦深入研究,就会发现事实其实不是这样。对于经常需要用到的资源,企业可以利用其他云模式来降低成本,比如通过私有云交付的共享资源。在这种情况下,私有云甚至比按用付费的公有云更便宜。这就像买车和租车的关系一样。如果是短期用途,租车更合算,因为您用得少,费用也少。然而,如果您经常并长期用车,则买车更划算(当然,除了价格之外还有其它重要的因素需要考虑,如性能、安全性、合规性、服务水平协议以及供应情况,更不用说您选择的解决方案是否真的满足您的业务需求并达到预期的效果)。误解2:从虚拟化逐步过渡是实现云的唯一途径企业有许多理由引进虚拟化技术,例如可以更高效地利用现有的计算资源,改进灵活性等。虚拟化毫无疑问是改造IT过程中有力的一步。但它只是一步而已,只有当企业完全接受云计算时,变革才真正到来。实际上,如今实现云所需的付出比前几年大大降低

  • 义乌中学暑假集训 2021.07.15 B

    义乌中学暑假集训2021.07.15B白云建立了n个商店,白兔打算按照编号1\simn的顺序访问这些商店。商店i有一个价格ai表示交易商品所需的代价。白兔在按顺序走时,每到达一个商店,可以花费代价购买一件商品,并放入自己手中。也可以出售手上的商品,并获得利润。白兔的力量有限,同一时刻只能携带一个商品。问它遍历完所有商店后能够获得的利润最大是多少?白兔的精力也有限,所以,在最大化利润的前提下,它想让交易次数尽可能地少。当然,白云不想让白兔轻松获利,它有时会命令一段区间内的商店把价格同时加上一个数。T\leq5,1\leqn,Q\leq10^5,c\leq10^5。Sol第一问十分简单,直接贪心考虑,\foralli\in[1,n),若a_i<a_{i+1}i买入,在i+1卖出一定是最优的。第二问考虑线段树,其实就是在第一问差分的基础上,求所有极长非负整数区间且区间和大于0的个数。直接线段树即可。#include<bits/stdc++.h> #defineIinline #defineWwhile #defineRIregisterint #defineCnconst

  • web前端网页设计制作_网页制作教程

    简易旅游网,静态网页制作页面效果代码如下<!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <metahttp-equiv="X-UA-Compatible"content="IE=edge"> <metaname="viewport"content="width=device-width,initial-scale=1.0"> <title>Document</title> <linkrel="stylesheet"href="index.css"</head> <body> <divclass="headercon"> <divclass="photo"></d

  • Latex — 写作编译过程中遇到问题记录与总结

      最近在训练的时候,又开始用Latex进行写作。碰到了很多问题,将问题进行记录与总结。   一、输出中文的问题   由于写作的时候用的是中文,而之前用的是英文,故碰到的第一个问题就是中文的问题。我之前下的是WinEdit7.0,为此我安装了一个TeXstudio。这个软件的好处在于,你可以边写边看。   安装好之后,要设置一下编辑器的环境。   1.点击Options->ConfigureTeXsstudio...,如何看到Gernaral->Languege->zh_CN,将其设为中文。   2.设置完中文后,找到配色方案,然后选择现代。   3.为了可以输出中文,还需要更改一下编译器。在构建->默认编辑器中,选择XeLaTex。之后,在编辑器里->默认字体编码中,选UTF-8。   之后就好了。这一部分主要是参考的:06LaTeX学习系列之---TeXstudio的使用。   &

  • 在NS2中移植实现MFlood协议

    一、将MFlood路由协议添加到NS2中。 1.在NS2中新建文件夹放置协议的代码文件。 首先需要下载mflood协议,其中包括两个文件夹:一个是mflood协议(还有文件把mflood.cc,mflood.h,mflood-seqtable.cc,mflood-seqtable.h,mflood-packet.h),一个是用于mflood测试的文件夹。 在ns-2.35目录下建立mflood文件夹,把上述的(mflood.cc,mflood.h,mflood-seqtable.cc,mflood-seqtable.h,mflood-packet.h)文件放在该mflood文件夹下面。 2.修改NS2中的相关文件packet.h、ns_packet.tcl和ns_lib.tcl。 修改ns-2.35/common/packet.h文件 修改ns-2.35/tcl/lib/ns-packet.tcl文件 修改ns2.35/tcl/lib/ns-lib.tcl文件 3.修改Makefile文件。 修改ns-2.35/Makefile,在OBJ_C

  • Spring Boot快速入门

    引入Web模块 当前的pom.xml内容如下,仅引入了两个模块: spring-boot-starter:核心模块,包括自动配置支持、日志和YAML spring-boot-starter-test:测试模块,包括JUnit、Hamcrest、Mockito <dependencies><dependency><groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>&

  • apple-touch-icon-precomposed

    <linkrel="apple-touch-icon-precomposed"href="">复制      apple-touch-icon-precomposed是苹果为iOS设备配备了apple-touch-icon私有属性,支持size属性,可以用来适应不同的设备。     当属性值为apple-touch-icon-precomposed时,系统将不会对图标添加类似于圆角和高光效果;当属性值为apple-touch-icon时系统会自动为图标添加圆角及高光。

  • C++学习笔记_four_day

    Oop编程示例:1、经典案例:武林趣事             某年某月某日         张无忌偷袭了令狐冲         经平一指诊断 令狐冲受伤了分析:如何用程序实现上述事件?(1)分析事件中有哪些名词和动词(2)从类的角度将这些名次和动词联系在一起 案例设计:(1)需要设计几个类?(2)每个类的属性和行为是什么?(3)如何使用这些类的对象? //Fight.cc #include<iostream> usingnamespacestd; //1.设计类 /** *Hero类 **/ classHero { stringm_name;//姓名 boolm_status;//身体状态 public: Hero(stringname):m_name

  • 专业实训项目需求分析

    实训作品:餐厅点餐系统 业务需求:餐厅服务员手写订单很不方便,需要实现订单自动生成。可以让服务员了解餐桌的实时状态。顾客可以了解菜品的样式,而不仅仅是传统菜单的菜单名称。 用户类型:餐厅服务员,到餐厅吃饭的顾客 用户需求:餐厅服务员需要系统实现显示餐桌的是否有人,可以自动生成订单,查看顾客的结账状态。顾客需要显示菜品的种类、样式和价格,可以退菜。 软件需求:餐桌状态显示,菜品的显示,订单生成和退菜,顾客是否结账,餐桌是否可以重新接待客人。

  • 对css float 浮动的学习心得

    cssfloat浮动详解 @(cssfloat)[hasLayout|clearfloat|妙瞳] cssfloat的定义和用法 float属性定义元素在哪个方向浮动。以往这个属性总应用于图像,使文本围绕在图像周围,不过在CSS中,任何元素都可以浮动。浮动元素会生成一个块级框,而不论它本身是何种元素。 如果浮动非替换元素,则要指定一个明确的宽度;否则,它们会尽可能地窄。 注释:假如在一行之上只有极少的空间可供浮动元素,那么这个元素会跳至下一行,这个过程会持续到某一行拥有足够的空间为止。 默认值:none; 继承性:no; 版本:CSS1 JavaScript语法:object.style.cssFloat="left"; 复制 可能的值 值 描述 left 元素向左浮动。 right 元素向右浮动。 none 默认值。元素不浮动,并显示在其在文本中出现的位置。 inherit 规定应该从父元素继承float属性的值。 复制 简单示例 这里用到了float:left;我们把ul元素和a元素浮向左浮动。 clearfloat clearfl

  • Perl(二)——不常见技巧

    前言: 刚开始学Perl,记录一些我认为不常见(未必)的技巧。 chomp #用于删除字符串结尾的换行符。 #################### #!/usr/bin/perl usestrict; usewarnings; my$path=`pwd`;#`pwd`使shell输出当前文件夹地址,输出包含一个换行符\n my$another_path=$path;#复制一个同名字符串 print("$path"); chomp($path);#删除字符串结尾换行符 die("error")unless(-d$path); print"nothingwrong";复制 my$another_path=$path复制 die("errorhappend")unless(-d$another_path);#由于存在换行符,会输出errormsg复制 qw #qw函数用于给每个字符串加上引号 @word=qw(thisispassword);复制  

  • 为什么要写博客?

    工程师该怎样才能突破自己的能力瓶颈?写blog! 工程师该怎样精进自己在职涯上所需要的能力?写blog! 工程师该怎样才能保持学习与成长的动能?写blog! 工程师该怎样才能证明自己的潜力与特质?写blog! 工程师该怎样才能发挥与养成影响力?写blog! 一件事情只有想到才能做的到,要想说给别人听,自己就得弄的相当清楚才行!写blog!写blog!  

  • Wampserver 2.5安装

    PHP服务器组件 PHP服务器组件非常多有WampServer、XAMPP、AppServ、phpStudy、phpnow等。 菜鸟教程推荐:WampServer,这也是目前window平台上使用最广泛的,操作也非常简单。WampServer内部还集成了PhpMyAdmin数据库管理工具。 我的windows版本太低,装最新版本的wampserver总是出错,下载Wampserver2.5。 https://wamp.soft32.com/ 成功

  • 动态路由的传参:

    params传参 定义动态路由:       传输参数:       接收参数:       props传参: 值为布尔值的形式 定义动态路由:       传输参数:       接收参数:    

  • 前端传递一个数组,后台接收方法

     

相关推荐

推荐阅读