首页 > 编程语言 >在Python中使用LSTM和PyTorch进行时间序列预测|附代码数据

在Python中使用LSTM和PyTorch进行时间序列预测|附代码数据

时间:2024-06-12 17:10:23浏览次数:27  
标签:12 预测 Python 神经网络 PyTorch 序列 LSTM 数据

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

最近我们被客户要求撰写关于LSTM的研究报告,包括一些图形和统计输出。 顾名思义,时间序列数据是一种随时间变化的数据类型。例如,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神经网络分类

标签:12,预测,Python,神经网络,PyTorch,序列,LSTM,数据
From: https://www.cnblogs.com/tecdat/p/18244315

相关文章

  • PYTHON学习过程中的一些有用tips.
    开头语大家好,我是小安同学,我是大一开始学习python,面对这一门陌生的语言中间有许多的弯路,希望可以对大家的学习有所帮助。目前Python可以说是非常流行,在目前的编程语言中,Python的抽象程度是最高的,是最接近自然语言的,很容易上手。你可以用它来完成很多任务,比如数据科学、机器学......
  • python-数据分析-Matplotlib-1-进阶图形(气泡图-面积图-雷达图-玫瑰图-3D图)
    气泡图#-*-coding:utf-8-*-#气泡图#气泡图可以用来了解三个变量之间的关系,通过比较气泡位置和大小来分析数据维度之间的相关性。#例如在我们之前绘制的月收入和网购支出的散点图中,我们已经发现了二者的正相关关系,如果我们引入第三个变量网购次数,那么我们就需要使用气泡图......
  • python 代码说明 RAS基本原理
    importgmpy2q=7p=11e=13m=71if__name__=='__main__':print('step0公钥和私钥')print('公钥(n,e)')print('私钥(n,d)')#step1n=p*qprint(f'\nstep1最大公约数')......
  • SSM-小区物业管理系统-48954(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP、爬虫、
    基于SSM小区物业管理系统摘要随着计算机科学技术日渐成熟,人们已经深刻认识到了计算机功能的强大,计算机已经进入到了人类社会发展的各个领域,并且发挥着十分重要的作用。每个社区的物业管理是一项系统而复杂的工作,它需要一个团队互相配合、分工协作。在该领域,传统的手工存取......
  • pythonocc基础:OCC.Core.TopAbs 类简介
    在PythonOCC库中,OCC.Core.TopAbs模块定义了一系列枚举类型,这些枚举类型代表了拓扑形状的不同类别(Topology)。这些类别是构建和操作三维几何模型的基础,特别是在处理布尔运算、几何约束、参数化设计等复杂任务时。TopAbs类提供了统一的接口来识别和区分不同的拓扑元素,是OpenCASCAD......
  • python-数据分析-Matplotlib-1-基础图形(曲线图-散点-柱状-堆叠柱状-饼状图-直方图)
    曲线图#-*-coding:utf-8-*-#基础、曲线图importnumpyimportmatplotlib.pyplotasplt#设置字体SimHei:黑体#需要注意的是,使用中文字体后坐标轴上的负号将会无法显示,需要将`axes.unicode_minus`参数设置为`False`,这样才能让坐标轴上的负号正常显示plt.rcParams['f......
  • python-数字反转 ll
    [问题描述]:现在给出一个正整数n,请将n倒序输出(末尾是0也输出)输入:一行一个正整数n输出:一行一个正整数,表示数字n倒过来输出的结果样例输入112345678910111213样例输出131211101987654321提示1<=n<=10^5000来源/分类(难度系数:一星) 完整代码如下:a=list(input())a......
  • python - pip安装三方库超时、安装慢解决办法
    前言:WARNING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))afterconnectionbrokenby'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org',port=443):今天在一台新的电脑上时候pip下载requests库,报错这个链接超时的错误。我们直......
  • pytorch--Matrix相关
    pytorch–Matrix相关1.矩阵生成Tensor,即张量,是PyTorch中的基本操作对象,可以看做是包含单一数据类型元素的多维矩阵。从使用角度来看,Tensor与NumPy的ndarrays非常类似,相互之间也可以自由转换,只不过Tensor还支持GPU的加速。1.1创建一个没有初始化的矩阵x=torch.empty(2,......
  • Python 详述 Python 中的 property 语法
    在大多数语言的程序中,一个类,每有一个属性,就会对应setter和getter,基本都是标配。示例:classMoney(object):def__init__(self):self.__money=0defgetMoney(self):returnself.__moneydefsetMoney(self,value):ifisinsta......