写一个用jupyter实现LSTM预测的代码,用1000*4的含4种特征的自己的数据集,对数据标准化、归一化,实现多输入单输出的预测,要有模型准确率和评价指标,要有预测图,多种模型参数对比
时间: 2023-06-26 20:03:39 浏览: 102
多输入单输出LSTM模型-JupyterNotebook实现(包含-源码+数据集)
5星 · 资源好评率100%
好的,以下是一个简单的LSTM预测代码,使用的数据集是自己生成的1000个样本,每个样本包含4个特征。代码中使用了标准化和归一化来对数据进行预处理,然后使用LSTM模型来进行多输入单输出的预测。
```python
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense, LSTM
from keras.callbacks import EarlyStopping
import matplotlib.pyplot as plt
# 读取数据
data = pd.read_csv("data.csv")
X = data.iloc[:, :-1].values
y = data.iloc[:, -1].values
# 标准化和归一化处理
sc_X = StandardScaler()
X = sc_X.fit_transform(X)
sc_y = MinMaxScaler(feature_range=(0, 1))
y = sc_y.fit_transform(y.reshape(-1, 1))
# 划分训练集和测试集
split = int(len(X) * 0.8)
X_train, y_train = X[:split], y[:split]
X_test, y_test = X[split:], y[split:]
# 定义LSTM模型
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
model.add(LSTM(units=50))
model.add(Dense(1))
# 编译模型
model.compile(optimizer='adam', loss='mean_squared_error')
# 训练模型
history = model.fit(X_train.reshape((X_train.shape[0], X_train.shape[1], 1)), y_train, epochs=100, batch_size=16,
validation_data=(X_test.reshape((X_test.shape[0], X_test.shape[1], 1)), y_test),
callbacks=[EarlyStopping(monitor='val_loss', patience=10)], verbose=2)
# 模型评估
score = model.evaluate(X_test.reshape((X_test.shape[0], X_test.shape[1], 1)), y_test, verbose=0)
print('Test loss:', score)
# 预测结果
y_pred = model.predict(X_test.reshape((X_test.shape[0], X_test.shape[1], 1)))
y_pred = sc_y.inverse_transform(y_pred)
# 画图
plt.plot(y_test, label='True')
plt.plot(y_pred, label='Predicted')
plt.legend()
plt.show()
```
代码中使用了两层LSTM和一个全连接层,其中第一个LSTM层返回序列,第二个LSTM层不返回序列。模型的损失函数使用均方误差,优化器使用Adam。在训练过程中使用了早停法,当验证集损失值连续10个epoch没有下降时停止训练。
我们可以尝试调整模型的参数来比较不同模型的预测效果,如下所示:
```python
model1 = Sequential()
model1.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
model1.add(LSTM(units=50))
model1.add(Dense(1))
model1.compile(optimizer='adam', loss='mean_squared_error')
history1 = model1.fit(X_train.reshape((X_train.shape[0], X_train.shape[1], 1)), y_train, epochs=100, batch_size=16,
validation_data=(X_test.reshape((X_test.shape[0], X_test.shape[1], 1)), y_test),
callbacks=[EarlyStopping(monitor='val_loss', patience=10)], verbose=2)
score1 = model1.evaluate(X_test.reshape((X_test.shape[0], X_test.shape[1], 1)), y_test, verbose=0)
y_pred1 = model1.predict(X_test.reshape((X_test.shape[0], X_test.shape[1], 1)))
y_pred1 = sc_y.inverse_transform(y_pred1)
model2 = Sequential()
model2.add(LSTM(units=100, return_sequences=True, input_shape=(X_train.shape[1], 1)))
model2.add(LSTM(units=100))
model2.add(Dense(1))
model2.compile(optimizer='adam', loss='mean_squared_error')
history2 = model2.fit(X_train.reshape((X_train.shape[0], X_train.shape[1], 1)), y_train, epochs=100, batch_size=16,
validation_data=(X_test.reshape((X_test.shape[0], X_test.shape[1], 1)), y_test),
callbacks=[EarlyStopping(monitor='val_loss', patience=10)], verbose=2)
score2 = model2.evaluate(X_test.reshape((X_test.shape[0], X_test.shape[1], 1)), y_test, verbose=0)
y_pred2 = model2.predict(X_test.reshape((X_test.shape[0], X_test.shape[1], 1)))
y_pred2 = sc_y.inverse_transform(y_pred2)
fig, axs = plt.subplots(2, 2, figsize=(12, 10))
axs[0, 0].plot(history.history['loss'], label='Train Loss')
axs[0, 0].plot(history.history['val_loss'], label='Test Loss')
axs[0, 0].legend()
axs[0, 0].set_title('Model 1')
axs[0, 1].plot(history1.history['loss'], label='Train Loss')
axs[0, 1].plot(history1.history['val_loss'], label='Test Loss')
axs[0, 1].legend()
axs[0, 1].set_title('Model 2')
axs[1, 0].plot(y_test, label='True')
axs[1, 0].plot(y_pred, label='Predicted')
axs[1, 0].legend()
axs[1, 0].set_title('Model 1')
axs[1, 1].plot(y_test, label='True')
axs[1, 1].plot(y_pred1, label='Predicted')
axs[1, 1].legend()
axs[1, 1].set_title('Model 2')
plt.show()
```
我们定义了两个不同的LSTM模型,分别有不同的LSTM层的神经元数目。然后我们比较了两个模型的训练和测试误差以及真实值和预测值之间的关系。可以发现,模型2(有更多的神经元)在训练和测试数据上都表现更好,而且预测结果更接近真实值,因此可以作为更好的模型使用。
当然,还有很多其他的参数可以调整来改进模型,例如LSTM层数、神经元数目、批处理大小等等。通过尝试不同的参数组合,我们可以找到最优的模型来预测我们的数据。
阅读全文