上一遍博客简单的介绍了LSTM神经网络的工作原理,

有兴趣的打开了解一下:


显目介绍:

一、问题背景 电力系统负荷(电力需求量,即有功功率)预测是指充分考虑历史的系统负荷、经济 状况、气象条件和社会事件等因素的影响,对未来一段时间的系统负荷做出预测。负荷预 测是电力系统规划与调度的一项重要内容。短期(两周以内)预测是电网内部机组启停、 调度和运营计划制定的基础;中期(未来数月)预测可为保障企业生产和社会生活用电, 合理安排电网的运营与检修决策提供支持;长期(未来数年)预测可为电网改造、扩建等 计划的制定提供参考,以提高电力系统的经济效益和社会效益。 复杂多变的气象条件和社会事件等不确定因素都会对电力系统负荷造成一定的影响, 使得传统负荷预测模型的应用存在一定的局限性。同时,随着电力系统负荷结构的多元 化,也使得模型应用的效果有所降低,因此电力系统负荷预测问题亟待进一步研究。

二、解决问题

1.地区负荷的中短期预测分析 根据附件中提供的某地区电网间隔 15 分钟的负荷数据,建立中短期负荷预测模型:

(1)给出该地区电网未来 10 天间隔 15 分钟的负荷预测结果,并分析其预测精度;

(2)给出该地区电网未来 3 个月日负荷的最大值和最小值预测结果,以及相应达到负 荷最大值和最小值的时间,并分析其预测精度。

2.行业负荷的中期预测分析 对不同行业的用电负荷进行中期预测分析,能够为电网运营与调度决策提供重要依 据。特别是在新冠疫情、国家“双碳”目标等背景下,通过对大工业、非普工业、普通工 业和商业等行业的用电负荷进行预测,有助于掌握各行业的生产和经营状况、复工复产和 后续发展走势,进而指导和辅助行业的发展决策。请根据附件中提供的各行业每天用电负 荷相关数据,建立数学模型研究下面问题:

(1)挖掘分析各行业用电负荷突变的时间、量级和可能的原因。
(2)给出该地区各行业未来 3 个月日负荷最大值和最小值的预测结果,并对其预测精 度做出分析。 (3)根据各行业的实际情况,研究国家“双碳”目标对各行业未来用电负荷可能产生 的影响,并对相关行业提出有针对性的建议。

数据说明:

⚫ 附件 1 提供了某地区电网 2018 年 1 月 1 日至 2021 年 8 月 31 日间隔 15 分钟的电力系 统负荷数据,具体数据结构示例如下

lstm神经网络 准确率 lstm神经网络算法_lstm

⚫ 附件 2 提供了该地区四个行业 2019 年 1 月 1 日至 2021 年 8 月 31 日用电日负荷最大 值和最小值数据,具体数据结构示例如下:

lstm神经网络 准确率 lstm神经网络算法_数据_02

 ⚫ 附件 3 提供了该地区 2018 年 1 月 1 日至 2021 年 8 月 31 日主要的气象数据,具体数 据结构示例如下

lstm神经网络 准确率 lstm神经网络算法_数据_03

 注:数据来源泰迪数据挖掘赛

 先上数据(这里上两份数据 1是经过清洗过的数据 2是原数据)

原数据:

链接:https://pan.baidu.com/s/1xVD024sTkXgFm8wBom-MeA 
提取码:mzyn

直接使用到模型数据:

链接:https://pan.baidu.com/s/1aVU6v9h99193cgoEX8Jz2w 
提取码:ownp

这里只展示LSTM 模型 当时做的时候我也做了lightgbm、catboost、xgboost、以及三个模型的融合模型 这些后续整理好也会发出来

先导入所需要的模块

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
import datetime

数据预处理

x = data[[ '最高温度', '最低温度', '白天风力风向', '夜晚风力风向',
       '白天风力风向1', '夜晚风力风向1', '天气1', '天气2', '月', '天', '小时', '一年第几天', '一年第几周',
       '一周第几天', '是否节假日', '季节']]

y = data['总有功功率(kw)']


y=np.array(y).reshape(-1,1)
#x归一
x = MinMaxScaler().fit_transform(x)
#y归一
mm = MinMaxScaler().fit(y)
y = mm.transform(y)

time_stamp = 50
train = x[0:int(len(x)*0.8)+ time_stamp]
valid = x[int(len(x)*0.8) - time_stamp:]

X_train, y_train = [], []
for i in range(len(train)-time_stamp):
    X_train.append(train[i:i+time_stamp,:])
    y_train.append(train[i, :][:])
X_train, y_train = np.array(X_train), np.array(y_train)

X_valid, y_valid = [], []
for i in range(len(valid)-time_stamp):
    X_valid.append(valid[i:i+time_stamp,:])
    y_valid.append([valid[i,:]])
X_true, y_true = np.array(X_valid), np.array(y_valid)
print(X_train.shape)
print(y_train.shape)

搭建神经网络模型(LSTM) 

#模型构建
epochs = 30
batch_size =256
from keras.models import Sequential
from keras.layers import Dropout, Dense, LSTM

staet = datetime.datetime.now()

model = Sequential()
model.add(LSTM(50,#神经元
               #input_shape=(X_train.shape[1],X_train.shape[-1]),
                input_dim=X_train.shape[-1],#特征
                input_length=X_train.shape[1],#步长
                return_sequences=True
               )
          )
model.add(Dropout(0.5))
model.add(LSTM(units=50))
model.add(Dense(16))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, verbose=1)

train_pre = model.predict(X_train)
y_pre1 = model.predict(X_true)

y_pre11=mm.inverse_transform(y_pre1)  #反归一化
train_pre=mm.inverse_transform(train_pre)  #反归一化
# yz_pre=mm.inverse_transform(yz_pre)  #反归一化
y = mm.inverse_transform(y.reshape(-1,1))
y_true = mm.inverse_transform(y_true.reshape(-1,16))
from sklearn import metrics
print('LSTM预测RMSE:', np.sqrt(metrics.mean_squared_error(y_true, y_pre11)))
print('LSTM预测MAE:', metrics.mean_absolute_error(y_true, y_pre11))
end = datetime.datetime.now()
print(end-staet)
pre = model.predict(x.loc[1345,'总有功功率'])
print(pre)

绘图

pre = model.predict(x.loc[1345,'总有功功率'])
print(pre)
print('画图')
import matplotlib.pyplot as plt
plt.figure(figsize=(500,50))
plt.plot([x for x in train_pre.flatten()],c='y')
plt.plot(y.flatten(),c='b')
plt.plot([None for _ in train_pre.flatten()]+[x for x in y_pre11.flatten()],c='r')
plt.show()
print('画图结束')