[时间序列预测]基于BP、LSTM、CNN-LSTM神经网络算法的单特征用电负荷预测[保姆级手把手教学]

news2024/11/19 0:23:28

系列文章目录

深度学习原理-----线性回归+梯度下降法
深度学习原理-----逻辑回归算法
深度学习原理-----全连接神经网络
深度学习原理-----卷积神经网络
深度学习原理-----循环神经网络(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神经网络,并利用测试集对其进行测试了,同时也计算出来对应模型的评价指标的指数,下面利用这样的评价指标的值对上述搭建的神经网络模型进行分析。具体的评价指标的值入下表所示:

模型/评标R2MAERMSEMAPE
BP0.976186.134231.0390.0208
LSTM0.99580.457108.0910.011
CNN-LSTM0.99491.2118.5350.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算法电力负荷预测

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安卓开发Android studio学习笔记14:用户注册登录(案例演示)

Android studio学习笔记第一步:配置activity_information.xml第二步:配置activity_registration.xml第三步:配置strings.xml第四步:配置InformationActivity第五步:配置RegistrationActivity第六步:运行结果…

二叉搜索树

文章目录二叉搜索树1. 概念2. 模拟实现二叉搜索树2.1 准备工作 创建类2.2 查找方法2.3 插入方法2.4 删除方法3. 性能分析二叉搜索树 前言 : 1. 概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不…

学点高端技术:基于密度的聚类算法——FDBSCAN算法

机器学习、人工智能各类KNN算法层出不穷,DBSCAN具有强代表性,它是一个基于密度的聚类算法,最大的优点是能够把高密度区域划分为簇,能够在高噪声的条件下实现对目标的精准识别,但该算法当前已远不能满足人们对于高效率、…

零基础自学javase黑马课程第二天

零基础自学javase黑马课程第二天 ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csdn首发! 😘系列专栏:java学习 💻首发时间:🎞2022年10月16日&#…

【电子技术基础(精华版)】直流稳压电路

前期我们了解了一些关于直流稳压电源的基础知识,为了更好地完善职教高考电子技术专业的需求,接下来我会更新【电子技术基础(精华版)】,从中可以让更多的职教高考生有效地复习。 由于本人是山东省的一位博主&#xff0…

3、SySeVR测试(上)

一、准备 1、将测试代码放在/home/test目录下; 2、将测试数据导入joern 在/home/SySeVR/joern-0.3.1查看是否存在.joernIndex文件,有的话,需要删除。 删除之后,将测试数据导入joern: java -jar /home/SySeVR/joern-0.3.1/bin/jo…

程序员的中年危机:那些能工作到45、50、60的程序员们,究竟具备了哪些能力?

程序员行业新技术发展迅猛,可以说是日新月异。也正是这个原因,中年危机成为我们必须面对和攻克的问题。 思考一个问题:那些能工作到45、50、甚至60的程序员们,究竟具备了哪些过人的能力? 就我过去的经历和观察来说&a…

A comprehensive overview of knowledge graph completion

摘要 知识图(KG)以其代表和管理海量知识的独特优势,为各种下游知识感知任务(如推荐和智能问答)提供了高质量的结构化知识。KGs的质量和完整性在很大程度上决定了下游任务的有效性。但由于知识产权制度的不完备性,知识产权制度中仍有大量有价值的知识缺失…

【《机器人技术》复习】

【《机器人技术》复习】1. 要求:2. 机械手运动解算问题2.1 自由度考点2.2 运动学方程2.3 动力学方程2.4 传感器2.5 编程题1. 要求: 本次大作业上交截止时间 之前,超时,本门课程判定不及格。 作业上交的格式如下 一律以 WORD 文档…

2022年江西省职业院校技能大赛“网络空间安全”比赛任务书

2022年江西省职业院校技能大赛“网络空间安全” 比赛任务书 一、竞赛时间 总计:360分钟 竞赛阶段竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略配置 A-3 流量完整性保护 A-4 事件监控 A-5 …

求交叉链表头结点-面试必备

这里分享一下一个交叉链表的关键题目,觉得不错的小伙伴别忘了点赞支持 交叉链表无环链表思路代码有环链表思路代码总结无环链表 已知有两个链表(无环)相交,求出相交的头结点 思路 因为链表相交,所以最后一部分一定重…

每天五分钟机器学习:常用的参数寻优方法——k折交叉验证

本文重点 本文我们介绍一种常用的参数寻优方法--k折交叉验证,现在的数据集一般分为三类,分别为训练集,验证集,测试集。训练集用于训练模型,验证集用于调参,测试集用于测试调参之后的模型效果。 但是很多时…

SpringBoot+Vue实现前后端分离社区疫苗接种管理系统

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JDK版…

xray和burp联动

目录 xray下载安装CT Stack 安全社区 Burp和xray联动 xray下载安装下载地址:CT Stack 安全社区 先通过PowerShell打开xray所在的目录,运行,生成yaml文件 genca在目录下生成证书 生产证书后将证书导入浏览器 导入后在本地安装一下 Burp和xray…

WebdriverIO – 完整的初学者课程2022

WebdriverIO – 完整的初学者课程2022 从零开始学习和使用 JavaScript 实现 Webdriver IO!构建功能齐全的 Web 测试自动化框架 课程英文名:WebdriverIO - Complete Beginner Course 2022 此视频教程共1.0小时,中英双语字幕,画质…

SD-WAN不断冲击传统WAN架构

随着全球化数字信息转型,网络结构也是在不断的发展和完善。随着云时代的到来,传统的网络布局的局限性开始凸显出来。在过去几年广域网最重要的变化是软件定义广域网技术 (SD-WAN) 的广泛部署,它改变了网络专业人员优化和保护广域网连接的方式…

python基于PHP+MySQL的大学生宿舍管理系统

大学宿舍管理系统是信息时代的产物,它是学校宿管部门的一个好帮手。有了它不再需要繁重的纸质登记,有了它宿管员不在需要繁重的工作,一些公寓信息和住宿等基本信息可以由管理人员及时的对信息进行查询、更新、修改和删除,方便简易,且时效性高 基于PHP大学生宿舍管理系统采用当前…

年薪50w+的软件测试工程师是怎么炼成的?

随着互联网行业的迅速发展,软件测试工程师的地位越来越高,公司招聘时的薪资也越来越高,那么市场上为什么还有大量的软件测试工程师薪资只有5-6k呢?因为他们有一个共同的弱点,就是只会手工测试!!…

Python编程运算符 比较运算符

作者简介:一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.比较运算符 二.比较运算符使用 (1)等于 &…

操作系统之保护模式

保护模式保护模式概述初见保护模式保护模式之寄存器扩展保护模式之寻址扩展全局描述符表段描述符全局描述符GDT,局部描述符LDT级选择子保护模式的开关,CR0寄存器的PE位进入保护模式保护模式概述 ** 问题1:为什么会有保护模式** 实模式下操作…