时序预测模型的基准算法1-auto_arima

1 篇文章 0 订阅
1 篇文章 0 订阅

最近我在进行论文的写作,接下来会将自己做的对比算法分享给大家,以帮助像我一样遇到问题想来CSDN上求救的小伙伴们。我采用的数据集为PeMS04和PeMS08,如果有使用相同数据集的小伙伴们可以一起交流。
做到ARIMA对比算法时,发现固定order的ARIMA算法无法做到对所有全时空路网节点的流量进行预测,会出现报错情况。因为路网所有节点的交通流量不一定都符合同一ARIMA参数,便采用auto_arima算法对所有节点的交通流量进行预测。

相关库的引入

import numpy as np
import pandas as pd
from pmdarima.arima import auto_arima # 引入auto_arima算法模型,需要安装一下pmdarima库
from sklearn.preprocessing import MinMaxScaler # 运用MinMax方法对数据进行归一化模块  

评价指标

时序预测模型的评价指标通常均采用MAE、MAPE和RMSE三者。相对应的计算方法如下:

def MAE(pred, true):
	return np.mean(np.absolute(pred-true))

def MAPE(pred, true):
	return np.mean(np.absolute(np.divide((true - pred), true)))

def RMSE(pred, true):
	return np.sqrt(np.mean(np.square(pred-true)))

数据加载与预处理

我们采用加利福尼亚州高速公路的数据集PeMS04来进行演示。首先对交通数据集进行读取data = np.load(r'PeMS04.npz')
接下来对数据集进行处理:

1、数据集中包含三个部分:1)交通流量;2)交通占比;3)交通速度。我们使用交通流量进行时序预测。
flow_data = data['data'].transpose([1, 0, 2])[:, :, 0][:, :, np.newaxis] # np.newaxis的作用为增加数据的维度
true = []
predict = [] # 定义存储真实值和预测值的列表
node_num = len(flow_data[:,0,0]) # 路网节点的个数
for node in range(node_num):
	node_data = flow_data[node, 13536:16992, :] # 单个节点流量的读取以及小数据集的选取,数据集的大小应与自己算法的测试集的大小一致
	node_data = pd.DataFrame(node_data) # 将numpy数据类型转变为pandas
	node_data.columns = list('Y')
	# 归一化
	scaler = MinMaxScaler()
	node_data['Y'] = scaler.fit_transform(node_data)

	# 设置预测时间长度和历史长度
	history_len = 24
	predict_len = 1 # 短时交通流预测,长时的话可以更改为需要的时间长度
	history = node_data['Y']

构建auto_arima预测模型

	for t in range(node_data['Y'].shape[0]-history_len-predict_len+1):
    	inputs = history[t:history_len+t]
        model = auto_arima(inputs, start_p=1, start_q=1,
                           test='adf',
                           max_p=3, max_q=3, m=12,
                           seasonal=True,
                           d=None,trace=False,
                           error_action='ignore',
                           suppress_warnings=True) # 第一步:模型的构建
        model.fit(inputs) # 第二步:运用fit命令去拟合模型
        y_hat = model.predict(1) # 第三步:进行预测,这个1为单步预测,可以将其设置为>1的整数,进行多步预测    

auto_arima模型中的参数我在这里进行简要说明,详细内容大家可以查询CSDN上大佬们的详细解读。auto_arima模型的好处便是不需要选择固定的p,d和q的参数组合,模型会根据自己设定的p,d,q的取值范围自己设置参数组合,并依据模型生成的AIC值和BIC值来对参数组合的最终选择进行确定,最终运用筛选出来的参数组合进行预测。

  1. inputs:为历史时间长度的输入值,通过这些数值对下一个或多个时刻的交通流量值进行预测;
  2. start_p:为ARIMA中p的起始值,自回归(“AR”)模型的阶数(或滞后时间的数量),必须是正整数;
  3. start_q:为ARIMA中q的初始值,移动平均(MA)模型的阶数。必须是正整数;
  4. max_p:为ARIMA中p的最大值必须大于或等于初始值,且为整数;
  5. max_q:为ARIMA中q的最大值必须大于或等于初始值,且为整数;
  6. max_d:为ARIMA模型中d的最大值,即非季节差异的最大数量。必须是大于或等于d的正整数;
  7. Seasonal:是否适合季节性ARIMA。默认是True。注意,如果Seasonal为True,而m = 1,则Seasonal将设置为False;
  8. m:m为周期个数;
  9. d:时间序列是否平稳,若为None则为不平稳;
  10. test:用来检测平稳性的单位根检验的类型,默认为’kpss’;可设置为’adf’;
  11. trace:是否打印适合的状态。如果值为False,则不会打印任何调试信息。值为真会打印一些(没必要打印过程所以我设置了False);
  12. error_action:如果出于种种原因无法匹配ARIMA,可以控制其错误处理行为,一般选为(‘ignore’);
  13. suppress_warnings:如果为True,则来自ARIMA中所有的警告都会被压制。

数据存储

对预测值与真实进行收集:

#预测值反归一化以及预测值存储
		y_hat = scaler.inverse_transform(y_hat[:, np.newaxis]) # 反归一化
		predict.append(y_hat) # 数据存储
#真实值反归一化以及真实值存储
		a = np.array(history[history_len+t:history_len+t+predict_len])
        a = scaler.inverse_transform(a[:, np.newaxis])
        true.append(a)

预测效果评价

为了评价模型的预测效果,我用开始设定的评价指标对其进行评价。

prediction = np.array(predict)
truth = np.array(true)
prediction = prediction[:, np.newaxis]
truth = truth[:, np.newaxis]
ARIMA_mape = MAPE_np(prediction, truth)
ARIMA_mae = MAE_np(prediction, truth)
ARIMA_rmse = RMSE_np(prediction, truth)

总结

我们使用auto_arima模型时,避免了一个参数无法适应所有道路的情况,可以用一个算法跑完所有的节点。但相对来说,时间消耗非常巨大,大家做对比实验时需要有耐心。

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值