首页天道酬勤多元时间序列分析及其应用(时间序列建模的一般方法)

多元时间序列分析及其应用(时间序列建模的一般方法)

admin 12-01 10:06 555次浏览

简介

时间是决定企业兴衰的最关键因素。这也是为什么我们看到店铺和电商平台的销量与节日一致的原因。这些企业分析了多年的支出数据,才知道开门见山、看消费支出增长的最佳时机。

但是作为一个数据科学家,你是怎么做这个分析的呢?别担心,你不需要建造时间机器!时间序列建模是一项强大的技术,可以作为理解和预测趋势和模式的网关。

但是即使是时间序列模型也有不同的方面。我们在网上看到的大多数例子都涉及单变量时间序列。不幸的是,现实世界的用例并非如此。有许多变量在起作用,同时处理所有这些变量是数据科学家将获得其价值的地方。

在这篇文章中,我们将学习什么是多元时间序列以及如何处理它。我们还将进行一个案例研究,并用Python实现它,这样您就可以对该主题有一个实际的理解。

一、单变量时间序列和多变量时间序列

本文假设您熟悉单变量时间序列、其属性和各种预测技术。由于本文将关注多变量时间序列,我建议您阅读以下文章作为单变量时间序列的良好介绍:

创建时间序列预测的综合指南使用Auto Arima构建高性能的时间序列模型,但在进入多元时间序列的细节之前,我先给大家快速回顾一下单变量时间序列。让我们一个一个来看,了解它们之间的区别。

1.1,单变量时间序列

Kydhc,单变量时间序列是具有单个时间相关变量的序列。

例如,看看下面的样本数据集,其中包含过去2年的温度值(每小时)。这里,温度是因变量(取决于时间)。

如果要求我们预测未来几天的温度,我们将查看过去的值,并尝试测量和提取模式。我们会注意到早晚气温较低,下午达到峰值。另外,如果你有过去几年的数据,你会发现11月到1月比较冷,4月到6月比较热。

这些观察将帮助我们预测未来的价值。你有没有注意到我们只用了一个变量(过去2年的温度)?因此,这被称为单变量时间序列分析/预测。

1.2、多变量时间序列

多变量时间序列有多个时间相关变量。每个变量不仅取决于其过去的值,还取决于其他变量。这种依赖性用于预测未来的值。听起来很复杂?我来解释一下。

考虑上面的例子。现在,假设我们的数据集包括出汗百分比、露点(在一定压力下第一滴水滴出现的温度)、风速、云量百分比等。以及过去两年的气温值。在这种情况下,需要考虑许多变量来最佳地预测温度。像这样的序列将属于多变量时间序列的范畴。以下是对此的描述:

既然我们知道了多变量时间序列是什么样子,那么就让我们知道如何使用它来建立预测。

第二,处理多变量时间序列——VAR

在本节中,我将向您介绍多元时间序列预测中最常用的方法之一,即向量自回归(VAR)。

在VAR模型中,每个变量都是其过去值和所有其他变量过去值的线性函数。为了更好地解释这一点,我将使用一个简单的可视化示例:

我们有两个变量,y1和y2。我们需要预测这两个变量在时间t的值,从过去n个值的给定数据开始。为简单起见,我认为滞后值为1。

为了计算y1(t),我们将使用y1和y2的过去值。类似地,为了计算y2(t),将使用y1和y2的过去值。下面是表达这种关系的简单数学方法:

其中a 1和a 2为常数项,W为系数矩阵中的系数,E为误差项。

这些方程类似于ar过程的方程。由于AR过程用于单变量时间序列数据,未来值只是其自身过去值的线性组合。考虑AR(1)过程:

y(t)=a wy(t1)e

在这个例子中,我们只有一个变量Y,一个常数A和一个误差。

差项e和一个系数w。为了适应VAR的每个等式中的多个变量项,我们将使用向量。 我们可以用以下形式写出等式(1)和(2):

上述形式扩展到多维之后:

上述等式中的ϵt表示多变量白噪声。 对于多变量时间序列,ϵt应该是满足以下条件的连续随机向量:

E(εt) = 0,即误差期望为0E(εt1,εt2‘) = σ12,εt和εt‘的期望是时间序列的标准差

三、为什么需要VAR?

