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

原文链接:

从名称就能知道, 时间序列数据属于一种会随时间产生变化的数据形式, 举例来说, 24小时之内出现的温度情况, 一个月里各类产品的价格状况, 一年之中特定公司的股票价格情形。像长期短期记忆网络也就是LSTM这种高级的深度学习模型, 能够捕捉时间序列数据当中的模式, 所以能够用以对数据未来的趋势做预测。在此文章里, 您会看到怎样运用LSTM算法借助时间序列数据来进行将来的预测。

数据集和问题定义

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

torch, 将torch.nn命名为nn, 把sns当作, 将numpy命名为np, 把. 当作, 把plt当作%。

让我们打印 所有数据集的列表:

sns.()

输出:

空洞, 空洞, 空洞, 空洞, 空洞, 圆点, 空洞, 空洞, 功能磁共振成像, 空洞, 虹膜, 每加仑英里数, 空洞, 小费, 空洞。

让我们将数据集加载到我们的应用程序中

= sns.("") .head()

输出:

存在这样一个数据集, 它一共有三列, 分别是year, month, 以及某一列, 这其中的某一列所涵盖的是在指定月份进行旅行的旅客的总数目。针对于此, 我们来绘制该数据集的形状:

.shape

输出:

(144, 3)

能够看到, 数据集中存在144行, 有3列, 这表明, 数据集涵盖着12年的, 乘客旅行记录。

我们的任务是, 依据前一百三十二个月的数据, 去预测最近十二个月内出行的乘客数量。要记住, 我们手头有一百四十四个月的记录, 这表明, 前一百三十二个月的数据会被用来训练我们名为LSTM的模型, 同时模型的性能将借助最近十二个月的值作出评估。

让我们绘制每月乘客的出行频率。

接下来的脚本绘制了每月乘客人数的频率:

输出:

依据输出所呈现的情况来看, 在过去的多年时间里边, 乘坐飞机出行进行旅行的平均乘客人数是存在着提升迹象的。在一年的这么一个时间段之内, 旅行乘客的数量呈现出波动变化, 这其实是具备一定合理性和逻辑性的, 原因在于当处于暑假或者寒假这样特定的时间段的时候, 旅行的乘客数量同一年之中的其他时间段相比较而言, 是有着明显增加态势的。

数据预处理

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

输出:

Index(

'year', 'month', ''

, dtype='')

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

=

''

..(float)

现在,如果 打印数组,则应该看到以下浮动类型值:

print()

输出:

紧接着, 我们会划分数据集成为训练集以及测试集, LSTM 算法于此训练集之上开展训练, 随后会运用此模型针对测试集予以预测, 把预测的结果跟测试集中的实际数值进行对比, 以此来评估训练之后模型的性能。

将用于训练模型的是前面的一百三十二条记录, 用作测试集的是后面的十二条记录。以下脚本会把数据划分成训练集以及测试集。

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

输出:

132 12

一旦此刻输出测试数据, 您就会瞧见它涵盖数组里头最后的12条记录: 句号应为冒号但按要求未修改标点习惯。

print()

输出:

  1. 391, 419, 461, 472, 535, 622号, 606, 再到508, 又有461, 390, 最后是432。

我们当下的数据集, 此刻还没有被规范化, 最初那几年的乘客总体数量, 远远比后来那些年的乘客总体数量要少, 把数据进行标准化, 从而去开展时间序列预测, 这相当重要, 要在处于一定范围之内的最小值以及最大值之间, 对数据实施规范化, 我们会借助模块里的类, 来将数据予以扩展。

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

输出:

-0.

-0.

-0.

-0.

-0.

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

于此关键的是得提及、数据标准化仅仅是应用于训练数据、而不能应用于测试数据。要是对测试数据开展归一化处理、那某些信息就兴许会从训练集中、跑到测试集中。

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

什么序列长度您都能够去使用, 这是由领域知识所决定依赖的状况。然而这是在我们的数据集合之中, 采用12这样的序列长度是具备便利条件的, 因为我们是存在月度数据的原因, 一年里面一共有着12个月份的缘故如果把每日数据具备的情形考虑进来, 那么更优的序列长度应当是365, 确切来说就是一年存在的天数数量。所以是, 我们特意将会要训练的输入序列长度设定成为了12。

接下来, 我们要定义一个函数, 名为es。这个函数会接受原始输入数据, 之后它会返回一个元组列表。其中, 在每个元组里, 第一个元素是一个包含12个项目的列表, 这12个项目对应着12个月内旅行的乘客数量, 第二个元组元素是一个项目, 也就是在12 + 1个月内的乘客数量。

执行以下脚本以创建序列和相应的标签进行训练:

