全文链接:http://tecdat.cn/?p=8145

顾名思义,时间序列数据是一种随时间变化的数据类型。例如,24小时内的温度,一个月内各种产品的价格,一年中特定公司的股票价格点击文末“阅读原文”获取完整代码数据)。

诸如长期短期记忆网络(LSTM)之类的高级深度学习模型能够捕获时间序列数据中的模式,因此可用于对数据的未来趋势进行预测。在本文中,您将看到如何使用LSTM算法使用时间序列数据进行将来的预测。

相关视频

数据集和问题定义

让我们先导入所需的库,然后再导入数据集:

import matplotlib.pyplot as plt
让我们将数据集加载到我们的程序中
data.head()

输出:

该数据集有三列:yearmonth,和passengerspassengers列包含指定月份旅行旅客的总数。让我们输出数据集的维度:

data.shape

输出:

(144, 3)

您可以看到数据集中有144行和3列,这意味着数据集包含12年的乘客旅行记录。

任务是根据前132个月来预测最近12个月内旅行的乘客人数。请记住,我们有144个月的记录,这意味着前132个月的数据将用于训练我们的LSTM模型,而模型性能将使用最近12个月的值进行评估。

让我们绘制每月乘客的出行频率。  接下来的脚本绘制了每月乘客人数的频率:

plt.grid(True)
plt.autoscale(axis='x',tight=True)
plt.plot(data['passengers'])

输出:

输出显示,多年来,乘飞机旅行的平均乘客人数有所增加。一年内旅行的乘客数量波动,这是有道理的,因为在暑假或寒假期间,旅行的乘客数量与一年中的其他部分相比有所增加。

数据预处理

数据集中的列类型为object,如以下代码所示:

data.columns

输出:

Index(['year', 'month', 'passengers'], dtype='object')

第一步是将passengers列的类型更改为float

all_data = data['passengers'].values.astype(float)

现在,如果 输出all_datanumpy数组,则应该看到以下浮点类型值:

print(all_data)

前132条记录将用于训练模型,后12条记录将用作测试集。以下脚本将数据分为训练集和测试集。

test_data_size = 12
train_data = all_data[:-test_data_size]
test_data = all_data[-test_data_size:]

现在让我们输出测试和训练集的长度:

输出:

132
12

如果现在输出测试数据,您将看到它包含all_datanumpy数组中的最后12条记录:输出:

[417. 391.... 390. 432.]

我们的数据集目前尚未归一化。最初几年的乘客总数远少于后来几年的乘客总数。标准化数据以进行时间序列预测非常重要。以在一定范围内的最小值和最大值之间对数据进行归一化。我们将使用模块中的MinMaxScalersklearn.preprocessing来扩展数据。

以下代码 将最大值和最小值分别为-1和1进行归一化。

MinMaxScaler(feature_range=(-1, 1))

输出:

[[-0.96483516]
......[0.33186813][0.13406593][0.32307692]]

您可以看到数据集值现在在-1和1之间。

在此重要的是要提到数据归一化仅应用于训练数据,而不应用于测试数据。如果对测试数据进行归一化处理,则某些信息可能会从训练集中 到测试集中。

最后的预处理步骤是将我们的训练数据转换为序列和相应的标签。

您可以使用任何序列长度,这取决于领域知识。但是,在我们的数据集中,使用12的序列长度很方便,因为我们有月度数据,一年中有12个月。如果我们有每日数据,则更好的序列长度应该是365,即一年中的天数。因此,我们将训练的输入序列长度设置为12。

接下来,我们将定义一个名为的函数create_inout_sequences。该函数将接受原始输入数据,并将返回一个元组列表。在每个元组中,第一个元素将包含与12个月内旅行的乘客数量相对应的12个项目的列表,第二个元组元素将包含一个项目,即在12 + 1个月内的乘客数量。

如果输出train_inout_seq列表的长度,您将看到它包含120个项目。这是因为尽管训练集包含132个元素,但是序列长度为12,这意味着第一个序列由前12个项目组成,第13个项目是第一个序列的标签。同样,第二个序列从第二个项目开始,到第13个项目结束,而第14个项目是第二个序列的标签,依此类推。

现在让我们输出train_inout_seq列表的前5个项目:

输出:

