11.4.8 使用LSTM训练模型
LSTM(长短时记忆网络)是一种深度学习模型,特别用于处理序列数据,尤其是时间序列数据。它是循环神经网络(RNN)的一种变种,旨在解决传统RNN在处理长序列时出现的梯度消失和梯度爆炸等问题。使用LSTM(长短时记忆网络)来处理时间序列数据是一种常见的方法,特别适用于具有长期依赖关系的数据。
(1)将原始时间序列数据准备成适合LSTM模型训练的格式,包括归一化数据和形状重塑。接下来,可以将X_train和y_train用于LSTM模型的训练。具体实现代码如下所示。
training_set = df_train.values
training_set = np.reshape(training_set, (len(training_set), 1))
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler()
training_set = sc.fit_transform(training_set)
X_train = training_set[0:len(training_set)-1]
y_train = training_set[1:len(training_set)]
X_train = np.reshape(X_train, (len(X_train), 1, 1))
对上述代码的具体说明如下:
- training_set = df_train.values:将训练集数据从Pandas DataFrame转换为NumPy数组。
- training_set = np.reshape(training_set, (len(training_set), 1)):对训练集数据进行形状重塑,将其从一维数组变成二维数组,其中每个数据点是一个单独的行。
- from sklearn.preprocessing import MinMaxScaler:导入MinMaxScaler,这是一个用于归一化(将数据缩放到0到1之间)的工具。
- sc = MinMaxScaler():创建MinMaxScaler对象,用于对数据进行归一化。
- training_set = sc.fit_transform(training_set):使用MinMaxScaler对训练集数据进行归一化,确保数据位于0到1的范围内。
- X_train = training_set[0:len(training_set)-1]:创建X_train,这是训练集的输入特征。它包含了前一个时间点的归一化价格数据。
- y_train = training_set[1:len(training_set)]:创建y_train,这是训练集的目标值。它包含了当前时间点的归一化价格数据。
- X_train = np.reshape(X_train, (len(X_train), 1, 1)):对X_train进行形状重塑,以便适应LSTM模型的输入要求。LSTM模型通常期望输入是三维的,其中第一维表示样本数量,第二维表示时间步长(序列长度),第三维表示特征数量。在这里,每个样本是一个时间点,所以时间步长为1,特征数量也为1。
(2)使用Keras库构建了一个简单的LSTM(长短时记忆网络)模型,用于时间序列预测。我们可以根据需要添加更多的LSTM层或调整其他超参数来改进模型性能。接下来,可以使用准备好的训练数据 X_train 和 y_train 来训练这个模型。具体实现代码如下所示。
model1 = Sequential()
model1.add(LSTM(10,activation="sigmoid",return_sequences = True,input_shape = (None, 1)))
# model1.add(Dropout(0.2))
# model1.add(LSTM(64,return_sequences = True))
# model1.add(Dropout(0.2))
# model1.add(LSTM(10))
# model1.add(Dropout(0.2))
model1.add(Dense(1))
model1.compile(loss='mean_squared_error', optimizer='adam')
model1.summary()
执行后会输出:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm (LSTM) (None, None, 10) 480
_________________________________________________________________
dense (Dense) (None, None, 1) 11
=================================================================
Total params: 491
Trainable params: 491
Non-trainable params: 0
_________________________________________________________________
(3)训练构建的LSTM模型 (model1),并将训练的历史记录存储在 history 变量中。具体实现代码如下所示。
history=model1.fit(X_train, y_train, batch_size = 5, epochs = 20)
在训练函数model1.fit()中,参数X_train 是训练集的输入特征,包含了时间序列数据的前一个时间点的归一化价格数据。参数y_train 是训练集的目标值,包含了时间序列数据的当前时间点的归一化价格数据。参数batch_size用于指定每个小批次的样本数量,这里设置为 5。参数epochs用于指定训练的轮数,这里设置为 20。在训练过程中,会使用优化器(在此处是Adam优化器)最小化损失函数(均方误差)。模型会反复迭代训练数据集,并不断调整模型参数以逐渐提高模型的预测性能。执行后会输出训练过程:
Epoch 1/20
300/300 [==============================] - 2s 1ms/step - loss: 0.2960
Epoch 2/20
300/300 [==============================] - 0s 1ms/step - loss: 0.0153
Epoch 3/20
300/300 [==============================] - 0s 1ms/step - loss: 0.0134
Epoch 4/20
300/300 [==============================] - 0s 1ms/step - loss: 0.0123
Epoch 5/20
300/300 [==============================] - 0s 1ms/step - loss: 0.0099
Epoch 6/20
300/300 [==============================] - 0s 1ms/step - loss: 0.0095
Epoch 7/20
300/300 [==============================] - 0s 1ms/step - loss: 0.0073
Epoch 8/20
300/300 [==============================] - 0s 1ms/step - loss: 0.0049
Epoch 9/20
300/300 [==============================] - 0s 1ms/step - loss: 0.0048
Epoch 10/20
300/300 [==============================] - 0s 1ms/step - loss: 0.0030
Epoch 11/20
300/300 [==============================] - 0s 1ms/step - loss: 0.0018
Epoch 12/20
300/300 [==============================] - 0s 1ms/step - loss: 0.0011
Epoch 13/20
300/300 [==============================] - 0s 1ms/step - loss: 6.5369e-04
Epoch 14/20
300/300 [==============================] - 0s 1ms/step - loss: 2.6755e-04
Epoch 15/20
300/300 [==============================] - 0s 1ms/step - loss: 2.2276e-04
Epoch 16/20
300/300 [==============================] - 0s 1ms/step - loss: 1.7363e-04
Epoch 17/20
300/300 [==============================] - 0s 1ms/step - loss: 1.4839e-04
Epoch 18/20
300/300 [==============================] - 0s 1ms/step - loss: 1.5048e-04
Epoch 19/20
300/300 [==============================] - 0s 1ms/step - loss: 1.0066e-04
Epoch 20/20
300/300 [==============================] - 0s 1ms/step - loss: 1.1933e-04
通过上述训练过程,模型将逐渐学习如何根据过去的时间点预测未来的时间点。可以使用变量history中的信息来可视化训练过程中损失的变化,并评估模型的性能。这对于确定模型是否过拟合或欠拟合以及是否需要进一步调整超参数非常有帮助。