回想一下我们之前看到的温度预测的例子。 可以对其进行论证,将其视为多个单变量系列。 我们可以使用像AR这样的简单单变量预测方法来解决它。 由于目标是预测温度,我们可以简单地删除其他变量(温度除外)并在剩余的单变量系列上拟合模型。

另一个简单的想法是使用我们已知的技术单独预测每个系列的值。 这将使工作变得非常简单! 那你为什么要学习另一种预测技术呢? 这个话题不够复杂吗?

从上面的等式(1)和(2)可以清楚地看出,每个变量都使用每个变量的过去值来进行预测。 与AR不同,VAR能够理解和使用几个变量之间的关系。 这对于描述数据的动态行为非常有用,并且还可以提供更好的预测结果。 此外,实现VAR就像使用任何其他单变量技术一样简单(您将在上一节中看到)。

四、多元时间序列的平稳性

我们从研究单变量概念得知,固定时间序列通常会给我们一组更好的预测。 如果您不熟悉平稳性的概念,请首先阅读本文:处理非平稳时间序列的温度介绍

从数学上讲,如果时间序列的数据的均值和方差没有系统变化,且严格消除了周期变化,那么这个时间序列就是平稳的,只有平稳的时间序列数据的预测才是有可能的。非平稳时间序列数据目前在理论上有缺陷,预测很难。

五、Python的实现

预测大气质量,数据来源https://archive.ics.uci.edu/ml/datasets/Air+Quality#:

#import required packages import pandas as pd import matplotlib.pyplot as plt %matplotlib inline #read the data df = pd.read_csv("AirQualityUCI.csv", parse_dates=[['Date', 'Time']]) #check the dtypes df.dtypes

输出结果:

ate_Time object CO(GT) int64 PT08.S1(CO) int64 NMHC(GT) int64 C6H6(GT) int64 PT08.S2(NMHC) int64 NOx(GT) int64 PT08.S3(NOx) int64 NO2(GT) int64 PT08.S4(NO2) int64 PT08.S5(O3) int64 T int64 RH int64 AH int64 dtype: object

Date_Time列的数据类型是object,我们需要将其更改为datetime。 此外,为了准备数据,我们需要索引具有日期时间。 请遵循以下命令:

df['Date_Time'] = pd.to_datetime(df.Date_Time , format = '%d/%m/%Y %H.%M.%S') data = df.drop(['Date_Time'], axis=1) data.index = df.Date_Time

下一步是处理缺失的值。 由于数据中的缺失值被替换为值-200,因此我们必须使用更好的数字来估算缺失值。 考虑一下 - 如果缺少当前的露点值,我们可以安全地假设它将接近前一个小时的值。 有道理,对吗? 在这里,我将用前一个值来估算-200。

您可以选择使用之前几个值的平均值替换该值,或者选择前一天同时的值(您可以在下面的评论部分中分享您对缺失值进行估算的想法)。

#missing value treatment cols = data.columns for j in cols: for i in range(0,len(data)): if data[j][i] == -200: data[j][i] = data[j][i-1] #checking stationarity from statsmodels.tsa.vector_ar.vecm import coint_johansen #since the test works for only 12 variables, I have randomly dropped #in the next iteration, I would drop another and check the eigenvalues johan_test_temp = data.drop([ 'CO(GT)'], axis=1) coint_johansen(johan_test_temp,-1,1).eig

结果:

array([ 0.17806667, 0.1552133 , 0.1274826 , 0.12277888, 0.09554265, 0.08383711, 0.07246919, 0.06337852, 0.04051374, 0.02652395, 0.01467492, 0.00051835])

我们现在可以继续创建验证集以适应模型,并测试模型的性能:

#creating the train and validation set train = data[:int(0.8*(len(data)))] valid = data[int(0.8*(len(data))):] #fit the model from statsmodels.tsa.vector_ar.var_model import VAR model = VAR(endog=train) model_fit = model.fit() # make prediction on validation prediction = model_fit.forecast(model_fit.y, steps=len(valid))

预测采用数组的形式,其中每个列表代表行的预测。 我们将把它转换成更易于呈现的格式。

#converting predictions to dataframe pred = pd.DataFrame(index=range(0,len(prediction)),columns=[cols]) for j in range(0,13): for i in range(0, len(prediction)): pred.iloc[i][j] = prediction[i][j] #check rmse for i in cols: print('rmse value for', i, 'is : ', sqrt(mean_squared_error(pred[i], valid[i])))

