CNN-GRU-Attention回归,基于卷积神经网络(CNN)-门控循环单元(GRU)-注意力机制(Attention)的数据回归预测 1、运行环境要求MATLAB版本为2020b及其以上 2、评价指标包括:R2、MAE、MSE、RMSE等,图很多,符合您的需要 3、代码中文注释清晰,质量极高 4、测试数据集,可以直接运行源程序。 替换你的数据即可用 适合新手小白 注:保证源程序运行,

要搞定时间序列预测这事儿,最烦的就是既要捕捉局部特征又要理解长期依赖。咱们今天直接上硬货,用MATLAB整一个CNN-GRU-Attention混合模型,手把手教你怎么用这个三合一神器做数据回归预测。

先看数据预处理部分。拿到数据第一件事得把数据喂成模型能消化的格式:

% 数据归一化(这里假设数据存成excel了)
rawData = xlsread('dataset.xlsx');
[inputData, inputPS] = mapminmax(rawData(:,1:end-1)', 0, 1); 
[outputData, outputPS] = mapminmax(rawData(:,end)', 0, 1);

% 时间窗口滑动生成训练样本
windowSize = 12; % 根据数据周期调整这个值
[XTrain, YTrain] = createDataset(inputData', outputData', windowSize);

这段代码里的createDataset函数是关键(自己封装个滑动窗口生成函数),把时间序列数据切成连续的时间片段。比如用前12个小时的数据预测下一个时间点的值,类似玩拼图游戏。

模型结构是重头戏,直接上网络架构代码:

layers = [
    sequenceInputLayer(inputSize) % 输入维度根据数据特征数定
    
    convolution1dLayer(3, 64, 'Padding', 'same') % 一维卷积挖局部特征
    batchNormalizationLayer
    reluLayer
    maxPooling1dLayer(2, 'Stride', 2)
    
    gruLayer(128, 'OutputMode', 'sequence') % 捕捉时间依赖关系
    dropoutLayer(0.3)
    
    attentionLayer('AttentionSize', 64) % 自定义注意力层
    fullyConnectedLayer(1) % 输出维度
    regressionLayer];

这个架构里有个骚操作——在GRU后面接Attention层。Attention机制就像给时间步长装了个聚光灯,让模型自动聚焦关键时间点。比如预测空气质量时,模型可能会特别关注前一天傍晚的排放高峰期。

训练环节要注意学习率设置,别让模型跑偏:

options = trainingOptions('adam', ...
    'MaxEpochs', 200, ...
    'MiniBatchSize', 64, ...
    'InitialLearnRate', 0.001, ...
    'LearnRateSchedule', 'piecewise', ...
    'LearnRateDropPeriod', 100, ...
    'Verbose', false, ...
    'Plots', 'training-progress');

初始学习率设0.001比较稳妥,配合学习率衰减策略,防止后期震荡。注意这里用了piecewise分段策略,训练到100轮时学习率自动降为原来十分之一,相当于先大步前进后小步微调。

预测结果的可视化才是重头戏:

predicted = predict(net, XTest);
predicted = mapminmax('reverse', predicted, outputPS);

figure
plot(1:numel(YTest), YTest, 'b', 1:numel(predicted), predicted, 'r')
title('预测效果对比')
legend('真实值', '预测值')

这个对比图一出来,效果好坏一目了然。如果看到预测曲线比真实值平滑,可能是模型过滤掉了噪声,也可能是欠拟合了,这时候得回去调卷积核尺寸或者GRU的隐藏单元数。

评价指标的计算直接反映模型性能:

mse = mean((YPred - YTest).^2);
mae = mean(abs(YPred - YTest));
rmse = sqrt(mse);
r2 = 1 - sum((YPred - YTest).^2)/sum((YTest - mean(YTest)).^2);

R²值要是超过0.9基本可以横着走,但要注意测试集和训练集的数据分布是否一致。有个坑别踩——数据泄露问题,千万别在归一化时把测试集和训练集混在一起处理。

替换自己的数据时注意三点:数据文件格式保持excel的xlsx格式,输入特征列放在前几列,最后一列是输出值。时间窗口参数要根据业务场景调整,比如预测股票可能需要5天的窗口,而预测气温可能只需要24小时窗口。

整套代码跑通后会发现,GRU层后面接Attention有时候比LSTM效果更惊艳,尤其是在处理长序列时。不过也别迷信模型,关键还是特征工程和数据质量。曾经有个案例,工程师死活调不好模型,最后发现是传感器数据存在周期性故障,这锅模型可不背。

最后说个实战技巧:遇到预测值总比真实值滞后的问题,可以试试在卷积层后加空洞卷积(dilated convolution),扩大感受野。或者在Attention层前接双向GRU,让模型既能瞻前也能顾后。这些魔改方法在代码里也就是改几行参数的事,但效果可能立竿见影。

Logo

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

更多推荐