要是去打印列表的长度, 您会瞧见它含有120个项目。这是由于虽说训练集有132个元素, 但序列长度是12, 这表明头一个序列是由前面12个项目构成的, 第13个项目是头一个序列的标签。同样地, 第二个序列从第二个项目起始, 到第13个项目截止, 而第14个项目是第二个序列的标签, 如此这般类推下去。

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

输出:

((

负零点九六四八, 负零点九三八五, 负零点八七六九, 负零点八九零一, 负零点九二五三, 负零点八六三七, 负零点八零六六, 负零点八零六六, 负零点八五九三, 负零点九三四一, 负一, 负零点九三八五。

), ()), ((

负零点九三八五, 负零点八七六九, 负零点八九零一, 负零点九二五三, 负零点八六三七, 负零点八零六六, 又为负零点八零六六, 负零点八五九三, 负零点九三四一, 到负一, 再回到负零点九三八五, 负零点九五幺六。

), ()), ((

减零点八七六九, 减零点八九零一, 减零点九二五三, 减零点八六三七, 减零点八零六六, 减零点八零六六, 减零点八五九三,减零点九三四一, 减一, 减零点九三八五, 减零点九五幺六, 减零点九零三三。

), ()), ((

负零点八九零一, 负零点九二五三, 负零点八六三七, 负零点八零六六, 负零点八零六六, 负零点八五九三, 负零点九三二一, 负一, 负零点九三八五, 负零点九五幺六, 负零点九零三三, 负零点八三七四。

), ()), ((

负零点九二五三, 负零点八六三七, 负零点八零六六, 负零点八零六六, 负零点八五九三, 负零点九三四一, 负一, 负零点九三八五, 负零点九五幺六, 负零点九零三三, 负零点八三七四, 负零点八六三七。

), ())

您将会看见, 每一个项目居然都是一个元组, 其中, 第一个元素是由序列的12个项目给组成的, 而第二个元组元素, 是包含着相应的标签。

创建LSTM模型

针对数据, 我们已然开展了预处理工作, 此刻, 正是要进入训练模型阶段的时候所身处的情境设定。在这一情境下, 我们会着手去定义一个名为LSTM的类, 而这个类是要从nn.库的类那里继承而来的状态表述。

让我对以上代码里所发生的状况进行一下总结, LSTM此类的构造函数有三个参数作为接受对象, 其将会接受这三个参数。

对应着输入里头的要素数量, 虽说我们的序列长度达成了12, 然而每个月我们仅仅有1个值, 也就是乘客的总数, 所以输入的大小是1呢。指定隐藏层个数及其每层中神经元个数, 我们会有一层且这层有100个神经元。输出的项目数量, 可以的是因为咱们要对未来1个月的乘客人数做预测的缘故, 所以输出大小为1。

对于接下来的情况, 在构造函数里面, 我们去创建变量, 名为lstm, 还有叫做LSTM的, 另外还有等等之类的。而LSTM算法呢, 它是要接受三个输入的, 也就是曾用到的先前的隐藏状态, 那个先前存在的单元状态, 以及当下要进入的当前输入。此变量所涵盖的内容, 包含着先前的隐藏状态与单元状态。其中, lstm还有层变量这类事物则是被用来创建LSTM还有线性层的。

处在方法内部时, 会把作为参数进行传递, 此参数会先传递给lstm图层 , lstm层有着输出, 是当前时间步的隐藏状态、单元状态以及输出 ,lstm图层的输出会传递到那个图层, 预计的乘客人数被存储在列表的最后一项里, 且返回到调用函数。

再接下来要做的是去制造出LSTM()此种类别的一种对象, 把损失函数以及优化器给确定下来。究其缘由在于当下我们弄的是分类方面问题。

让我们输出模型:

输出:

训练模型

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

输出:

epoch为1的时候, 损失是0, epoch为26的时候, 损失是0, epoch为51的时候, 损失是0, epoch为76的时候, 损失是0, epoch为101的时候, 损失是0, epoch为126的时候, 损失是0, epoch为149的时候, 损失是0。

由于权重在神经网络里是于默认情形下随机开展初始化的, 这个缘故, 您有可能会获取不一样的值。

做出预测

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

输出:

0.零点, 零点, 零点二八三五六, 零点三八九九六, 零点六二八一七, 零点九五三四五,一, 零点五七二八, 零点, 零点, 零点。

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

