📅  最后修改于: 2023-12-03 14:43:39.352000             🧑  作者: Mango
在处理时间序列数据时,LSTM RNN是常用的工具。在本篇文章中,我们将使用Keras库,构建LSTM RNN模型,进行时间序列预测。
我们将使用一个公开的天气数据集,数据集包含了德国柏林市从2009年到2016年的每个小时的天气数据,包括温度、湿度、气压等信息。下载数据集后,我们可以使用Pandas库进行数据探索和准备。
import pandas as pd
# 读取数据集
df = pd.read_csv('hourly_42057.csv', index_col=0)
# 选择温度这一列进行预测
data = df['Temperature (C)'].values
我们选择了温度这一列作为预测目标,数据集中共有70,000多条数据。
在进行时间序列预测前,我们需要将数据做一些预处理。由于RNN网络需要输入特征和标签,我们需要将数据集进行划分。
import numpy as np
# 将数据集划分为训练集和测试集
train_size = int(len(data) * 0.7)
train = data[:train_size]
test = data[train_size:]
# 构建特征和标签
def create_dataset(dataset, look_back=1):
X, Y = [], []
for i in range(len(dataset)-look_back-1):
X.append(dataset[i:(i+look_back)])
Y.append(dataset[i+look_back])
return np.array(X), np.array(Y)
look_back = 24
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
我们将数据集划分为训练集和测试集,分别占总数据集的70%和30%。然后,我们使用create_dataset函数构建特征和标签。这个函数中的look_back参数表示历史数据长度,我们这里取24,也就是用前24个小时的气温,预测下一个小时的气温。
我们将训练集和测试集的特征和标签变为numpy数组类型。
接下来,我们使用Keras库构建LSTM RNN模型。在这里,我们使用单层LSTM网络,然后通过一个全连接层输出一个点的预测结果。其中,LSTM层的参数根据经验取值。
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
# 构建LSTM RNN模型
model = Sequential()
model.add(LSTM(50, input_shape=(look_back, 1)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.summary()
模型构建完成后,我们将模型输入训练数据进行训练。由于我们的目标是预测下一个小时的温度,因此我们只需要用训练数据训练模型即可,不需要使用测试数据。
# 模型训练
model.fit(trainX, trainY, epochs=100, batch_size=64, verbose=2)
训练完成后,我们可以使用测试数据进行预测,并将预测结果和真实结果进行比较。
import matplotlib.pyplot as plt
# 模型预测
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)
# 绘制训练集结果和真实结果
plt.plot(trainY)
plt.plot(trainPredict)
plt.show()
# 绘制测试集结果和真实结果
plt.plot(testY)
plt.plot(testPredict)
plt.show()
可以看到,模型训练后,我们得到了训练集和测试集的预测结果。我们将这些结果和真实结果进行比较,发现模型的预测能力还是不错的。
本篇文章介绍了使用Keras库构建LSTM RNN模型,进行时间序列预测的方法。虽然我们只使用了一个德国柏林市的天气数据集进行示例,但是这种方法可以应用于更广泛的时间序列预测问题中。