分享

Time and Series Forecasting with LSTM

 wj_c 2023-09-18

每天,人类在执行过马路等任务时都能做出被动预测,估计汽车的速度和距离他们身上,或者接球通过猜测其速度并相应地实践来定位他们的手。这些技能是通过经验而获得的。然而,由于涉及牲畜变量、天气预测或经济等复杂现象可能很困难。在这种情况下使用时间和序列预测,依靠历史数据和数学模型来预测未来的趋势和模式。在本文中,我们将看到使用运河数据集通过数学概念进行预测的示例。

第1部分:数学概念

在使用本文的时间序列预测算法中,该算法不是手动计算直线的斜率和截距,而是使用具有LSTM层的神经网络来学习时间序列数据中的潜在模式和关系。神经网络对部分数据训练进行,然后用于对剩余部分进行预测。在该算法中,下一个时间步的预测是基于之前的 n_inputs 个时间步,这类似于线性回归样本中使用 y(t) 来预测 y(T+1)然而该算法中的预测不是使用简单的线性方程,而是使用LSTM层的激活函数生成。激活函数允许模型捕获数据中的非线性关系,

激活函数

LSTM模型中使用的激活函数是修正线性单元(ReLU)激活函数。该激活函数求解简单且有效地处理梯度消失问题而常用于深度学习模型中。在LSTM模型中,ReLU激活函数评估每个LSTM 单元的输出,以在任何模型中引入非线性并允许其学习数据中的复杂模式。具有简单的阈值行为的 ReLU 函数,其中负输入都是将pedmap到零,并且任何正输入都不会改变,从而提高计算效率。

第2部分:实施

导入numpy作为np
导入pandas作为pd
导入matplotlib.pyplot作为plt
df = pd.read_csv( 'airline-passengers.csv' , index_col= '月份' , parse_dates= True )
df.index.freq = 'MS'
df.shape
df.columns
plt.figure(figsize=( 20 , 4 ))
plt.plot(df.Passengers, linewidth= 2 )
plt.show()

该代码导入了三个重要的库:numpy、pandas 和 matplotlib。pandas 库用于读取“airline-passengers.csv”文件把“Month”列设置为索引,这样可以随时间分析数据。然后,该代码使用 matplotlib 库创建一个线图,显示一段时间内的宽度积分的数量。最后,使用“plt.show”函数显示绘图。此代码对于有兴趣分析时间序列数据的人来说非常有用,它演示了如何使用pandas和matplotlib来可视化数据趋势。

nobs = 12
df_train = df.iloc[:-nobs]
df_test = df.iloc[-nobs:]
df_train.shape
df_test.shape

此代码通过将现有时间序列数据帧“df”拆分为训练集和测试集创建两个新数据帧“df_train”和“df_test” 。'nobs' 变量设置为 12,这意味着 'df' 的最后 12 个观测值将用于测试,而其余数据将用于训练。训练集存储在“df_train”中,由“df”中除最后 12 行之外的所有行组成,而测试集存储在“df_test”中,仅由“df”中的最后 12 行组成。然后使用“shape”属性打印每个数据框中的行数和列数,这确认分割是否正确完成。

模型架构

照片 @learnwithutsav拍摄
来自喀拉斯。预处理序列 sklearn导入 TimeseriesGenerator预处理import MinMaxScaler缩放器 = MinMaxScaler ()缩放器。适合(df_train)scaled_train = 缩放器。变换(df_train)scaled_test = 缩放器。变换(df_测试)




n_inputs = 12
n_features = 1
生成器 = TimeseriesGenerator(scaled_train, scaled_train, length = n_inputs, batch_size = 1 )

for i in range ( len (generator)):
X, y = Generator[i]
print ( f' \n {X.展平()}{y} ' )

此代码片段演示了如何使用Keras中的“TimeseriesGenerator”类和来自Keras 的“MinMaxScaler”类scikit-learn 为时间序列预测模型生成输入和输出数组。该代码首先创建“MinMaxScaler”类的一个实例,并将其适合训练数据集(“df_train”)以缩放数据。然后,缩放后的数据存储在“scaled_train”和“scaled_test”数据框中。时间步数 ('n_inputs') 设置为 12,特征数 ('n_features') 设置为 1。使用 'scaled_train' 数据和窗口长度 'n_inputs 创建 'TimeseriesGenerator' 对象',批量大小为 1。最后,使用循环迭代“生成器”对象并打印每个时间步的输入和输出数组。“X”和“y”变量分别表示每个时间步的输入和输出数组。这 ' flatten()'方法用于将输入数组转换为一维数组,以便于打印。总的来说,此代码对于使用滑动窗口方法为预测模型准备时间序列数据非常有用。

X形

此代码返回数组或矩阵“X”的形状。“shape”属性是 NumPy 数组的一个属性,返回一个表示数组维度的元组。该代码没有提供任何额外的上下文,因此不清楚“X”的形状是什么。输出的格式为(行、列)。

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM

