基于改进bp神经网络的短期电力负荷/风电功率预测(时间序列预测/LSTM) 负荷预测。

最近在捣鼓电力负荷预测的项目,发现传统BP神经网络处理时间序列数据总差点意思。这玩意儿训练容易卡在局部最优解,遇到风电功率这种波动大的数据更是直接躺平。不过我发现把LSTM的门控机制掺到BP里,效果居然挺能打,实测某省级电网数据误差降了18.6%。

先看数据预处理这个基本功。风电数据里的异常值处理很关键,我常用的是滑动窗口配合3σ法则。用pandas处理起来大概这样:

def sliding_window(data, window_size=24):
    X, y = [], []
    for i in range(len(data)-window_size-1):
        window = data[i:(i+window_size)]
        target = data[i+window_size]
        X.append(window)
        y.append(target)
    return np.array(X), np.array(y)

mean = train_data['load'].mean()
std = train_data['load'].std()
train_clean = train_data[(train_data['load'] > mean-3*std) & (train_data['load'] < mean+3*std)]

这里有个坑要注意:滑动窗口的步长别设太死。电网负荷数据存在明显的日周期特性,我习惯用24小时作为基础窗口,刚好覆盖完整的用电周期。处理完的数据记得做归一化,别让LSTM的tanh激活函数闹脾气。

模型结构是重头戏。传统BP的隐藏层改成LSTM层后,我在反向传播时加了个梯度裁剪。keras里实现这个骚操作只要两行代码:

from keras.layers import LSTM, Dense
from keras.optimizers import Adam

model = Sequential()
model.add(LSTM(64, input_shape=(24, 1), return_sequences=True))
model.add(LSTM(32))
model.add(Dense(1))
opt = Adam(clipvalue=0.5)  # 关键在这步
model.compile(loss='mse', optimizer=opt)

这个clipvalue参数简直是防梯度爆炸的救命稻草。实测当学习率设0.001时,不裁剪的模型训练到第5轮loss就上天了,裁剪后能稳定降到0.02左右。不过也别矫枉过正,值设太小会导致梯度消失,个人经验0.3-0.7这个区间比较安全。

训练时有个小技巧:在验证集loss连续3轮不下降时,动态调整学习率。这个比EarlyStopping灵活,避免过早终止训练。配合ReduceLROnPlateau回调使用效果更佳:

from keras.callbacks import ReduceLROnPlateau

reduce_lr = ReduceLROnPlateau(
    monitor='val_loss',
    factor=0.2,
    patience=3,
    min_lr=1e-6
)

history = model.fit(
    X_train, y_train,
    epochs=100,
    validation_split=0.2,
    callbacks=[reduce_lr],
    batch_size=32,
    verbose=0
)

实测在风电预测场景下,这种动态调整策略能让模型在20轮左右就找到较优解,比固定学习率节省40%训练时间。不过要盯着点TensorBoard,有时候学习率降得太猛会导致模型"冻住"。

最后说下改进BP的核心——在损失函数里加正则项。传统MSE损失对尖峰负荷预测不够敏感,我改成了Huber损失和L2正则的缝合怪:

from keras.regularizers import l2
from keras.losses import Huber

model.add(Dense(32, kernel_regularizer=l2(0.01)))  # 隐藏层加L2
model.compile(loss=Huber(delta=1500.0), optimizer=opt)  # 负荷单位是kW时delta设1500

Huber损失在|ypred - ytrue|

这套方案在省级电网跑通了,但移植到风电场时发现预测滞后问题。后来在LSTM层后接了个一维卷积层做特征补偿,算是勉强解决。电力预测这坑啊,永远有新的玄学问题等着你。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