写一个用jupyter实现的LSTM预测四维时间序列的代码,用自己的500*4的数据集,要有模型评价指标,有误差图和训练集、测试集的预测值与真实值的对比图,要有优化器的比较
时间: 2024-05-01 13:19:53 浏览: 70
好的,我来给您展示如何用Jupyter实现LSTM预测四维时间序列,以下是代码和详细说明:
首先,导入所需的库,包括numpy、pandas、matplotlib、sklearn和keras等。
``` python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout
from keras.optimizers import Adam, RMSprop
```
接着,我们需要从本地读取数据集并进行预处理。这里我们假设数据集的名称为“data.csv”,包含四列数据,分别是时间、价格、销量和利润。
``` python
# 读取数据
data = pd.read_csv('data.csv', index_col=0)
# 数据预处理
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)
# 划分训练集和测试集
train_size = int(len(data_scaled) * 0.8)
test_size = len(data_scaled) - train_size
train_data = data_scaled[:train_size,:]
test_data = data_scaled[train_size:,:]
```
接下来,我们需要定义一个函数来生成LSTM模型。这里我们使用一个两层的LSTM神经网络,每层包含64个神经元。
``` python
def create_LSTM_model(X_train):
model = Sequential()
model.add(LSTM(units=64, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(units=64, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units=64))
model.add(Dropout(0.2))
model.add(Dense(units=1))
return model
```
然后,我们需要定义一个函数来训练LSTM模型。
``` python
def train_LSTM_model(model, X_train, y_train, optimizer):
model.compile(loss='mean_squared_error', optimizer=optimizer)
history = model.fit(X_train, y_train, epochs=50, batch_size=64, validation_split=0.1, shuffle=False)
return history
```
接下来是主函数,我们需要将训练集和测试集转换成LSTM模型输入的形式,并且训练模型并进行预测。
``` python
# 转换训练集和测试集为LSTM模型输入的形式
X_train, y_train = [], []
for i in range(60, len(train_data)):
X_train.append(train_data[i-60:i,:])
y_train.append(train_data[i,0])
X_train, y_train = np.array(X_train), np.array(y_train)
X_test, y_test = [], []
for i in range(60, len(test_data)):
X_test.append(test_data[i-60:i,:])
y_test.append(test_data[i,0])
X_test, y_test = np.array(X_test), np.array(y_test)
# 创建LSTM模型
model = create_LSTM_model(X_train)
# 训练LSTM模型
history_Adam = train_LSTM_model(model, X_train, y_train, optimizer=Adam(lr=0.001))
history_RMSprop = train_LSTM_model(model, X_train, y_train, optimizer=RMSprop(lr=0.001))
# 使用LSTM模型进行预测
y_train_pred = model.predict(X_train)
y_test_pred_Adam = model.predict(X_test)
y_test_pred_RMSprop = model.predict(X_test)
```
最后,我们需要绘制误差图和训练集、测试集的预测值与真实值的对比图,并输出模型评价指标。
``` python
# 绘制误差图
plt.plot(history_Adam.history['loss'], label='Adam')
plt.plot(history_RMSprop.history['loss'], label='RMSprop')
plt.title('Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend()
plt.show()
# 绘制训练集和测试集的预测值与真实值的对比图
plt.plot(y_train, label='True (train)')
plt.plot(y_train_pred, label='Predicted (train)')
plt.plot(range(len(y_train), len(y_train)+len(y_test)), y_test, label='True (test)')
plt.plot(range(len(y_train), len(y_train)+len(y_test)), y_test_pred_Adam, label='Predicted (test, Adam)')
plt.plot(range(len(y_train), len(y_train)+len(y_test)), y_test_pred_RMSprop, label='Predicted (test, RMSprop)')
plt.title('Model Prediction')
plt.ylabel('Price')
plt.xlabel('Time')
plt.legend()
plt.show()
# 输出模型评价指标
train_RMSE = np.sqrt(np.mean((y_train_pred - y_train)**2))
test_RMSE_Adam = np.sqrt(np.mean((y_test_pred_Adam - y_test)**2))
test_RMSE_RMSprop = np.sqrt(np.mean((y_test_pred_RMSprop - y_test)**2))
print('Train RMSE: %.3f' % train_RMSE)
print('Test RMSE (Adam): %.3f' % test_RMSE_Adam)
print('Test RMSE (RMSprop): %.3f' % test_RMSE_RMSprop)
```
这里我们使用了两个优化器:Adam和RMSprop,并且输出了模型在训练集和测试集上的均方根误差(RMSE)。
希望这个代码能对您有所帮助!
阅读全文