输出:

rmse value for CO(GT) is : 1.4200393103392812 rmse value for PT08.S1(CO) is : 303.3909208229375 rmse value for NMHC(GT) is : 204.0662895081472 rmse value for C6H6(GT) is : 28.153391799471244 rmse value for PT08.S2(NMHC) is : 6.538063846286176 rmse value for NOx(GT) is : 265.04913993413805 rmse value for PT08.S3(NOx) is : 250.7673347152554 rmse value for NO2(GT) is : 238.92642219826683 rmse value for PT08.S4(NO2) is : 247.50612831072633 rmse value for PT08.S5(O3) is : 392.3129907890131 rmse value for T is : 383.1344361254454 rmse value for RH is : 506.5847387424092 rmse value for AH is : 8.139735443605728

预测代码:

#make final predictions model = VAR(endog=data) model_fit = model.fit() yhat = model_fit.forecast(model_fit.y, steps=1) print(yhat)快三最准高手教学te_Time

下一步是处理缺失的值。 由于数据中的缺失值被替换为值-200,因此我们必须使用更好的数字来估算缺失值。 考虑一下 - 如果缺少当前的露点值,我们可以安全地假设它将接近前一个小时的值。 有道理,对吗? 在这里,我将用前一个值来估算-200。

您可以选择使用之前几个值的平均值替换该值,或者选择前一天同时的值(您可以在下面的评论部分中分享您对缺失值进行估算的想法)。

#missing value treatment cols = data.columns for j in cols: for i in range(0,len(data)): if data[j][i] == -200: data[j][i] = data[j][i-1] #checking stationarity from statsmodels.tsa.vector_ar.vecm import coint_johansen #since the test works for only 12 variables, I have randomly dropped #in the next iteration, I would drop another and check the eigenvalues johan_test_temp = data.drop([ 'CO(GT)'], axis=1) coint_johansen(johan_test_temp,-1,1).eig

结果:

array([ 0.17806667, 0.1552133 , 0.1274826 , 0.12277888, 0.09554265, 0.08383711, 0.07246919, 0.06337852, 0.04051374, 0.02652395, 0.01467492, 0.00051835])

我们现在可以继续创建验证集以适应模型,并测试模型的性能:

#creating the train and validation set train = data[:int(0.8*(len(data)))] valid = data[int(0.8*(len(data))):] #fit the model from statsmodels.tsa.vector_ar.var_model import VAR model = VAR(endog=train) model_fit = model.fit() # make prediction on validation prediction = model_fit.forecast(model_fit.y, steps=len(valid))

预测采用数组的形式,其中每个列表代表行的预测。 我们将把它转换成更易于呈现的格式。

#converting predictions to dataframe pred = pd.DataFrame(index=range(0,len(prediction)),columns=[cols]) for j in range(0,13): for i in range(0, len(prediction)): pred.iloc[i][j] = prediction[i][j] #check rmse for i in cols: print('rmse value for', i, 'is : ', sqrt(mean_squared_error(pred[i], valid[i])))

输出:

rmse value for CO(GT) is : 1.4200393103392812 rmse value for PT08.S1(CO) is : 303.3909208229375 rmse value for NMHC(GT) is : 204.0662895081472 rmse value for C6H6(GT) is : 28.153391799471244 rmse value for PT08.S2(NMHC) is : 6.538063846286176 rmse value for NOx(GT) is : 265.04913993413805 rmse value for PT08.S3(NOx) is : 250.7673347152554 rmse value for NO2(GT) is : 238.92642219826683 rmse value for PT08.S4(NO2) is : 247.50612831072633 rmse value for PT08.S5(O3) is : 392.3129907890131 rmse value for T is : 383.1344361254454 rmse value for RH is : 506.5847387424092 rmse value for AH is : 8.139735443605728

预测代码:

#make final predictions model = VAR(endog=data) model_fit = model.fit() yhat = model_fit.forecast(model_fit.y, steps=1) print(yhat)
vue-property-decorator怎么使用付费方式等。[对象对象])雷士灯具管理系统uniapp微信小程序怎么自定义导航栏
photoshop高手之路全篇(python高手之路) 解耦实例分析(有哪些内聚)
相关内容