当前位置: 首页 > 网络应用技术

LSTM:使用pytorch在Python中使用LSTM进行时间序列预测

时间:2023-03-06 18:49:33 网络应用技术

  转换为:https://stackabuse.com/time-server-prediction-sing-lstm-pytorch-in-python/

  顾名思义,时间序列数据是一个随时间变化的数据。例如,24个小时的温度数据,一个月得分的产品价格数据,特定公司股价的年度数据。加入深度学习模型,例如长期内存网络(LSTM)可以在时间序列数据中捕获变化模式,然后预测数据的未来趋势。在本文中,您将看到如何使用LSTM算法来预测时间序列数据。

  在我之前的文章中,我展示了如何使用KERAS库并使用LSTM进行时间序列分析来预测未来的股票价格。它将使用Pytorch库,这是最常用的Python库之一。

  在继续之前,假设您有一个中间水平的Python编程语言,并且已经安装了Pytorch库。此外,对基本机器学习概念和深度学习概念的理解也将有所帮助。如果您没有安装Pytorch,则可以安装它具有以下pip命令。

  我们将使用Seaborn Library的构建数据集。首先,让我们导入所需的库,然后倒入数据集:

  让我们打印所有构建的 - 在Seaborn数据库中:

  由于已知的原因,您可以在GitHub上下载整个数据包。

  我们将使用航班数据集。如果没有网络问题,则可以使用以下代码导入:

  数据集有3列:年度,每月和乘客。乘客人数描述了一个月内的乘客总数。数据集的形状:

  可以看出,有144行和3列数据集,数据集包含12年的乘客记录。我们的任务是使用前132个月的数据来预测最近12个的乘客数量换句话说,最初的132个月的数据用于培训,最近12个月的数据被用作评估模型的验证。

  让我们绘制每个月乘客旅行的频率。下面的脚本添加了默认图形大小。

  下一个脚本吸引了乘客的每月频率。

  如图所示,旅行的平均人数有很多年增加。一年内旅行的乘客人数波动,这是有道理的,因为在夏季或冬季假期,与其他时间相比,旅客的数量增加在这一年。

  数据集列表的类型是对象,如以下代码所示:

  输出:

  数据处理的第一步是将乘客数量中数据类型的数量转换为

  现在,如果打印all_data numpy数组,则应看到以下类型。

  接下来,我们将我们的数据集分为训练集和测试集。LSTM算法将在培训集中进行培训。然后将使用该模型来预测测试集。将将预测结果与测试的实际值进行比较。设置评估培训模型的性能。

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

  我们的数据集尚未标准化。头几年的乘客总数远小于接下来几年的乘客总数。对于时间序列预测,标准化数据非常重要。设置为最大缩放,以便将数据在某个最小值和最大值范围内进行归一化。我们将使用Sklearn中的MinMaxScaler类。处理模块扩展我们的数据。有关最小/最大变焦实现的更多详细信息,访问此链接。

  以下代码使用最小/最大标准器来标准化我们的数据,最小值和最大值分别为-1和1。

  这里需要提到的是,数据标准化仅适用于培训数据,不适用于测试数据。如果您使用测试数据的归一化,则可能会有一些来自培训集的信息到测试集。

  下一步是将我们的数据集转换为张量,因为Pytorch型号由Tensor训练。在为了将数据集转换为张量的情况下,我们可以简单地将数据集传递到Floatersor对象的构造函数,如下所示。

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

  您可以根据字段的字段使用任何序列长度。但是,在我们的数据集中,12个序列的长度非常方便,因为我们有每月的数据和每年12个月。如果我们有每日数据,则长度更好的序列是365,即一年中的天数。因此,我们将输入序列的长度设置为训练中的12个,为12。

  接下来,我们将定义一个名为create_inout_secorences的函数。此功能将接受原始输入数据,并将返回学费列表。在每个元组中,第一个元素将包括12个项目的列表,与12个项目相对应的乘客人数。月份。

  运行此脚本以创建一个列表和相关标签以进行培训:

  如果您打印了TRIN_INOUT_SEQ列表的长度,则会发现它包含120个项目。这是因为尽管训练集包含132个元素,但序列长度为12个,这意味着第一个序列由第一个12个项目组成,并且是该序列。第13个项目是第一个序列的标签。相似地,第二个序列从第二项开始,第13个末端,第14个序列是第二个序列的标签,依此类推。

  让我们打印tran_inout_seq列表的前5个项目。

  输出:

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

  我们已经准备好数据了,现在是时候训练我们的模型了。我们定义了一个继承pytorch库的nn.模块类的LSTM类。请请请参见上一篇文章,以查看如何使用Pytorch创建分类模型。将帮助您了解以下代码中发生的情况。

  让我总结以上代码中发生的情况。LSTM类的构造函数接受三个参数:

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

  在正面通信方法中,input_seq作为参数传递,首先传递给LSTM层。LSTM层的输出是当前时间步骤的隐藏状态和单位状态,并且也有输出。LSTM层的内容传递给线性层。预测乘客的数量存储在预测列表的最后一项中,并返回到呼叫功能。

  下一步是创建一个LSTM()类的对象来定义损失函数和优化器。由于我们正在求解分类问题,我们将使用cross -entropy损失函数。对于优化器功能,我们将使用ADAM Optimizer优化器。

  我们将训练我们的型号150次。如果您愿意,您可以尝试更多的次数。每25次后将打印损失。

  输出:

  现在我们的模型已经接受了培训,我们可以开始预测。由于我们的测试集包括过去12个月的乘客数据,并且我们的模型经过培训以预测12个序列的长度。我们将首先屏幕最后12个值从训练集中。

  输出:

  最初,test_inputs项目将包括12个项目。在第二次迭代中,最后12个项目将再次用作输入,进行新的预测,然后再次添加到test_inputs列表中。由于测试集有12个元素,因此将执行12次。周期,test_inputs列表将包括24个项目。最后12个项目将是测试集的预测值。

  以下脚本用于预测:

  如果打印test_inputs列表的长度,您会发现它包含24个项目。可以打印最后12个预测项目,如下所示:

  需要再次提及的是,您可能会获得不同的值,具体取决于训练LSTM时使用的重量。

  因为我们已经经过了培训数据集,所以还返回了预测值。我们需要将标准化的预测值转换为实际的预测值。我们可以实现归一化值的inverse_transform方法,将标准化值的方法转换为最小/max scaleer对象的inverse_transform方法。

  输出:

  让我们将预测值与实际值进行比较。请参见以下代码。

  输出:

  在上面的脚本中,我们创建了一个包含过去12个月的值列表。第一个月的索引值为0,因此上个月的索引值为143。

  在下面的脚本中,我们将在过去12个月中绘制144个月的乘客总数和预测乘客的数量。

  输出我们的LSTM预测是由橙色线描述的。您可以看到我们的算法不太准确,但它仍然可以捕获过去12个月旅行的乘客总数和偶尔波动的上升趋势。您可以尝试使用。LSTM层中更多的时期和更多神经元,以查看您是否可以获得更好的性能。

  为了更好地了解输出,我们可以在过去12个月中绘制实际和预测的乘客人数,如下所示:

  同样,预测不是很准确,但是算法可以在未来几个月内捕获乘客的数量,应高于前几个月的趋势,偶尔会波动。

  LSTM是解决序列问题的最广泛使用的算法之一。在本文中,我们看到了如何将LSTM时间序列数据用于未来预测。您还查看如何使用Pytorch库实现LSTM,然后如何比较预测结果具有实际值,以了解训练算法的性能。

  原始:https://juejin.cn/post/7096316708008230920