[(tensor([-0.9648, -0.9385, -0.8769, -0.8901, -0.9253, -0.8637, -0.8066, -0.8066,          -0.8593, -0.9341, -1.0000, -0.9385]), tensor([-0.9516])),(tensor([-0.9385, -0.8769, -0.8901, -0.9253, -0.8637, -0.8066, -0.8066, -0.8593,-0.9341, -1.0000, -0.9385, -0.9516]),tensor([-0.9033])),(tensor([-0.8769, -0.8901, -0.9253, -0.8637, -0.8066, -0.8066, -0.8593, -0.9341,-1.0000, -0.9385, -0.9516, -0.9033]), tensor([-0.8374])),(tensor([-0.8901, -0.9253, -0.8637, -0.8066, -0.8066, -0.8593, -0.9341, -1.0000,-0.9385, -0.9516, -0.9033, -0.8374]), tensor([-0.8637])),(tensor([-0.9253, -0.8637, -0.8066, -0.8066, -0.8593, -0.9341, -1.0000, -0.9385,-0.9516, -0.9033, -0.8374, -0.8637]), tensor([-0.9077]))]

您会看到每个项目都是一个元组,其中第一个元素由序列的12个项目组成,第二个元组元素包含相应的标签。

创建LSTM模型

我们已经对数据进行了预处理,现在是时候训练我们的模型了。我们将定义一个类LSTM,该类继承自nn.ModulePyTorch库的类。

让我总结一下以上代码。LSTM该类的构造函数接受三个参数:

  1. input_size:对应于输入中的要素数量。尽管我们的序列长度为12,但每个月我们只有1个值,即乘客总数,因此输入大小为1。

  2. hidden_layer_size:指定隐藏层的数量以及每层中神经元的数量。我们将有一层100个神经元。

  3. output_size:输出中的项目数,由于我们要预测未来1个月的乘客人数,因此输出大小为1。

接下来,在构造函数中,我们创建变量hidden_layer_sizelstmlinear,和hidden_cell。LSTM算法接受三个输入:先前的隐藏状态,先前的单元状态和当前输入。该hidden_cell变量包含先前的隐藏状态和单元状态。lstmlinear层变量用于创建LSTM和线性层。

forward方法内部,将input_seq作为参数传递,该参数首先传递给lstm图层。lstm层的输出是当前时间步的隐藏状态和单元状态,以及输出。lstm图层的输出将传递到该linear图层。预计的乘客人数存储在predictions列表的最后一项中,并返回到调用函数。下一步是创建LSTM()类的对象,定义损失函数和优化器。由于我们在解决分类问题,

class LSTM(nn.Module):def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):super().__init__()self.hidden_layer_size = hidden_layer_size

让我们输出模型:

输出:

LSTM((lstm): LSTM(1, 100)(linear): Linear(in_features=100, out_features=1, bias=True)
)

训练模型

我们将训练模型150个步长。

epochs = 150
for i in range(epochs):for seq, labels in train_inout_seq:optimizer.zero_grad()

输出:

epoch:   1 loss: 0.00517058
epoch:  26 loss: 0.00390285
epoch:  51 loss: 0.00473305
epoch:  76 loss: 0.00187001
epoch: 101 loss: 0.00000075
epoch: 126 loss: 0.00608046
epoch: 149 loss: 0.0004329932

由于默认情况下权重是在PyTorch神经网络中随机初始化的,因此您可能会获得不同的值。

做出预测

现在我们的模型已经训练完毕,我们可以开始进行预测了。

您可以将上述值与train_data_normalized数据列表的最后12个值进行比较。

test_inputs项目将包含12个项目。在for循环内,这12个项目将用于对测试集中的第一个项目进行预测,即编号133。然后将预测值附加到test_inputs列表中。在第二次迭代中,最后12个项目将再次用作输入,并将进行新的预测,然后将其test_inputs再次添加到列表中。for由于测试集中有12个元素,因此该循环将执行12次。在循环末尾,test_inputs列表将包含24个项目。最后12个项目将是测试集的预测值。以下脚本用于进行预测:

model.eval()
for i in range(fut_pred):seq = torch.FloatTensor(test_inputs[-train_window:])

如果输出test_inputs列表的长度,您将看到它包含24个项目。可以按以下方式输出最后12个预测项目:

需要再次提及的是,根据用于训练LSTM的权重,您可能会获得不同的值。

