系列文章目录
深度学习原理-----线性回归+梯度下降法
深度学习原理-----逻辑回归算法
深度学习原理-----全连接神经网络
深度学习原理-----卷积神经网络
深度学习原理-----循环神经网络(RNN、LSTM)
时间序列预测-----基于BP、LSTM、CNN-LSTM神经网络算法的单特征用电负荷预测
系列教学视频
快速入门深度学习与实战
[手把手教学]基于BP神经网络单特征用电负荷预测
[手把手教学]基于RNN、LSTM神经网络单特征用电负荷预测
[手把手教学]基于CNN-LSTM神经网络单特征用电负荷预测
文章目录
- 系列文章目录
- 系列教学视频
- 前言
- 一、单特征电力负荷数据分析
- 1.1、数据展示
- 1.2、分析电力负荷中的规律
- 二、基于BP神经网络单特征电力负荷预测
- 2.1、BP神经网络模型应用于单特征电力负荷预测
- 2.2、 数据预处理与数据集划分
- 2.3、模型搭建
- 2.4、模型预测
- 三、基于RNN、LSTM神经网络单特征电力负荷预测
- 3.1、RNN、LSTM神经网络模型应用于单特征电力负荷预测
- 3.2、数据预处理与数据集划分
- 3.3、模型搭建
- 3.4、模型预测
- 四、基于CNN-LSTM神经网络单特征电力负荷预测
- 4.1、CNN-LSTM神经网络模型应用于多特征电力负荷预测
- 4.1.1、一维卷积运算
- 4.1.2、一维池化运算
- 4.2、CNN-LSTM模型应用于多影响因素电力负荷预测
- 4.3、数据预处理与数据集划分
- 4.4、模型搭建
- 4.5、模型预测
- 五、单特征电力负荷预测模型对比分析总结
- 六、电力负荷预测模型后续更新计划
前言
电力能源是目前人类离不开的能源,但是电力能源又是一个不容易储存的能源,中国目前的电力能源大部分都是由火力进行发电的;一个地区的电力能源消耗随着时间的变化而变化;如果发电量低于人们的用电量,就会导致电压不稳的同时很多人也用不上电,如果发电量高于人们的用电量时,由于电力能源的不易储存性,就会导致电力能源白白的浪费。因此如果可以对未来用电量有一个精准的用电量的预测,可以大大避免电力能源的浪费的同时也可以维护电力系统的稳定。
在上述的背景下,电力负荷预测一直是一个比较火热的科研课题;在目前深度学习技术高速发展下,大量的深度学习神经网络模型被应用到电力负荷预测中,同时也取得了比较好的预测结果。电力负荷预测任务可以分为单特征预测和多特征预测,单特征预测利用的是电力负荷数据去预测电力负荷数据,多特征预测利用的是影响电力负荷的影响因素和电力负荷数据去预测电力负荷数据。
本文主要利用深度学习中的BP神经网络、RNN、LSTM神经网络、CNN-LSTM神经网络进行单特征电力负荷预测,并进行模型的对比。
一、单特征电力负荷数据分析
1.1、数据展示
关于单特征的电力负荷预测深度学习实验数据集如下所示:
具体数据可以去我的课程去获取:
[手把手教学]基于BP神经网络单特征用电负荷预测
[手把手教学]基于RNN、LSTM神经网络单特征用电负荷预测
[手把手教学]基于CNN-LSTM神经网络单特征用电负荷预测
该数据为2014年某地区一年的数据,数据的采样点为15分钟一采样,那么一天就是一共有96个采样点。因此上述的数据一共有365行,96列的数据,每一行分别对应其中一天的电力负荷数据,每一列分别对应其中某一采样点的电力负荷数据。由于是单特征电力负荷预测的研究,数据中除了电力负荷数据没有别的特征。
1.2、分析电力负荷中的规律
如下图所示,是某地区2014年的一整年的电力负荷数据展示图。
从图中可以看出,在2月的时候,该地区的用电量处于一个整个年度最低的状况。同时从6月份到9月份整体的用电量处于一个比较高的水平,这可能是和天气有关,这段时间的天气比较炎热导致用电量比较高。
同时仔细观察图中的用电量,貌似处在一共上下波动反复循环的状态,从生活的常识来看,用电量和人们的作息有很强的相关性的。因此下面来具体看看周电力负荷图是什么样子的。
如上图所示,将该地区的周电力负荷值用图的形式展示出来;从图中可以看出,工作日周一到周五的用电量要比休息日周六和周日所用的点峰值要高,这可能说明电力能源很多是被投入到工作中。同时图中的用电负荷波形处于一种循环的状态,这很显然说明用电量和人的作息有着很强的相关性;当人们休息的时候保持着一种很低的用电状态,当人们工作生活时电力能源的消耗处于一种很高的状态;并且这样的状态不断反复循环。
二、基于BP神经网络单特征电力负荷预测
2.1、BP神经网络模型应用于单特征电力负荷预测
单特征电力负荷预测本质上是回归任务,也就是最终神经网络的输出值是连续的不确定值。
在神经网络中输入的数据称之为特征,一般是用X来表示,神经网络的输出一般用y来表示;同时回归预测任务为监督学习任务,数据有对应的标签,该标签为神经网络的正确答案,一般用Y来表示。神经网络的输出y和标签Y之间有一定的误差,利用这个误差可以进行神经网络的反向传播,利用反向传播使神经网络输出的y和Y之间的误差不断减小直到接近于0。
上述就是单特征负荷预测模型不断从数据中学习到有用的信息从而使模型最终预测结果接近真实值,在单特征负荷预测的任务中电力负荷数据即使输入特征X,也是数据的真实标签Y,并且输入有且只有电力负荷数据,相比较的还有多特征电力负荷预测任务,此时的输入特征就不仅仅还有电力负荷数据了,还可能还有影响电力负荷的影响因素。
下面我们整体看看BP神经网络怎么利用电力负荷数据进行电力负荷预测任务的。在该任务中BP神经网络模型的结构如下所示:
如上图所示是BP神经网络进行单特征电力负荷预测的模型图,从图中可以看出BP神经网络的输入只只含有电力负荷值,神经网络含有两层隐藏层,通过隐藏层的计算最终通过输出层输出神经网络输出值。该值为电力负荷的预测值。
2.2、 数据预处理与数据集划分
如下是单特征电力负荷预测数据集的预处理与划分部分:
# 获取前80%作为数据的训练集80%到90%作为验证集
# 划分训练集和验证集
train = dataset.iloc[0:int(len(a)*0.8), [0]]
val = dataset.iloc[int(len(a)*0.8):int(len(a)*0.9), [0]]
# 进行数据归一化,将数据归一化到0-1之间
scaler = MinMaxScaler(feature_range=(0, 1))
train = scaler.fit_transform(train)
val = scaler.fit_transform(val)
"""
进行训练集数据特征和对应标签的划分,其中前面96个采样点中的负荷特征
来预测第97个点的电力负荷值。
"""
# 设置训练集的特征列表和对应标签列表
x_train = []
y_train = []
# 将前96个采样点的天气特征和电价特征和负荷特征作为训练特征添加到列表中
# 按照上述规律不断滑动取值
for i in np.arange(96, len(train)):
x_train.append(train[i - 96:i, :])
y_train.append(train[i])
# 将训练集由list格式变为array格式
x_train, y_train = np.array(x_train), np.array(y_train)
x_train, y_train = np.reshape(x_train, (x_train.shape[0], 96)), np.reshape(y_train, (y_train.shape[0], 1))
# print(x_train.shape)
# print(y_train.shape)
# 设置训练集的特征列表和对应标签列表
x_val = []
y_val = []
# 将前48个采样点的天气特征和电价特征和负荷特征作为训练特征添加到列表中
# 按照上述规律不断滑动取值
for i in np.arange(96, len(val)):
x_val.append(val[i - 96:i, :])
y_val.append(val[i])
# 将训练集由list格式变为array格式
x_val, y_val = np.array(x_val), np.array(y_val)
x_val, y_val = np.reshape(x_val, (x_val.shape[0], 96)), np.reshape(y_val, (y_val.shape[0], 1))
首先对获取的数据进行归一化的处理,数据中的数往往会比较大会使时间网络的计算比较慢,因此在进行数据预测的时候第一步就是对其进行归一化预处理,将所有的特征归一化到0-1之间。由于该实验数据是15分钟一个采样点,也就是一天96个采样点,那么在设置神经网络的输入和标签的时候,设置利用数据的前1-96个采样点来预测第97个点,2-97个采样点来预测第98个点,按照上述的规律不断滚动下去。
同时设置训练集和验证集对应的特征和标签的列表用来装对应的数据和标签,方便后续神经网络可以利用数据特征进行学习,在利用前向传播输出值和真实标签计算出来的误差进行反向传播更新神经网络的权重参数,从而使神经网络从数据中不断学习到有用信息。
2.3、模型搭建
如下是利用深度学习框架搭建的BP神经网络模型:
# 利用keras搭建BP神经网络,该网络隐藏层一共有两层,神经元分别为10
model = Sequential()
model.add(Dense(10, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(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_val, y_val))
# 保存训练好的模型
model.save('BP_model.h5')
此时BP神经网络已经搭建完毕,此时可以利用划分好的训练集进行神经网络的训练了 。
如下为BP电力负荷网络训练的过程,从下图可以看到神经网络的训练集和验证集的loss在不断的下降,很显然神经网络模型在不断的收敛。具体看一下BP神经网络的最终的loss值对比图如下所示:
如上图所示,该图记录了BP神经网络30轮训练过程中的训练集和验证集的loss值,很显然在20轮以后该神经网络模型就已经收敛。
2.4、模型预测
从项目文件夹中可以看到已经产生保存训练好的模型文件,利用该模型参数文件可以直接对输入数据特征进行模型推理,产生的模型文件如下图所示:
此时可以利用训练好的模型对测试进行测试,并对预测出来的预测值进行反归一化处理。具体代码如下所示:
# 导入训练好的模型权重文件
model = load_model("BP_model.h5")
# 测试集输入模型进行预测
predicted = model.predict(x_test)
# print(predicted.shape)
# print(test.shape)
# 将真实值标签进行反归一化操作,方便后续和真实值进行对比
real = scaler.inverse_transform(test[96:])
# 将模型预测出的值进行反归一化操作
prediction = scaler.inverse_transform(predicted)
将预测值和真实的标签进行对比,并绘制如下的预测值和真实值的对比图。
从上图对比可以发现,BP神经网络对电力负荷预测是有一定的效果的,但是可以看出在峰值和峰谷的预测和真实值是有一定的误差的。具体可以利用模型的评价指标对模型进行评价。
# 计算模型的评价指标
R2 = r2_score(real, prediction)
MAE = mean_absolute_error(real, prediction)
RMSE = np.sqrt(mean_squared_error(real, prediction))
MAPE = np.mean(np.abs((real-prediction) / prediction))
# 打印模型的评价指标
print('R2:', R2)
print('MAE:', MAE)
print('RMSE:', RMSE)
print('MAPE:', MAPE)
具体的评价指标计算如下:
更加详细的讲解和完整代码可以去我的课程去获取:
[手把手教学]基于BP神经网络单特征用电负荷预测
[手把手教学]基于RNN、LSTM神经网络单特征用电负荷预测
[手把手教学]基于CNN-LSTM神经网络单特征用电负荷预测
三、基于RNN、LSTM神经网络单特征电力负荷预测
3.1、RNN、LSTM神经网络模型应用于单特征电力负荷预测
在文章中已经很详细的讲解了RNN/LSTM神经网络模型的原理了有不懂的可以具体看看这篇文章深度学习原理-----循环神经网络(RNN、LSTM),同时也可以去看看我录制的课程,里面很详细的对这个模型进行了讲解。
[手把手教学]基于BP神经网络单特征用电负荷预测
[手把手教学]基于RNN、LSTM神经网络单特征用电负荷预测
[手把手教学]基于CNN-LSTM神经网络单特征用电负荷预测
现在我们已经知道了RNN神经网络的模型和LSTM神经网络的模型可以用如下的图表示:
如上图所示,该图为RNN神经网络和LSTM神经网络的对比图,其中上面的图为RNN神经网络的结构图,下面的图为LSTM神经网络的结构图,很显然除了神经网络单元不一样以外,RNN神经网络和LSTM神经网络基本是一样的。那么下面就以LSTM神经网络为例来看看LSTM神经网络怎么进行单特征电力负荷预测任务的。
如上图所示,展示了多特征电力负荷数据如何输入到LSTM神经网络中;这里要强调一点,这个图不能从整体上看,而是应该从左往右看,也就是有先后顺序的。图中绘制了3个时间步的数据输入。
首先输入t-1时刻的电力负荷数据值进行LSTM神经网络单元的计算,计算出来的值分别送到两个地方,第一个作为该神经网络隐层的输出到下一层去,第二个作为下一个时间步的输入;因此在t时间输入的数据为该时刻电力负荷数据同时还有上一时刻时间步的输出结果,因此t的时刻的输入包好前面时刻的信息。t时刻的输出和t-1时刻一样有两个输出。而t+1时刻的计算和t时刻的计算是一样的,因此按照上述的规律不断计算直至设置的最后的一个时刻计算结束。
本文的数据是15分钟一个采样点,也就是一天将会采样96个点。由于前面分析过电力负荷数据是随着人的作息而成周期性变化的,因而在单特征电力负荷预测中取前面96个采样点负荷数据作为模型的输入特征来预测第97个采样点的电力负荷数据;以此为规律不断的滚动下去。
因此在此实验中,LSTM神经网络要不断循环计算96个时间步直至最终的预测值输出。这里要强调一下,计算96个时间步不是说上述的计算单元有96个,而是同样的一个单元不断重复计算96次,因此这样的神经网络又称之为循环神经网络。同理RNN神经网络和LSTM神经网络的计算过程是一样的。
3.2、数据预处理与数据集划分
如下是电力负荷预测数据集的预处理与划分部分:
# 进行数据归一化,将数据归一化到0-1之间
scaler = MinMaxScaler(feature_range=(0, 1))
train = scaler.fit_transform(train)
val = scaler.fit_transform(val)
"""
进行训练集数据特征和对应标签的划分,其中前面96个采样点中的负荷特征
来预测第97个点的电力负荷值。
"""
# 设置训练集的特征列表和对应标签列表
x_train = []
y_train = []
# 将前96个采样点的天气特征和电价特征和负荷特征作为训练特征添加到列表中
# 按照上述规律不断滑动取值
for i in np.arange(96, len(train)):
x_train.append(train[i - 96:i, :])
y_train.append(train[i])
# 将训练集由list格式变为array格式
x_train, y_train = np.array(x_train), np.array(y_train)
# 设置训练集的特征列表和对应标签列表
x_val = []
y_val = []
# 将前96个采样点的天气特征和电价特征和负荷特征作为训练特征添加到列表中
# 按照上述规律不断滑动取值
for i in np.arange(96, len(val)):
x_val.append(val[i - 96:i, :])
y_val.append(val[i])
# 将训练集由list格式变为array格式
x_val, y_val = np.array(x_val), np.array(y_val)
如上是LSTM神经网络模型的数据预处理和训练集和验证集的划分部分,和前面的BP神经网络数据集的预处理一样,数据在拿到手后一定要进行数据的归一化处理,这一步加速了神经网络的参数更新的同时也有利于提高神经网络的预测精度。
这里要强调一下,RNN和LSTM等循环神经网络输出网络模型的数据的格式是[样本数,时间步,特征数量];样本数量很好理解,就是训练集一共有多少样本;时间步就是循环神经网络一共要循环多少次计算,例如本案例的实验是利用前面96个时间步的影响因素和负荷数据作为特征来预测第97个点的数据,那么循环神经网络就需要循环计算96次,每次计算一个时间步的特征数据;特征数据也很好理解,在本实验中的特征就是负荷,(这里需要注意的是电力负荷数据既是特征又是标签)。因此我们来看看最终制作的数据集的数据维度为:
显然训练集的样本有27936个,时间步为96,特征为1;显然验证集的样本有3408个,时间步为96,特征为1。
3.3、模型搭建
如下是利用深度学习框架搭建的RNN神经网络模型:
# 利用keras搭建RNN神经网络,该网络隐藏层一共有两层,神经元分别为10
model = Sequential()
model.add(SimpleRNN(10, return_sequences=True, activation='relu'))
model.add(SimpleRNN(10, return_sequences=False, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(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_val, y_val))
# 保存训练好的模型
model.save('RNN_model.h5')
如下是利用深度学习框架搭建的LSTM神经网络模型:
# 利用keras搭建LSTM神经网络,该网络隐藏层一共有两层,神经元分别为10
model = Sequential()
model.add(LSTM(10, return_sequences=True, activation='relu'))
model.add(LSTM(10, return_sequences=False, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(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_val, y_val))
# 保存训练好的模型
model.save('LSTM_model.h5')
下面利用LSTM神经网络作为例子进行讲解。LSTM神经网络训练的过程如下图所示,可以看到loss值在不断的下降,模型训练完毕后,模型的loss值如下所示:
很显然该网络在5轮左右的时候就已经接近收敛,相对于BP神经网络来说,收敛的更快。
3.4、模型预测
模型训练完了以后保存训练好的模型,利用该模型参数文件可以直接对输入数据特征进行模型推理,产生的模型参数如下:
此时可以利用训练好的模型对测试进行测试,并对预测出来的预测值进行反归一化处理。具体代码如下所示:
model = load_model("LSTM_model.h5")
# 测试集输入模型进行预测
predicted = model.predict(x_test)
# print(predicted.shape)
# print(test.shape)
# 将真实值标签进行反归一化操作,方便后续和真实值进行对比
real = scaler.inverse_transform(test[96:])
# 将模型预测出的值进行反归一化操作
prediction = scaler.inverse_transform(predicted)
将预测值和真实的标签进行对比,并绘制如下的预测值和真实值的对比图。
从上图对比可以发现,LSTM神经网络对电力负荷预测的效果是很不错的,具体可以利用模型的评价指标对模型进行评价。
# 计算模型的评价指标
R2 = r2_score(real, prediction)
MAE = mean_absolute_error(real, prediction)
RMSE = np.sqrt(mean_squared_error(real, prediction))
MAPE = np.mean(np.abs((real-prediction) / prediction))
# 打印模型的评价指标
print('R2:', R2)
print('MAE:', MAE)
print('RMSE:', RMSE)
print('MAPE:', MAPE)
具体的评价指标计算如下
更加详细的讲解和完整代码可以去我的课程去获取:
[手把手教学]基于BP神经网络单特征用电负荷预测
[手把手教学]基于RNN、LSTM神经网络单特征用电负荷预测
[手把手教学]基于CNN-LSTM神经网络单特征用电负荷预测
四、基于CNN-LSTM神经网络单特征电力负荷预测
4.1、CNN-LSTM神经网络模型应用于多特征电力负荷预测
相比较单一的神经网络模型,在有些场景下往往组合模型的效果要优于单一模型的效果,因为组合模型往往存在着模型优势互补的情况。CNN-LSTM网络模型是该系列讲解的第一个组合神经网络模型。从神经网络模型的名字就不难发现,该神经网络模型是由CNN神经网络和LSTM神经网络进行组合对电力负荷数据进行学习预测的。但是这里要强调一下,这里使用的CNN神经网络是一维卷积神经网络;而大家在深度学习的学习过程中接触到的卷积神经网络基本上是2维卷积神经网络,因为相比较其他的神经网络而言,二维卷积神经网络在图像的特征提取上效果的确要优于其他的神经网络;但是本文是利用组合神经网络模型对电力负荷数据进行特征的提取,由上面的分析可以知道电力负荷数据是一个典型的时间序列模型的数据。因此可以利用一维卷积神经网络进行时间序列数据的提取。在学习一维卷积神经网络之前建议学习一下二维卷积神经网络深度学习原理-----卷积神经网络 ,这里有我写的相关文章和对应的视频课程。
[手把手教学]基于BP神经网络单特征用电负荷预测
[手把手教学]基于RNN、LSTM神经网络单特征用电负荷预测
[手把手教学]基于CNN-LSTM神经网络单特征用电负荷预测
4.1.1、一维卷积运算
相对于二维卷积运算在整个特征图上进行左右上下滑动进行卷积运算,一维卷积运算只在数据特征H上进行不断的滑动进行卷积运算。具体如图所示。
如上图所示,假设此时的数据的维度为H×W(当然在单特征电力负荷预测任务中,由于数据的输入只有负荷一个特征,此时数据的维度往往为H×1),那么此时只要设定卷积核的高就行,如图所示,设卷积核的高为3,那么该卷积核的维度大小一定为3×W,因为一维卷积运算只进行一个方向的滑动;当然该卷积运算也可以在设定步幅等二维卷积运算有的操作。利用设定好的卷积核在数据特征上进行不断滑动,卷积核和对应的感受野进行对应因素相乘最后求和。不断重复操作直到不能再往下滑动为止。具体的操作如上图所示。
当然进行一维卷积的数据不一定是单通道的数据,该数据可能有多个通道,同时希望人为设定经过卷积运算输出数据的通道,具体计算如下图所示:
如上图所示,假设输入数据的维度大小为H×W×C;那么此时对应的卷积核的通道数量一定为C,同时一维卷积运算的卷积核的宽一定要和特征图的宽一样,那么卷积核的宽也为W;同时设定卷积核的高为FH,那么卷积核的维度为FH×W×C;如果想设定输出数据的通道数量,那么就要设定卷积核的数量;假设希望输出的数据的通道大小为FN,那么就要设定卷积核的数量为FN个。因此通过计算最终输出的数据的维度为OH×1×FN。
4.1.2、一维池化运算
(1)最大池化
最大池化,就是对选定的区域选取最大值,具体和二维池化操作一样,具体如下图所示:
(2)平均池化
平均池化,就是对选定的区域选取平均值,具体和二维池化操作一样,具体如下图所示:
4.2、CNN-LSTM模型应用于多影响因素电力负荷预测
经过如上的一维卷积运算和池化运行的分析以后搭建如下图所示的CNN-LSTM的组合神经网络模型。
由图可知,该神经网络的网络的输入是单特征的电力负荷数据,数据是15分钟一采样,那么就是一天的采样是96个时间点,电力负荷数据是典型的时间序列数据,前面的数据时间的数据对后面数据有着一定的影响,因此输入前面96个采样点的数据作为神经网络的输入。
首先对数据进行一维卷积运算,由前面可知一维卷积运算后的数据是一个N×1维度的数据,图中利用7个卷积核进行一维卷积算法,因此得出的7个N×1维的数据;也就是得到一个数据通道数为7,长和宽为N×1的数据。
然后对卷积完的数据进行一维池化运算,不管是二维池化还是一维池化,进行池化运算后的数据通道数是不变的。经过一维池化运算后的数据的长比原来小了(当然也可能不变或者变大,具体要看池化运算的具体参数值)。经过池化运算后的数据也是可以再进行一维卷积运算的,但是为了方便观察整体的结构,本文的模型就画了一个卷积和一个池化运算。
最后将经过卷积神经网络提取出来的特征结构输入到LSTM神经网络中,由LSTM神经网络对其进行时间序列信息的学习。并在神经网络结构最后接入全连接神经网络层,由全连接神经网络对前面提取和学习到特征进行预测,最终输出预测值。
4.3、数据预处理与数据集划分
如下是电力负荷预测数据集的预处理与划分部分:
# 进行数据归一化,将数据归一化到0-1之间
scaler = MinMaxScaler(feature_range=(0, 1))
train = scaler.fit_transform(train)
val = scaler.fit_transform(val)
"""
进行训练集数据特征和对应标签的划分,其中前面96个采样点中负荷特征
来预测第97个点的电力负荷值。
"""
# 设置训练集的特征列表和对应标签列表
x_train = []
y_train = []
# 将前96个采样点的天气特征和电价特征和负荷特征作为训练特征添加到列表中
# 按照上述规律不断滑动取值
for i in np.arange(96, len(train)):
x_train.append(train[i - 96:i, :])
y_train.append(train[i])
# 将训练集由list格式变为array格式
x_train, y_train = np.array(x_train), np.array(y_train)
# print(x_train.shape)
# print(y_train.shape)
# 设置训练集的特征列表和对应标签列表
x_val = []
y_val = []
# 将前48个采样点的天气特征和电价特征和负荷特征作为训练特征添加到列表中
# 按照上述规律不断滑动取值
for i in np.arange(96, len(val)):
x_val.append(val[i - 96:i, :])
y_val.append(val[i])
# 将训练集由list格式变为array格式
x_val, y_val = np.array(x_val), np.array(y_val)
4.4、模型搭建
如下是利用深度学习框架搭建的CNN-LSTM神经网络模型:
# 利用keras搭建RNN神经网络,该网络隐藏层一共有两层,神经元分别为10
model = Sequential()
model.add(Conv1D(filters=32, kernel_size=3, strides=1, padding="same", activation="relu"))
model.add(MaxPooling1D(pool_size=2, strides=1, padding="same"))
model.add(Conv1D(filters=64, kernel_size=2, strides=1, padding="same", activation="relu"))
model.add(MaxPooling1D(pool_size=3, strides=1, padding="same"))
model.add(LSTM(10, return_sequences=True, activation='relu'))
model.add(LSTM(10, return_sequences=False, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(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_val, y_val))
# 保存训练好的模型
model.save('CNN_LSTM_model.h5')
如下图所示为CNN-LSTM神经网络的loss值图,从图中可以看出,神经网络的loss值下降很快。说明该网络收敛很快。
4.5、模型预测
模型训练完了以后保存训练好的模型,利用该模型参数文件可以直接对输入数据特征进行模型推理,产生的模型参数如下:
此时可以利用训练好的模型对测试进行测试,并对预测出来的预测值进行反归一化处理。具体代码如下所示:
model = load_model("CNN_LSTM_model.h5")
# 测试集输入模型进行预测
predicted = model.predict(x_test)
# print(predicted.shape)
# print(test.shape)
# 将真实值标签进行反归一化操作,方便后续和真实值进行对比
real = scaler.inverse_transform(test[96:])
# 将模型预测出的值进行反归一化操作
prediction = scaler.inverse_transform(predicted)
将预测值和真实的标签进行对比,并绘制如下的预测值和真实值的对比图。
从上图对比可以发现,CNN-LSTM神经网络对电力负荷预测的也还是可以的,具体可以利用模型的评价指标对模型进行评价。
具体的评价指标代码如下:
# 计算模型的评价指标
R2 = r2_score(real, prediction)
MAE = mean_absolute_error(real, prediction)
RMSE = np.sqrt(mean_squared_error(real, prediction))
MAPE = np.mean(np.abs((real-prediction) / prediction))
# 打印模型的评价指标
print('R2:', R2)
print('MAE:', MAE)
print('RMSE:', RMSE)
print('MAPE:', MAPE)
具体的评价指标计算如下:
更加详细的讲解和完整代码可以去我的课程去获取:
[手把手教学]基于BP神经网络单特征用电负荷预测
[手把手教学]基于RNN、LSTM神经网络单特征用电负荷预测
[手把手教学]基于CNN-LSTM神经网络单特征用电负荷预测
五、单特征电力负荷预测模型对比分析总结
我们已经搭建好BP、LSTM、CNN-LSTM神经网络,并利用测试集对其进行测试了,同时也计算出来对应模型的评价指标的指数,下面利用这样的评价指标的值对上述搭建的神经网络模型进行分析。具体的评价指标的值入下表所示:
模型/评标 | R2 | MAE | RMSE | MAPE |
---|---|---|---|---|
BP | 0.976 | 186.134 | 231.039 | 0.0208 |
LSTM | 0.995 | 80.457 | 108.091 | 0.011 |
CNN-LSTM | 0.994 | 91.2 | 118.535 | 0.013 |
如上表所示,是本文利用BP、LSTM、CNN-LSTM神经网络对多特征电力负荷预测的评价指标;其中评价指标有R2、MAE、RMSE、MAPE;R2是值越接近1越好,而MAE、RMSE、MAPE三个评价指标是越接近0越好;从表中可以得出,LSTM效果最好、CNN-LSTM效果要次之、BP的效果最差,分析可得出如下的结论:
1、本文的数据量比较充足,因此最终三个算法模型在效果上其实都是很不错的。可以很好的预测出电力负荷数值。
2、从大量的论文来看,最终证明CNN-LSTM的效果是比LSTM效果好的,但是本文得出的效果是LSTM效果好,其中原因有如下可能:
(1)本文中的LSTM和CNN-LSTM的模型参数没有经过调参,因此不一定是最优模型。
(2)本文并没有在大量的实验下进行统计,只是做了一两次实验得出来的实验结果,可能具有偶然性。
(3)本文的数据是比较充足的,是否在数据比较少的情况下才可以显现出CNN-LSTM模型的优越性。
(4)虽然CNN-LSTM的模型效果要比LSTM差,不管是从模型的预测图还是模型的评价指标看,其实两个模型直接的差别是很小的;因此是否在LSTM模型效果不好的情况下用CNN-LSTM效果会比较好。
六、电力负荷预测模型后续更新计划
以下的相关算法的电力负荷预测模型相关文章和教学视频预计在23年年底全部更新完毕,如果有想继续学习电力负荷预测,或者需要毕设的可以关注我(或者+q)1343077375,同时将该文章收藏,我会持续不断的更新相关的文章和教学视频。
6.1、基于BP、LSTM、CNN-LSTM神经网络算法的单特征用电负荷预测(完结)
6.2、基于BP、RNN、LSTM、CNN-LSTM算法多特征用电负荷预测
6.3、基于贝叶斯优化的BP、RNN、LSTM、CNN-LSTM算法电力负荷预测
6.4、基于粒子群算法优化的BP、RNN、LSTM、CNN-LSTM算法电力负荷预测
6.5、基于蚁群算法优化的BP、RNN、LSTM、CNN-LSTM算法电力负荷预测
6.6、基于遗传算法优化的BP、RNN、LSTM、CNN-LSTM算法电力负荷预测
6.7、基于狼群算法优化的BP、RNN、LSTM、CNN-LSTM算法电力负荷预测
6.8、基于狼群算法优化的BP、RNN、LSTM、CNN-LSTM算法电力负荷预测
6.9、基于注意力机制的BP、RNN、LSTM、CNN-LSTM算法电力负荷预测
6.10、基于transformer算法电力负荷预测