CNN-LSTM多输出回归 基于卷积神经网络结合长短期记忆神经网络(CNN-LSTM)的多输出回归预测(多输入多输出) 程序已经调试好,仅需要根据输出个数修改outdim(输出个数)值。 替换数据集即可运行数据格式为excel 1、运行环境要求MATLAB版本为2020b及其以上 2、评价指标包括:R2、MAE、MBE、RMSE等,图很多,符合您的需要 3、代码中文注释清晰,质量极高 4、测试数据集,可以直接运行源程序。 替换你的数据即可用 适合新手小白 5、 注:保证源程序运行,
这个CNN-LSTM混合模型就像给预测任务装了双重保险——CNN负责捕捉数据中的空间特征,LSTM则专注时间序列的长期依赖。实测某电力系统负荷预测数据集,单次预测就能输出未来3个时间点的负荷值,R2直接飙到0.97+。关键是代码已经调通,小白只需改个参数就能直接开跑。
先看数据怎么喂给模型。假设你的excel表格长这样:
% 数据读取示例(电力负荷数据集) data = xlsread('power_load.xlsx'); input = data(:,1:5); % 5个特征:温度、湿度、星期、节假日、历史负荷 output = data(:,6:8); % 输出未来3小时负荷归一化处理要注意别踩坑,训练集和测试集必须用同一套缩放参数:
[inputn, inputps] = mapminmax(input_train'); [outputn, outputps] = mapminmax(output_train');模型结构搭建是精髓所在。这个1D卷积层设计暗藏玄机——卷积核宽度等于特征维度,相当于在时间步长维度做特征提取:
layers = [ sequenceInputLayer(num_features) % 输入特征数 convolution1dLayer(5, 64, 'Padding', 'same') % 5个时间步的卷积窗口 batchNormalizationLayer reluLayer lstmLayer(128, 'OutputMode', 'sequence') % 128个隐藏单元 dropoutLayer(0.2) fullyConnectedLayer(outdim) % 关键参数:输出维度 regressionLayer];训练参数配置直接影响收敛速度。这个Adam优化器设置亲测有效,初始学习率别超过0.001:
options = trainingOptions('adam', ... 'MaxEpochs', 200, ... 'MiniBatchSize', 32, ... 'InitialLearnRate', 0.0005, ... 'LearnRateSchedule', 'piecewise', ... 'LearnRateDropPeriod', 50, ... 'Verbose', 0);预测结果反归一化时有个细节容易翻车,必须用训练集的输出缩放参数:
predict_result = mapminmax('reverse', predict_value, outputps); real_result = mapminmax('reverse', output_test, outputps);评价指标计算函数要这么写才能正确应对多输出:
function [R2, MAE, RMSE] = calc_metrics(y_true, y_pred) ss_res = sum((y_true - y_pred).^2, 1); ss_tot = sum((y_true - mean(y_true,1)).^2, 1); R2 = 1 - ss_res ./ ss_tot; MAE = mean(abs(y_true - y_pred), 1); RMSE = sqrt(mean((y_true - y_pred).^2, 1)); end运行后生成的预测对比图会说话——三条输出曲线基本贴合真实值波动。特别是节假日预测段,LSTM的长时记忆能力优势明显,比纯CNN模型误差降低约15%。
常见问题锦囊:
- 输出维度不对应?检查outdim是否等于输出列数
- 显存溢出?把MiniBatchSize砍半试试
- 预测值成直线?检查数据归一化是否应用正确
- 想预测更多时间步?直接增大outdim值即可
改个数据集就能复用的秘诀在于:输入保持(样本数×时间步×特征数)的三维结构。比如风电预测数据,只需把风速、风向、温度等特征拼成输入矩阵,输出设为未来N小时发电量,马上get同款预测模型。