1. 项目概述:当金豺算法遇上CNN-LSTM负荷预测
在电力系统调度和能源管理中,负荷预测的准确性直接影响着电网运行的经济性和安全性。传统的时间序列预测方法在处理多变量、非线性负荷数据时往往捉襟见肘。最近我在一个省级电网公司的项目中,尝试将金豺优化算法(GJO)与CNN-LSTM混合模型结合,开发了一套多变量负荷预测方案,实测效果比单一LSTM模型预测误差降低了23.6%。
这个方案的核心创新点在于:用GJO算法自动优化CNN-LSTM的11个关键超参数,包括学习率、batch size、各层神经元数量等。相比手动调参,这种方法不仅节省了80%以上的调参时间,还能找到更优的参数组合。下面我将详细拆解这个项目的技术实现,包括数据准备、模型架构、优化算法应用等关键环节。
2. 数据准备与特征工程
2.1 数据来源与预处理
我们使用的数据集包含两个主要部分:
- 历史负荷数据:某省电网2018-2021年每15分钟采集一次的负荷值(每天96个时间点)
- 气象数据:同期每小时的温度、湿度、风速等12个气象指标
数据处理流程如下:
- 时间对齐:将气象数据从小时粒度插值到15分钟粒度
- 异常值处理:采用3σ原则识别并修正异常负荷数据
- 归一化:对负荷数据和气象数据分别进行Min-Max归一化
- 特征构造:除了原始数据,我们还构造了以下衍生特征:
- 24小时滑动平均负荷
- 同日期类型(工作日/节假日)历史平均负荷
- 温度-负荷敏感度系数
实际工程中发现,加入"同日期类型历史平均负荷"这一特征能使预测误差降低约5%,因为负荷具有明显的周周期性和节假日效应。
2.2 数据集划分与窗口化处理
按照7:2:1的比例划分训练集、验证集和测试集。采用滑动窗口方法构造样本,具体参数设置:
- 输入窗口长度:7天(672个时间点)
- 输出窗口长度:1天(96个时间点)
- 滑动步长:1天
这种设置基于两个考虑:
- 电力负荷具有明显的日周期和周周期特性
- 7天的输入窗口能同时捕捉这两种周期性
3. CNN-LSTM模型架构设计
3.1 模型整体结构
我们的混合模型采用"双通道输入+特征融合"的结构:
code复制输入层 → [CNN分支] ↘
→ 特征融合 → LSTM → 全连接层 → 输出层
[LSTM分支] ↗
CNN分支负责提取空间特征(如不同气象因素与负荷的关联模式),LSTM分支直接处理原始时序数据。两个分支的特征在融合层拼接,再经过LSTM和全连接层输出预测结果。
3.2 CNN模块详细配置
经过GJO优化后的CNN部分最终结构如下:
- 第一卷积层:
- 卷积核数量:64
- 核大小:3×3
- 激活函数:ReLU
- Padding:same
- 第一池化层:
- 池化方式:MaxPooling
- 核大小:2×2
- 第二卷积层:
- 卷积核数量:128
- 核大小:3×3
- 第二池化层:
- 池化方式:AveragePooling
- 核大小:2×1
实测发现第二池化层采用AveragePooling比MaxPooling能提升约1.2%的预测精度,可能是因为负荷数据中的局部波动不宜过度抑制。
3.3 LSTM模块参数设置
优化后的LSTM部分配置:
- 输入LSTM层单元数:256
- 特征融合后LSTM层单元数:128
- 全连接层神经元数:96(直接对应输出维度)
- Dropout率:0.2
特别需要注意的是,LSTM层的return_sequences参数设置:
- 第一LSTM层设为True(保留所有时间步输出)
- 第二LSTM层设为False(只输出最后时间步)
4. 金豺优化算法(GJO)实现
4.1 GJO算法原理与改进
金豺优化算法模拟了金豺群体的狩猎行为,包含三个关键阶段:
- 探索阶段:模拟金豺随机搜索猎物
- 包围阶段:逐渐缩小搜索范围
- 攻击阶段:快速接近最优解
我们在标准GJO基础上做了两点改进:
- 引入自适应权重:在迭代后期减小搜索步长
- 加入精英保留策略:防止优质解丢失
算法伪代码如下:
code复制初始化金豺种群
while 未达到最大迭代次数:
计算每个个体的适应度(CNN-LSTM的MSE)
更新当前最优解(雄性金豺位置)
for 每个个体:
if 探索阶段:
按式(1)更新位置
else if 包围阶段:
按式(2)更新位置
else:
按式(3)更新位置
应用精英保留策略
调整自适应权重
end while
返回全局最优解
4.2 超参数编码与解码
GJO优化的11个超参数采用混合编码方式:
- 连续参数(学习率、batch size等):实数编码
- 离散参数(卷积核数量等):整数编码
参数范围设置示例:
| 参数名称 | 搜索范围 | 编码方式 |
|---|---|---|
| 学习率 | [0.0001, 0.01] | 实数 |
| Batch size | [32, 256] | 整数 |
| 卷积核数量 | [16, 128] | 整数 |
| LSTM单元数 | [64, 512] | 整数 |
解码时,需要将GJO输出的位置向量映射到实际参数值。例如:
code复制学习率 = 0.0001 + (位置向量[0] + 1)/2 * (0.01-0.0001)
5. Matlab实现关键代码解析
5.1 模型构建代码
matlab复制% CNN部分
layers = [
imageInputLayer([672 13 1]) % 输入维度:时间步×特征数×1
convolution2dLayer(3,64,'Padding','same')
reluLayer()
maxPooling2dLayer([2 2],'Stride',2)
convolution2dLayer(3,128,'Padding','same')
averagePooling2dLayer([2 1],'Stride',[2 1])
flattenLayer()
concatenationLayer(1,2,'Name','concat') % 特征融合层
];
% LSTM部分
lstmLayers = [
sequenceInputLayer(13)
lstmLayer(256,'OutputMode','sequence')
lstmLayer(128,'OutputMode','last')
];
% 组合模型
lgraph = layerGraph(layers);
lgraph = addLayers(lgraph, lstmLayers);
lgraph = connectLayers(lgraph,'lstm_2','concat/in2');
5.2 GJO优化主循环
matlab复制for iter = 1:maxIter
% 评估种群
for i = 1:populationSize
params = decodePosition(population(i,:)); % 参数解码
model = createModel(params); % 创建模型
mse = trainAndEvaluate(model, trainData); % 训练评估
fitness(i) = 1/(1+mse); % 适应度计算
end
% 更新领导个体
[bestFit, idx] = max(fitness);
if bestFit > globalBest.fit
globalBest.pos = population(idx,:);
globalBest.fit = bestFit;
end
% 更新种群位置
for i = 1:populationSize
if rand() < 0.3 % 探索阶段
newPos = explorationPhase(population(i,:));
elseif rand() < 0.6 % 包围阶段
newPos = encirclingPhase(population(i,:), globalBest.pos);
else % 攻击阶段
newPos = attackingPhase(population(i,:), globalBest.pos);
end
population(i,:) = elitePreserve(newPos, population(i,:));
end
end
6. 实际应用效果与调优经验
6.1 性能对比测试
我们在三个数据集上对比了不同方法的预测效果:
| 方法 | MAPE(%) | RMSE(MW) | 训练时间(min) |
|---|---|---|---|
| 单一LSTM | 3.21 | 45.7 | 82 |
| CNN-LSTM(手动调参) | 2.87 | 41.3 | 135 |
| CNN-LSTM(GJO优化) | 2.19 | 37.5 | 68 |
| XGBoost | 4.02 | 58.2 | 15 |
可以看到,GJO优化的CNN-LSTM在精度上有明显优势,而且得益于自动调参,总耗时反而少于手动调参版本。
6.2 工程实践中的经验总结
-
数据质量至关重要:曾遇到因传感器故障导致连续3天气温数据异常,使预测误差突然增大15%。后来我们增加了数据质量检测模块,自动识别并处理此类问题。
-
超参数搜索范围设置:初期将学习率范围设为[0.001,0.1],导致优化过程不稳定。后调整为[0.0001,0.01]后收敛性明显改善。
-
早停策略:当验证集损失连续5轮不下降时停止训练,可节省约30%的训练时间。
-
多GPU并行:使用Matlab的并行计算工具箱,在4块Tesla V100上训练速度提升3.8倍。
-
模型更新频率:建议每周重新训练一次模型,以跟踪负荷特性的缓慢变化。