由于我们对训练数据集进行了归一化,因此预测值也进行了归一化。我们需要将归一化的预测值转换为实际的预测值。

print(actual_predictions)

现在让我们针对实际值绘制预测值。看下面的代码:

print(x)

在上面的脚本中,我们创建一个列表,其中包含最近12个月的数值。第一个月的索引值为0,因此最后一个月的索引值为143。

在下面的脚本中,我们将绘制144个月的乘客总数以及最近12个月的预计乘客数量。

plt.autoscale(axis='x', tight=True)
plt.plot(flight_data['passengers'])
plt.plot(x,actual_predictions)
plt.show()

输出:

我们的LSTM所做的预测用橙色线表示。您可以看到我们的算法不太准确,但是它仍然能够捕获最近12个月内旅行的乘客总数的上升趋势以及波动。您可以尝试在LSTM层中使用更多的时期和更多的神经元,以查看是否可以获得更好的性能。

为了更好地查看输出,我们可以绘制最近12个月的实际和预测乘客数量,如下所示:

plt.plot(flight_data['passengers'][-train_window:])
plt.plot(x,actual_predictions)
plt.show()

输出:

预测不是很准确,但是该算法能够捕获趋势,即未来几个月的乘客数量应高于前几个月,且偶尔会有波动。

结论

LSTM是解决序列问题最广泛使用的算法之一。在本文中,我们看到了如何通过LSTM使用时间序列数据进行未来的预测。



点击文末“阅读原文”

获取全文完整代码数据资料。

本文选自《在Python中使用LSTM和PyTorch进行时间序列预测》。

点击标题查阅往期内容

PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子

Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析

Matlab用深度学习长短期记忆(LSTM)神经网络对文本数据进行分类

RNN循环神经网络 、LSTM长短期记忆网络实现时间序列长期利率预测

结合新冠疫情COVID-19股票价格预测:ARIMA,KNN和神经网络时间序列分析

深度学习:Keras使用神经网络进行简单文本分类分析新闻组数据

用PyTorch机器学习神经网络分类预测银行客户流失模型

PYTHON用LSTM长短期记忆神经网络的参数优化方法预测时间序列洗发水销售数据

Python用Keras神经网络序列模型回归拟合预测、准确度检查和结果可视化

Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析

R语言中的神经网络预测时间序列:多层感知器(MLP)和极限学习机(ELM)数据分析报告

R语言深度学习:用keras神经网络回归模型预测时间序列数据

Matlab用深度学习长短期记忆(LSTM)神经网络对文本数据进行分类

R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)

MATLAB中用BP神经网络预测人体脂肪百分比数据

Python中用PyTorch机器学习神经网络分类预测银行客户流失模型

R语言实现CNN(卷积神经网络)模型进行回归数据分析

SAS使用鸢尾花(iris)数据集训练人工神经网络(ANN)模型

【视频】R语言实现CNN(卷积神经网络)模型进行回归数据分析

Python使用神经网络进行简单文本分类

R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线分析

R语言基于递归神经网络RNN的温度时间序列预测

R语言神经网络模型预测车辆数量时间序列

R语言中的BP神经网络模型分析学生成绩

matlab使用长短期记忆(LSTM)神经网络对序列数据进行分类

R语言实现拟合神经网络预测和结果可视化

用R语言实现神经网络预测股票实例

使用PYTHON中KERAS的LSTM递归神经网络进行时间序列预测

python用于NLP的seq2seq模型实例:用Keras实现神经网络机器翻译

用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类