model = Sequential()
model.add(LSTM( 200 , activate= 'relu' , input_shape = (n_inputs, n_features)))
model.add(密集( 1 ))
模型。编译(优化器 = 'adam',损失 = 'mse'

model.summary()

此代码演示了如何使用 Keras 创建用于时间序列预测的 LSTM 神经网络模型。首先,导入必要的 Keras 类,包括“Sequential”、“Dense”和“LSTM”。该模型被创建为“顺序”对象,并添加了一个包含 200 个神经元的 LSTM 层、“relu”激活函数以及由下式定义的输入形状“n_inputs”和“n_features”。然后,LSTM 层输出被传递到具有单个输出神经元的“密集”层。该模型是使用“adam”优化器和均方误差(“mse”)损失函数编译的。'summary()' 方法用于显示架构的摘要,包括参数的数量以及每层输入和输出张量的形状。该代码对于创建用于时间序列预测的 LSTM 模型非常有用,因为它提供了一个易于理解的示例,可以适应不同的数据集和预测问题。

训练阶段

model .fit (生成器, epochs = 50 )

此代码使用 Keras 中的“fit()”方法训练 LSTM 神经网络模型 50 个周期。“TimeseriesGenerator”对象生成批量的输入/输出对,供模型学习“fit()”方法根据模型编译期间定义的损失函数和优化器使用反向传播来更新模型参数。通过训练模型,它学会根据训练数据中学到的模式对新的、看不见的数据进行预测。

plt.plot(model.history.history[ 'loss' ])
last_train_batch = scaled_train[- 12 :] last_train_batch

=last_train_batch.reshape( 1,12,1 ) last_train_batch model.predict (last_train_batch)




此代码使用经过训练的 LSTM 神经网络模型对新数据点进行预测。训练数据中的最后 12 个数据点被选择、缩放并重新调整为适合模型的格式。在模型上调用“predict()”方法,以重塑的数据作为输入,输出是时间序列中下一个时间步的预测值。这是使用 LSTM 模型进行时间序列预测的重要步骤。

缩放测试[0]

此代码打印缩放后的测试数据数组的第一个元素。“scaled_test”变量是已使用“MinMaxScaler”对象转换的测试数据的 NumPy 数组。打印该数组的第一个元素显示测试数据中第一个时间步长的缩放值。

预测

y_pred=[]

first_batch=scaled_train[-n_inputs:]
current_batch=first_batch.reshape( 1 ,n_inputs,n_features)

for i in range( len (scaled_test)):
batch=current_batch
pred=model.predict(batch)[ 0 ]
y_pred .append(pred)
current_batch = np.append(current_batch[:, 1 :, :], [[pred]] , axis = 1 )


y_pred


scaled_test

此代码使用经过训练的 LSTM 模型生成测试数据的预测。它使用 for 循环来循环缩放测试数据中的每个元素。在每次迭代中,当前批次用于使用模型的“predict()”方法进行预测。然后将预测值添加到“y_pred”列表中并更新当前批次。最后,“y_pred”列表与“scaled_test”数据一起打印,以将预测值与实际值进行比较。此步骤对于评估 LSTM 模型在测试数据上的性能至关重要。

df_test 

y_pred_transformed = 缩放器.inverse_transform(y_pred)

y_pred_transformed = np.round(y_pred_transformed,0)

y_pred_final = y_pred_transformed.astype(int)

y_pred_final

此代码使用缩放器对象的“inverse_transform()”方法将上一步中生成的预测值转换回原始比例。转换后的值使用“round()”函数四舍五入为最接近的整数,并使用“astype()”方法转换为整数。打印生成的预测值数组“y_pred_final”以显示测试数据的最终预测值。此步骤对于评估 LSTM 模型在原始数据规模上的预测准确性非常重要。

df_test.values, y_pred_final

df_test[ '预测' ] = y_pred_final

df_test

上面的代码显示了LSTM 模型生成的预测值被添加到原始测试数据集中首先,“values”属性用于提取“df_test”数据帧的值,然后将其与预测值“y_pred_final”配对。然后,将一个名为“预测”的新列添加到“df_test”数据帧中以存储预测值。最后,使用新添加的“预测”列打印“df_test”数据框。此步骤对于直观地比较测试数据集的实际值与预测值并评估模型的准确性非常重要。

plt.figure(figsize=( 15 , 6 )) 
plt.plot(df_train.index, df_train.Passengers, linewidth= 2 , color= 'black' , label= '训练值' )
plt.plot(df_test.index, df_test .Passengers, linewidth= 2 , color= 'green' , label= '真实值' )
plt.plot(df_test.index, df_test.Predictions, linewidth= 2 , color= 'red' , label= '预测值' )
plt .legend()
plt. 显示()

此代码块正在使用该库生成一个绘图matplotlib它首先设置图形大小,然后将训练数据绘制为黑线,将真实测试值绘制为绿线,将预测测试值绘制为红线。它还向绘图添加图例并使用该show()方法显示它。

均方误差

均方误差 (MSE) 是回归线与一组点的接近程度的度量。它是通过取预测值和实际值之间的平方差的平均值来计算的。MSE 的平方根称为均方根误差 (RMSE),它是衡量预测准确性的常用指标。在此代码块中,使用模块中的mean_squared_error函数sklearn.metrics模块中的sqrt函数计算 RMSE mathRMSE 用于评估 LSTM 模型的预测与测试集中的真实值相比的准确性。

来自sklearn。指标 导入mean_squared_error
from math import sqrt

sqrt mean_squared_errordf_test.Passengers,df_test.Predictions

df_test.Passengers此代码计算测试集中的实际乘客值 ( ) 和预测乘客值 ( df_test.Predictions)之间的均方根误差 (RMSE) 。RMSE 是评估回归模型性能的常用指标。它测量预测值和实际值之间的平均距离,并考虑它们之间差异的平方。RMSE 是一个有用的指标,因为它对大错误的惩罚比对小错误的惩罚更严重,这使其成为模型预测整体准确性的良好指标。

总之,我们在 Keras 中使用 LSTM 算法实现了时间序列预测模型。我们根据每月的航空公司乘客数据集训练了模型,并用它来预测未来 12 个月的情况。该模型表现良好,均方根误差为 30.5。真实值、预测值和训练值的可视化表明,该模型能够捕获数据的总体趋势和季节性。这证明了 LSTM 在捕获时间序列数据中复杂时间关系方面的强大功能及其做出准确预测的潜力。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多