当前位置: 首页 > 后端技术 > Python

LSTM-TimeSeriesForecastingwithPythoninLSTMusingPyTorch

时间:2023-03-26 16:32:29 Python

时间序列数据,顾名思义,就是随时间变化的数据。比如24小时的温度数据,一个月的评分产品价格数据,某公司全年的股价数据。高级深度学习模型,例如长短期记忆(LSTM),可以捕捉时间序列数据的变化模式,从而能够预测数据的未来趋势。在这篇文章中,您将看到如何使用LSTM算法来预测时间序列数据。在我之前的文章中,我展示了如何使用Keras库执行时间序列分析,使用LSTM来预测未来的股票价格。我们将使用PyTorch库,它是深度学习最常用的Python库之一。在您继续之前,假设您对Python编程语言具有中级水平,并且您已经安装了PyTorch库。此外,了解基本的机器学习概念和深度学习概念也会有所帮助。如果你还没有安装PyTorch,你可以使用下面的pip命令安装它。$pipinstallpytorch复制代码数据集和问题定义我们将使用Seaborn库中的内置数据集。首先,让我们导入所需的库,然后导入数据集:)输出:['anscombe','attention','brain_networks','car_crashes','diamonds','dots','exercise','flights','fmri','gammas','iris','mpg','planets','tips','titanic']复制代码由于众所周知的原因,可以先在Github上下载整个数据包。我们将使用航班数据集。如果没有网络问题,可以使用如下代码导入:flight_data=sns.load_dataset("flights")flight_data.head()复制代码数据集有3列:年、月、乘客数。NumberofPassengers列描述了一个月内乘坐航班的乘客总数。数据集的形状:flight_data.shapeoutput:(144,3)复制代码可以看到有144行3列的数据,即数据集包含了12年的旅客记录。我们的任务是使用过去132个月的数据来预测过去12个月的乘客。也就是说,前132个月的数据用于训练,后12个月的数据用于验证,对模型进行评估。让我们绘制每月乘客出行的频率。下面的脚本增加了默认绘图大小。fig_size=plt.rcParams["figure.figsize"]fig_size[0]=15fig_size[1]=5plt.rcParams["figure.figsize"]=fig_size复制代码,下一个脚本绘制乘客数量的每月频率。plt.title('MonthvsPassenger')plt.ylabel('TotalPassengers')plt.xlabel('Months')plt.grid(True)plt.autoscale(axis='x',tight=True)plt.plot(flight_data['passengers'])复制代码如图所示,乘飞机旅行的平均人数逐年增加。出行的乘客数量全年都在波动,这是有道理的,因为在暑假或寒假期间出行的乘客比一年中的其他时间多。数据处理数据集列类型为object,如下代码所示:flight_data.columns复制代码输出:Index(['year','month','passengers'],dtype='object')复制代码数据处理第一步是将乘客数量列的数据类型转换为floatall_data=flight_data['passengers'].values.astype(float)现在,如果打印all_datanumpy数组,您应该看到以下值浮点型。[112。118.132.129.121.135.148.148.136.119.104.118.115.126.163.218.272.229.278.301.348.472.606.432.]数据集是分为训练集和测试集。LSTM算法将在训练集上进行训练。然后,该模型将用于对测试集进行预测。预测结果将与测试集的实际值进行比较,以评估训练模型的性能。前132条记录将用于训练模型,后12条记录将用作测试集。下面的脚本将数据分成训练集和测试集。test_data_size=12train_data=all_data[:-test_data_size]test_data=all_data[-test_data_size:]复制代码我们的数据集还没有标准化。与后面几年的乘客总数相比,前几年的乘客总数要少得多。对于时间序列预测,对数据进行归一化非常重要。我们将对数据集应用最小/最大缩放,以在特定的最小值和最大值范围内对数据进行归一化。我们将使用sklearn.preprocessing模块中的MinMaxScaler类来缩放我们的数据。有关最小/最大缩放器实施的更多详细信息,请访问此链接。下面的代码使用最小值/最大值缩放器对我们的数据进行归一化,最小值和最大值分别为-1和1。fromsklearn.preprocessingimportMinMaxScalerscaler=MinMaxScaler(feature_range=(-1,1))train_data_normalized=scaler.fit_transform(train_data.reshape(-1,1))copycode这里要提一下,数据归一化只适用于训练数据,而不是测试数据。如果对测试数据应用归一化,则可能会有一些信息从训练集泄漏到测试集。下一步是将我们的数据集转换为张量,因为PyTorch模型是使用张量训练的。为了将数据集转换为张量,我们可以简单地将数据集传递给FloatTensor对象的构造函数,如下所示。train_data_normalized=torch.FloatTensor(train_data_normalized).view(-1)复制代码最后的预处理步骤是将我们的训练数据转换为序列和相应的标签。您可以使用任何序列长度,这取决于领域知识。然而,在我们的数据集中,使用12的序列长度很方便,因为我们有月度数据,一年有12个月。如果我们有每天的数据,一个更好的序列长度是365,也就是一年中的天数。因此,我们在训练期间将输入序列长度设置为12。train_window=12复制代码接下来,我们将定义一个名为create_inout_sequences的函数。该函数将接受原始输入数据并返回一个元组列表。在每个元组中,第一个元素将包含12个项目的列表,对应于12个月内旅行的乘客数量,第二个元组元素将包含一个项目,即12+1个月的乘客数量。defcreate_inout_sequences(input_data,tw):inout_seq=[]L=len(input_data)foriinrange(L-tw):train_seq=input_data[i:i+tw]train_label=input_data[i+tw:i+tw+1]inout_seq.append((train_seq,train_label))returninout_seq会发现它包含120个项目。这是因为虽然训练集包含132个元素,但是序列长度是12,也就是说第一个序列由前12个item组成,第13个item是第一个序列的标签。同样,第二个序列从第二个项目开始,到第13个项目结束,第14个项目是第二个序列的标签,依此类推。现在让我们打印train_inout_seq列表的前5项。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]),张量([-0.9516])),(张量([-0.9385,-0.8769,-0.8901,-0.9253,-0.8637,-0.8066,-0.8066,-0.8593,-0.9341,-1.0000,-0.9385,-0.9516]),张量([-0.9033])),(张量([-0.8769,-0.8901,-0.9253,-0.8637,-0.8066,-0.8066,-0.8593,-0.9341,-1.0000,-0.9385,-0.9516,-0.9033]),张量([-0.8374])),(张量([-0.8901,-0.9253,-0.8637,-0.8066,-0.8066,-0.8593,-0.9341,-1.0000,-0.9385,-0.9516,-0.9033,-0.8374]),张量([-0.8637])),(张量([-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个项组成的序列,第二个元组元素包含对应的标签。