在Python中使用LSTM和PyTorch进行时间序列预测相关推荐

  1. Python中利用LSTM模型进行时间序列预测分析

    时间序列模型 时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征.这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺 ...

  2. 时序预测 | MATLAB实现基于Adam算法优化LSTM长短期记忆神经网络时间序列预测

    时序预测 | MATLAB实现基于Adam算法优化LSTM长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现基于Adam算法优化LSTM长短期记忆神经网络时间序列预测 效果一览 基本 ...

  3. 时序预测 | MATLAB实现LSTM长短期记忆神经网络时间序列预测

    目录 时序预测 | MATLAB实现LSTM长短期记忆神经网络时间序列预测 预测效果 程序设计 案例1 案例2 参考资料 时序预测 | MATLAB实现LSTM长短期记忆神经网络时间序列预测 预测效果 ...

  4. 【深度学习】在PyTorch中使用 LSTM 进行新冠病例预测

    时间序列数据,顾名思义是一种随时间变化的数据.例如,24 小时时间段内的温度,一个月内各种产品的价格,特定公司一年内的股票价格.长短期记忆网络(LSTM)等高级深度学习模型能够捕捉时间序列数据中的模式 ...

  5. python 预测任意天后股票数据_在Python中使用LSTM进行股票市场预测

    本文概述 在本教程中, 你将看到如何使用称为长短期记忆的时间序列模型. LSTM模型功能强大, 特别是通过设计保留了长期记忆, 这一点将在以后看到.你将在本教程中解决以下主题: 了解为什么你需要能够预 ...

  6. python 神经网络预测未来30天数据_使用LSTM循环神经网络的时间序列预测实例:预测未来的货币汇率...

    Statsbot团队发表过一篇关于使用时间序列分析来进行异常检测的文章.文章地址:https://blog.statsbot.co/time-series-anomaly-detection-algo ...

  7. Python中ArcPy实现对大量长时间序列栅格遥感影像批量逐像元求取像素平均值

      本文介绍基于Python中ArcPy模块,对大量长时间序列栅格遥感影像文件的每一个像元进行多时序平均值的求取.   在遥感应用中,我们经常需要对某一景遥感影像中的全部像元的像素值进行平均值求取-- ...

  8. 【深度学习论文翻译】基于LSTM深度神经网络的时间序列预测(Time Series Prediction Using LSTM Deep Neural Networks)

    目录 一.前言 二.摘要 三.什么是LSTM神经元? 四.简单正弦波示例 五. 不那么简单的股票市场 六.多维LSTM预测 七.结论 一.前言 最近需要用到时间序列,在网上也找到了一篇相关的文章及源代 ...

  9. python数据预测模型算法_如何对时间序列预测问题计算基准预测(python)

    例程数据下载 建立基准对于时间序列预测问题是及其重要的. 基准效果会告诉你其他模型在解决你的问题的时候的实际效果有多好. 在这个教程中,你会发现如何制作一个persistence预测,用来对时间序列数 ...

最新文章

  1. 字符串数组-获取两个字符串中最大的相同子串(最大相同子串有且只有一个)
  2. windows10风格 springboot activiti 整合项目框架源码 shiro 安全框架 druid 数据库连接池...
  3. [云炬创业基础笔记]第七张创业资源测试
  4. Codeforces 1284E New Year and Castle Building (计算几何)
  5. ssh中exit命令退出远程服务器_解决Linux关闭终端(关闭SSH等)后运行的程序或者服务自动停止...
  6. Metal之基本简介及常用组件说明
  7. mac下安装mongodb
  8. Function Query(树状数组)
  9. 2019 徐州icpc网络赛 E. XKC's basketball team
  10. 洛谷 P1372 又是毕业季I
  11. 挑战 Oracle 的全球首个 AI 原生数据库 GaussDB,华为将开源
  12. Win7系统做路由器
  13. 牛客网 2018年全国多校算法寒假训练营练习比赛(第五场) 题解
  14. 一篇写给从未编程过的人的入门教程
  15. 分享一些我常用的编程字体
  16. 计算机网络:家庭无线网组建方案
  17. 城市感知体系十大典型应用场景
  18. I帧、P帧、B帧、IDR 关键帧介绍
  19. FusionCharts的使用方法(超详细)
  20. BT种子的技术原理是什么?就是.torrent文件该如何理解?

热门文章

  1. 公共盘突然断开_公司如何设置共享盘
  2. linux下如何压缩文件夹加密,linux下的文件/文件夹压缩加密方法
  3. 豆豆趣事[2014年06月]
  4. 力扣(LeetCode)215. 数组中的第K个最大元素(C语言)
  5. 踏过2019公链生死战场 Vitalik等7位从业者如何复盘
  6. Ubuntu 20.04 打开WPS时间过长解决办法
  7. 【斜率优化】Codechef July Challenge 2019——Hit the Coconuts
  8. python面向对象程序设计的三个特征_哪些是面向对象程序设计的三大特征
  9. 利用HttpURLConnection抓取网页取名
  10. 航班、实时、三维、虚拟现实——《我的航班呢?》