# 导入库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense, LSTM, Dropout
from keras.optimizers import SGD, RMSprop
import keras
from sklearn.metrics import mean_squared_error
from math import sqrt
# 加载历史数据文件
# index_col='Date',将Date这一页作为索引,parse_dates=['Date']
dataset = pd.read_csv('load1.csv', index_col='Date', parse_dates=['Date'])
# print(dataset.head())
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
dataset = np.array(dataset)
# print(dataset)
# 将所有的数据放到一个列表里面,方便后续的训练集和测试集的制作
a = []
for item in dataset:
for i in item:
a.append(i)
dataset = pd.DataFrame(a)
# # 划分训练集测试集
training_set = dataset.iloc[0:len(a) - 96 - 672, [0]]
test_set = dataset.iloc[len(a) - 96 - 672:, [0]]
# print(test_set)
# 将数据集进行归一化,方便神经网络的训练
sc = MinMaxScaler(feature_range=(0, 1))
train_set_scaled = sc.fit_transform(training_set)
test_set = sc.transform(test_set)
# print(type(test_set))
x_train = []
y_train = []
x_test = []
y_test = []
# 利用for循环,遍历整个训练集,提取训练集中连续96个采样点的数据作为输入特征x_train,第97个采样点的数据作为标签.
for i in range(96, len(train_set_scaled)):
x_train.append(train_set_scaled[i - 96:i, 0])
y_train.append(train_set_scaled[i, 0])
# 将训练集由list格式变为array格式
x_train, y_train = np.array(x_train), np.array(y_train)
print(y_train)
# 使x_train符合RNN输入要求:[送入样本数, 循环核时间展开步数, 每个时间步输入特征个数]。
# 此处整个数据集送入,送入样本数为x_train.shape[0]即训练数据的样本个数; 循环核时间展开步数定位96
# 预测出第97天的电力负荷,循环核时间展开步数为96; 每个时间步送入的特征是某一时刻的电力负荷,只有1个数据,故每个时间步输入特征个数为1
x_train = np.reshape(x_train, (x_train.shape[0], 96, 1))
for i in range(96, len(test_set)):
x_test.append(test_set[i - 96:i, 0])
y_test.append(test_set[i, 0])
# 测试集变array并reshape为符合RNN输入要求:[送入样本数, 循环核时间展开步数, 每个时间步输入特征个数]
x_test, y_test = np.array(x_test), np.array(y_test)
x_test = np.reshape(x_test, (x_test.shape[0], 96, 1))
# 搭建神经网络模型
model = keras.Sequential([
LSTM(80, return_sequences=True),
Dropout(0.2),
LSTM(100),
Dropout(0.2),
Dense(1)
])
# 对模型进行编译,选用Adam优化器,学习率为0.01
model.compile(optimizer=keras.optimizers.Adam(0.01),
loss='mean_squared_error')
# 将训练集和测试集放入网络进行训练,每批次送入的数据为512个数据,一共训练30轮,将测试集样本放入到神经网络中测试其验证集的loss值
history = model.fit(x_train, y_train, batch_size=512, epochs=30, validation_data=(x_test, y_test))
# 测试集输入模型进行预测
predicted_stock_price = model.predict(x_test)
# 对预测数据还原---从(0,1)反归一化到原始范围
prediction = sc.inverse_transform(predicted_stock_price)
# 对真实数据还原---从(0,1)反归一化到原始范围
real = sc.inverse_transform(test_set[96:])
# 打印出模型的参考指标
rmse = sqrt(mean_squared_error(prediction, real))
mape = np.mean(np.abs((real - prediction) / prediction)) * 100
print('Test RMSE: %.3f' % rmse)
print('Test MAPE: %.3f' % mape)
# 绘制真实值和预测值对比图
plt.plot(prediction, label='预测值')
plt.plot(real, label='真实值')
plt.legend(loc='best')
plt.ylabel('负荷', fontsize=12)
plt.xlabel('时间', fontsize=12)
plt.title("基于LSTM神经网络负荷预测")
plt.show()
# 绘制训练集和测试集的loss值对比图
plt.plot(history.history['loss'], label='train')
plt.plot(history.history['val_loss'], label='test')
plt.title("LSTM神经网络loss值")
plt.legend()
plt.show()
RNN-LSTM-GRU单变量负荷预测.zip
版权申诉
161 浏览量
2023-08-25
11:26:10
上传
评论
收藏 274KB ZIP 举报
sjx_alo
- 粉丝: 1w+
- 资源: 1193
最新资源
- 学生成绩管理系统-C++版本
- 吉林大学离散数学2笔记.pdf
- 通道处理过程的模拟通常涉及对通道处理机制的理解与实现.txt
- Flume进阶-自定义拦截器jar包
- Dubins曲线算法讲解和在运动规划中的使用.pdf
- 上市公司-股票性质数据-工具变量(民企、国企、央企)2003-2022年.dta
- 上市公司-股票性质数据-工具变量(民企、国企、央企)2003-2022年.xlsx
- Reeds+Shepp曲线算法讲解和实现.pdf
- 毕业设计基于SpringBoot+MyBatisPlus+MySQL+Vue的外卖配送信息系统源代码+数据库
- 词向量(Word Embeddings)是自然语言处理(NLP)领域的一种重要技术.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