有一个属于该项目的集合, 其中会存在共计12个分项目, 在for循环的范围之内, 这12个分项目会被应用于针对测试集中首个项目展开预测工作, 这个项目的编号是133, 之后预测得出的值会被附着到列表里面。 当执行进行第二次循环里的操作运算之时, 位于末尾部分的12个上述的同样项目内容会再次被当作输入的数据信息来使用, 进而操作形成全新预测的结果, 之后这个新得到的值又会被添加入列表当中。在for循环的条件运行之中, 鉴于测试集中存在12个数量的元素, 所以这个循环会开展运作12次。在循环运行至结束尾声之处, 最终对应的列表将要囊括24个有着特别意义区分的项目。其中位置排于最后的、数量为12个的项目将会呈现为测试集项目预测之后所显现出来的数据值。

以下脚本用于进行预测:

要是输出列表的长短程度, 您会发觉它含有24个项目。能够依照以下办法去打印往后的12个预测出来的项目:

输出:

0.以下这些数字分别是, 0.98659, 1.2794, 1.62964, 1.58335, 1., 1.3235, 1.87642, 2.58936, 1.77456, 1., 1.。

得再次说一下, 鉴于那用于训练LSTM的权重, 您有可能得到不一样的值。

由于, 我们针对训练数据集开展了标准化操作, 故而, 预测值同样进行了标准化处理, 且, 我们需要把归一化后的预测值转变为实际的预测值。

= .(np.array(

:

).(-1, 1)) print()

输出:

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

x = np.(132, 144, 1) print(x)

输出:

那有着这样一串数字, 分别是一百三十二, 一百三十三, 一百三十四, 一百三十五, 一百三十六, 一百三十七, 一百三十八, 一百三十九, 一百四十, 一百四十一, 一百四十二, 一百四十三。

于上述脚本之内, 我们构建一项列表, 此列表收纳有最近十二个月的数值, 第一个月的索引数值设定为零, 所以末尾那个月的索引数值便是一百四十三啦。

在紧接着下面的那个脚本里头, 我们会展开动作去绘制出, 有着144个月时长的乘客总数情况图, 以及最近12个月时间范围跨度内的预计乘客数量情况统计图。

''

) plt.plot(x,) plt.show()

输出:

所用橙色线予以表示的, 是我们LSTM所做的预测。不太准确的是我们的算法 , 当然它依旧 , 能够捕获最近12个月 , 内旅行的乘客总数的上升趋势 , 以及偶尔出现的波动。您能够尝试 , 在LSTM层当中运用更多的时期 , 以及更多的神经元 , 以此查看是否能够获取更好的性能。

为了能够更妥善地去查看输出状况, 我们能够绘制最近十二个月的实际以及预测得出的乘客数量, 情况如下所呈现:

plt.title('Month vs ') plt.('Total ') plt.grid(True) plt.(axis='x', tight=True) plt.plot(

''

-:

) plt.plot(x,) plt.show()

输出:

对于未来几个月乘客数量的预测, 并非精准无误, 然而此算法具备捕捉趋势的能力, 也就是未来几个月的乘客数量呈现出会高于前几个月的态势, 并且其间偶尔会出现波动情况。

结论

长短时记忆网络是解决序列问题时最广泛被使用的算法当中的一个。在这篇文章里, 我们看到过怎样借助长短时记忆网络利用时间序列数据来针对未来进行预测。

相关推荐
论文复现现场1 小时前
单卡RTX 3090能训练,切到4卡却OOM:Accelerate多卡训练怎么排查?
人工智能·pytorch·云计算·gpu算力·多卡训练
Axis tech2 小时前
基于Ego-Pi框架与Manus手套的仿人机器人灵巧操作研究
人工智能·机器学习·机器人
Ivanqhz3 小时前
图是“拓扑 + 类型 + 形状“的世界
算法·决策树·机器学习·php·集成学习
小白说大模型3 小时前
去AI味提示词大全:25个实用Prompt帮你降低AI率
大数据·人工智能·pytorch·深度学习·机器学习·prompt
Hali_Botebie4 小时前
PyTorch 内存布局,.view()要合并哪两个维度(比如 B 和 G),这两个维度在内存里就必须“紧挨着”。
人工智能·pytorch·python
欧特克_Glodon4 小时前
OpenCV计算机视觉开发入门与实践<三十六>:机器学习概述
c++·opencv·机器学习·计算机视觉
泛联新安4 小时前
FPGA仿真加速:AccEmu正式亮相,一周的回归,一天跑完
机器学习·fpga开发·数据挖掘·回归·自动化·嵌入式软件·代码漏洞扫描
统计学小王子4 小时前
数学建模国赛倒计时 1 天 ——《机器学习精讲(决策树R语言实战篇)》
决策树·机器学习·数学建模
西瓜拿铁好喝8 小时前
2026 语义缓存实战:把命中契约写进SPEC,MonkeyCode 云端跑通
人工智能·机器学习·缓存