CNN时序预测详细介绍
源码
什么是CNN时序预测?
CNN时序预测(卷积神经网络时序预测,Convolutional Neural Network Time Series Prediction)是一种利用**卷积神经网络(Convolutional Neural Network, CNN)**进行时间序列数据预测的方法。CNN通过卷积层和池化层能够有效提取输入数据中的局部特征和模式,尤其适用于处理具有局部相关性和空间结构的数据。在时间序列预测中,CNN可以捕捉时间序列数据中的局部依赖关系和趋势变化,提高预测的准确性和鲁棒性。
CNN的组成部分
-
输入层(Input Layer):
- 接收输入数据的特征矩阵,每个维度对应时间序列的不同特征或时间步长。
-
卷积层(Convolutional Layer):
- 使用卷积核(滤波器)对输入数据进行卷积操作,提取局部特征。
- 参数包括卷积核大小、步幅(stride)、填充(padding)等。
-
批归一化层(Batch Normalization Layer):
- 对卷积层输出进行归一化处理,加速训练过程,稳定网络。
-
激活层(Activation Layer):
- 引入非线性因素,使网络能够学习复杂的非线性关系。常用的激活函数包括ReLU、Sigmoid等。
-
池化层(Pooling Layer):
- 降低特征图的维度,减少计算量和过拟合风险。常用的池化方式包括最大池化(Max Pooling)和平均池化(Average Pooling)。
-
Dropout层(Dropout Layer):
- 在训练过程中随机丢弃部分神经元,防止过拟合,提高模型的泛化能力。
-
全连接层(Fully Connected Layer):
- 将提取到的特征进行线性组合,生成最终的预测结果。
-
输出层(Output Layer):
- 根据任务需求输出预测值。对于回归任务,通常使用线性激活函数;对于分类任务,使用Softmax激活函数。
CNN时序预测的工作原理
CNN时序预测通过以下步骤实现时间序列的预测任务:
-
数据准备与预处理:
- 数据收集与整理:收集时间序列数据,处理缺失值和异常值,确保数据质量。
- 数据构造:利用延迟步长(lag)将时间序列数据转换为监督学习问题的输入输出对。
- 数据归一化:对输入数据和目标变量进行归一化或标准化处理,以加快训练速度和提高模型稳定性。
- 数据平铺:将一维时间序列数据转换为适合CNN输入的多维数据结构。
-
构建CNN模型:
- 网络结构设计:确定输入层、卷积层、池化层、全连接层和输出层的配置,选择合适的激活函数。
- 参数初始化:初始化网络权重和偏置,通常采用随机初始化方法。
-
模型训练:
- 使用训练集数据,通过反向传播算法调整网络权重和偏置,最小化预测误差。
- 设置训练参数,如学习率(Learning Rate)、最大迭代次数(Epochs)、优化算法(如Adam)等。
-
模型预测与评估:
- 使用训练好的模型对测试集数据进行预测,得到预测结果。
- 计算预测误差和其他性能指标(如RMSE、R²、MAE等),评估模型的预测准确性和泛化能力。
-
结果分析与可视化:
- 预测结果对比图:绘制真实值与预测值的对比图,直观展示模型的预测效果。
- 散点图:绘制真实值与预测值的散点图,评估模型的拟合能力。
- 误差分析:分析预测误差的分布和趋势,了解模型的优缺点。
CNN时序预测的优势
-
强大的特征提取能力:
- CNN通过卷积操作能够自动提取输入数据中的局部特征和模式,减少手动特征工程的需求。
-
处理高维数据:
- CNN适用于处理高维度的时间序列数据,能够有效捕捉数据中的复杂关系。
-
良好的泛化能力:
- 通过池化层和Dropout层,CNN能够减少过拟合风险,提高模型在未见数据上的表现。
-
并行计算:
- 卷积操作可以并行计算,提升模型的训练效率,适用于大规模数据集。
-
适应多种任务:
- CNN不仅适用于回归任务,还可以用于分类、异常检测等多种时间序列分析任务。
CNN时序预测的应用
CNN时序预测广泛应用于各类需要高精度时间序列预测的领域,包括但不限于:
-
金融预测:
- 股市价格预测:预测股票市场的未来价格走势,辅助投资决策。
- 经济指标预测:预测GDP、通胀率等宏观经济指标,为政策制定提供参考。
-
工程与制造:
- 设备故障预测:预测设备的潜在故障,进行预防性维护,减少停机时间。
- 生产过程控制:拟合和预测制造过程中关键参数,优化生产流程,确保产品质量。
-
环境科学:
- 气象预测:预测未来的气温、降水量等气象指标,辅助天气预报。
- 污染物浓度预测:预测空气或水体中的污染物浓度,进行环境监测和管理。
-
医疗健康:
- 疾病风险预测:预测个体患某种疾病的风险,辅助医疗决策和健康管理。
- 医疗费用预测:预测患者的医疗费用支出,优化医疗资源分配。
-
市场营销:
- 销售预测:预测产品的未来销售量,优化库存管理和市场策略。
- 客户需求预测:预测客户的购买行为和需求变化,制定精准的营销策略。
如何使用CNN时序预测
使用CNN时序预测模型主要包括以下步骤:
-
准备数据集:
- 数据收集与整理:确保时间序列数据的完整性和准确性,处理缺失值和异常值。
- 数据构造:利用延迟步长(lag)将时间序列数据转换为监督学习问题的输入输出对,构建特征矩阵和目标向量。
- 数据归一化:对输入数据和目标变量进行归一化或标准化处理,以加快训练速度和提高模型稳定性。
- 数据平铺:将一维时间序列数据转换为适合CNN输入的多维数据结构(如二维或三维)。
-
构建CNN模型:
- 选择网络结构:确定输入层、卷积层、池化层、全连接层和输出层的配置,选择适当的激活函数。
- 初始化参数:初始化网络权重和偏置,通常采用随机初始化方法。
-
模型训练与预测:
- 使用训练集数据,通过反向传播算法训练CNN模型,调整网络权重和偏置,最小化预测误差。
- 使用训练好的模型对测试集数据进行预测,得到预测结果。
-
模型评估与优化:
- 计算预测误差和其他性能指标(如RMSE、R²、MAE等),评估模型的预测准确性和泛化能力。
- 调整CNN模型的结构和训练参数(如卷积核大小、学习率、迭代次数等),优化模型性能。
-
结果分析与可视化:
- 预测结果对比图:绘制真实值与预测值的对比图,直观展示模型的预测效果。
- 散点图:绘制真实值与预测值的散点图,评估模型的拟合能力。
- 误差分析:分析RMSE、R²、MAE、MBE、MAPE等指标,全面评估模型的性能和预测准确性。
通过理解和应用上述CNN时序预测模型,用户可以有效地处理各种时间序列预测任务,充分发挥CNN在特征提取和模式识别方面的优势,提升模型的预测准确性和鲁棒性。
代码简介
该MATLAB代码实现了基于**卷积神经网络(Convolutional Neural Network, CNN)**的时序预测算法,简称“CNN时序预测”。主要流程如下:
-
数据预处理:
- 导入时间序列数据,并构造监督学习的数据集。
- 将数据集划分为训练集和测试集。
- 对输入数据和目标变量进行归一化处理。
- 将数据平铺成适合CNN输入的多维结构。
-
CNN模型构建与训练:
- 定义CNN的网络结构,包括输入层、卷积层、批归一化层、激活层、Dropout层、全连接层和回归层。
- 设置训练参数,如优化算法、最大训练次数、学习率等。
- 使用
trainNetwork
函数训练CNN模型,调整网络权重和偏置。
-
结果分析与可视化:
- 使用训练好的CNN模型对训练集和测试集进行预测。
- 计算并显示相关回归性能指标(RMSE、R²、MAE、MBE、MAPE)。
- 绘制训练集和测试集的真实值与预测值对比图以及散点图,直观展示回归效果。
- 分析网络结构,了解模型的组成和特征提取过程。
以下是包含详细中文注释的CNN时序预测MATLAB代码。
MATLAB代码(添加详细中文注释)
%% 清空环境变量
warning off % 关闭所有警告信息
close all % 关闭所有打开的图形窗口
clear % 清除工作区中的所有变量
clc % 清空命令行窗口
%% 导入数据(时间序列的单列数据)
result = xlsread('数据集.xlsx'); % 从Excel文件中读取时间序列数据,假设数据为单列
%% 数据分析
num_samples = length(result); % 计算时间序列数据的样本数量(数据点数)
kim = 15; % 设定延时步长(lag),即使用15个历史数据点作为输入特征
zim = 1; % 设定预测步长(forecast step),即预测当前点之后的1个时间点
%% 划分数据集
for i = 1: num_samples - kim - zim + 1
res(i, :) = [reshape(result(i: i + kim - 1), 1, kim), result(i + kim + zim - 1)];
end
% 循环遍历时间序列数据,构建输入特征和对应的目标变量
% 每一行res包含15个历史数据点和1个未来数据点
%% 数据集分析
outdim = 1; % 设定数据集的最后一列为输出(目标变量)
num_size = 0.7; % 设定训练集占数据集的比例(70%训练集,30%测试集)
num_train_s = round(num_size * num_samples); % 计算训练集样本个数,通过四舍五入确定
f_ = size(res, 2) - outdim; % 计算输入特征的维度,即总列数减去输出维度
%% 划分训练集和测试集
P_train = res(1: num_train_s, 1: f_)'; % 训练集输入特征,转置使每列为一个样本 (f_ × M)
T_train = res(1: num_train_s, f_ + 1: end)'; % 训练集输出目标变量,转置使每列为一个样本 (outdim × M)
M = size(P_train, 2); % 获取训练集的样本数量
P_test = res(num_train_s + 1: end, 1: f_)'; % 测试集输入特征,转置使每列为一个样本 (f_ × N)
T_test = res(num_train_s + 1: end, f_ + 1: end)';% 测试集输出目标变量,转置使每列为一个样本 (outdim × N)
N = size(P_test, 2); % 获取测试集的样本数量
%% 数据归一化
[P_train, ps_input] = mapminmax(P_train, 0, 1); % 对训练集输入特征进行归一化,范围[0,1]
P_test = mapminmax('apply', P_test, ps_input); % 使用训练集的归一化参数对测试集输入特征进行归一化
[t_train, ps_output] = mapminmax(T_train, 0, 1); % 对训练集输出目标变量进行归一化,范围[0,1]
t_test = mapminmax('apply', T_test, ps_output); % 使用训练集的归一化参数对测试集输出目标变量进行归一化
%% 数据平铺
% 将数据平铺成1维数据只是一种处理方式
% 也可以平铺成2维数据,以及3维数据,需要修改对应模型结构
% 但是应该始终和输入层数据结构保持一致
P_train = double(reshape(P_train, f_, 1, 1, M)); % 将训练集输入特征数据平铺为[f_, 1, 1, M]的四维矩阵,适应CNN输入
P_test = double(reshape(P_test , f_, 1, 1, N)); % 将测试集输入特征数据平铺为[f_, 1, 1, N]的四维矩阵,适应CNN输入
t_train = double(t_train)'; % 转置训练集输出目标变量,使每行为一个样本,并转换为double类型
t_test = double(t_test )'; % 转置测试集输出目标变量,使每行为一个样本,并转换为double类型
%% 构造网络结构
layers = [
imageInputLayer([f_, 1, 1]) % 输入层,输入数据规模为[f_, 1, 1]
convolution2dLayer([3, 1], 16, 'Stride', [1, 1], 'Padding', 'same') % 卷积层,卷积核大小为3x1,生成16张特征图,步幅为1x1,填充方式为'same'保持尺寸不变
batchNormalizationLayer % 批归一化层,对卷积层输出进行归一化处理,加速训练并稳定网络
reluLayer % ReLU激活层,引入非线性因素
convolution2dLayer([3, 1], 32, 'Stride', [1, 1], 'Padding', 'same') % 卷积层,卷积核大小为3x1,生成32张特征图,步幅为1x1,填充方式为'same'
batchNormalizationLayer % 批归一化层,对卷积层输出进行归一化处理
reluLayer % ReLU激活层,引入非线性因素
dropoutLayer(0.2) % Dropout层,随机丢弃20%的神经元,防止过拟合
fullyConnectedLayer(outdim) % 全连接层,输出节点数为outdim(目标变量维度)
regressionLayer]; % 回归层,适用于回归任务
% 定义了一个包含两个卷积块(每个卷积块包含卷积层、批归一化层和ReLU激活层)、Dropout层、全连接层和回归层的CNN网络
%% 参数设置
options = trainingOptions('adam', ... % 使用Adam优化算法进行训练
'MaxEpochs', 800, ... % 设置最大训练次数为800
'InitialLearnRate', 5e-3, ... % 设置初始学习率为0.005
'LearnRateSchedule', 'piecewise', ... % 学习率调整策略为分段调整
'LearnRateDropFactor', 0.1, ... % 学习率下降因子为0.1
'LearnRateDropPeriod', 600, ... % 学习率每经过600次迭代下降一次
'L2Regularization', 1e-4, ... % 设置L2正则化参数为1e-4,防止过拟合
'Shuffle', 'every-epoch', ... % 每个训练轮次打乱数据集顺序
'Plots', 'training-progress', ... % 显示训练过程中的进度图
'Verbose', false); % 关闭详细的训练信息显示
% 设置训练选项,包括优化算法、训练轮次、学习率调整策略、正则化、数据打乱和训练过程可视化
%% 训练模型
net = trainNetwork(P_train, t_train, layers, options); % 使用训练集数据训练CNN模型,调整网络权重和偏置
%% 仿真预测
t_sim1 = predict(net, P_train); % 使用训练集数据进行预测,得到训练集预测结果
t_sim2 = predict(net, P_test ); % 使用测试集数据进行预测,得到测试集预测结果
%% 数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output); % 将训练集预测结果反归一化,恢复到原始尺度
T_sim2 = mapminmax('reverse', t_sim2, ps_output); % 将测试集预测结果反归一化,恢复到原始尺度
%% 均方根误差(RMSE)
error1 = sqrt(sum((T_sim1' - T_train).^2) ./ M); % 计算训练集的均方根误差(RMSE)
error2 = sqrt(sum((T_sim2' - T_test ).^2) ./ N); % 计算测试集的均方根误差(RMSE)
%% 查看网络结构
analyzeNetwork(net) % 使用MATLAB的analyzeNetwork函数可视化和分析CNN网络的结构和层级信息
%% 绘图
% 绘制训练集预测结果对比图
figure
plot(1: M, T_train, 'r-', 1: M, T_sim1, 'b-', 'LineWidth', 1) % 绘制训练集真实值与预测值的对比曲线,红色实线为真实值,蓝色实线为预测值
legend('真实值', '预测值') % 添加图例,区分真实值和预测值
xlabel('预测样本') % 设置X轴标签为“预测样本”
ylabel('预测结果') % 设置Y轴标签为“预测结果”
string = {'训练集预测结果对比'; ['RMSE=' num2str(error1)]}; % 创建标题字符串,包括RMSE值
title(string) % 添加图形标题
xlim([1, M]) % 设置X轴显示范围为[1, M]
grid % 显示网格,提升图形的可读性
% 绘制测试集预测结果对比图
figure
plot(1: N, T_test, 'r-', 1: N, T_sim2, 'b-', 'LineWidth', 1) % 绘制测试集真实值与预测值的对比曲线,红色实线为真实值,蓝色实线为预测值
legend('真实值', '预测值') % 添加图例,区分真实值和预测值
xlabel('预测样本') % 设置X轴标签为“预测样本”
ylabel('预测结果') % 设置Y轴标签为“预测结果”
string = {'测试集预测结果对比'; ['RMSE=' num2str(error2)]}; % 创建标题字符串,包括RMSE值
title(string) % 添加图形标题
xlim([1, N]) % 设置X轴显示范围为[1, N]
grid % 显示网格,提升图形的可读性
%% 相关指标计算
% 决定系数(R²)
R1 = 1 - norm(T_train - T_sim1')^2 / norm(T_train - mean(T_train))^2; % 计算训练集的决定系数R²
R2 = 1 - norm(T_test - T_sim2')^2 / norm(T_test - mean(T_test ))^2; % 计算测试集的决定系数R²
disp(['训练集数据的R²为:', num2str(R1)]) % 显示训练集的R²
disp(['测试集数据的R²为:', num2str(R2)]) % 显示测试集的R²
% 平均绝对误差(MAE)
mae1 = sum(abs(T_sim1' - T_train)) ./ M ; % 计算训练集的平均绝对误差MAE
mae2 = sum(abs(T_sim2' - T_test )) ./ N ; % 计算测试集的平均绝对误差MAE
disp(['训练集数据的MAE为:', num2str(mae1)]) % 显示训练集的MAE
disp(['测试集数据的MAE为:', num2str(mae2)]) % 显示测试集的MAE
% 平均偏差误差(MBE)
mbe1 = sum(T_sim1' - T_train) ./ M ; % 计算训练集的平均偏差误差MBE
mbe2 = sum(T_sim2' - T_test ) ./ N ; % 计算测试集的平均偏差误差MBE
disp(['训练集数据的MBE为:', num2str(mbe1)]) % 显示训练集的MBE
disp(['测试集数据的MBE为:', num2str(mbe2)]) % 显示测试集的MBE
% 平均绝对百分比误差(MAPE)
mape1 = sum(abs((T_sim1' - T_train)./T_train)) ./ M ; % 计算训练集的平均绝对百分比误差MAPE
mape2 = sum(abs((T_sim2' - T_test )./T_test )) ./ N ; % 计算测试集的平均绝对百分比误差MAPE
disp(['训练集数据的MAPE为:', num2str(mape1)]) % 显示训练集的MAPE
disp(['测试集数据的MAPE为:', num2str(mape2)]) % 显示测试集的MAPE
% 均方根误差(RMSE)
disp(['训练集数据的RMSE为:', num2str(error1)]) % 显示训练集的RMSE
disp(['测试集数据的RMSE为:', num2str(error2)]) % 显示测试集的RMSE
%% 绘制散点图
sz = 25; % 设置散点的大小为25
c = 'b'; % 设置散点的颜色为蓝色
% 绘制训练集散点图
figure
scatter(T_train, T_sim1, sz, c) % 绘制训练集真实值与预测值的散点图,蓝色散点表示预测结果
hold on % 保持当前图形,允许在同一图形上绘制多条曲线
plot(xlim, ylim, '--k') % 绘制理想预测线(真实值等于预测值的对角线),使用黑色虚线表示
xlabel('训练集真实值'); % 设置X轴标签为“训练集真实值”
ylabel('训练集预测值'); % 设置Y轴标签为“训练集预测值”
xlim([min(T_train) max(T_train)]) % 设置X轴的显示范围为[最小真实值, 最大真实值]
ylim([min(T_sim1) max(T_sim1)]) % 设置Y轴的显示范围为[最小预测值, 最大预测值]
title('训练集预测值 vs. 训练集真实值') % 设置图形的标题为“训练集预测值 vs. 训练集真实值”
% 绘制测试集散点图
figure
scatter(T_test, T_sim2, sz, c) % 绘制测试集真实值与预测值的散点图,蓝色散点表示预测结果
hold on % 保持当前图形,允许在同一图形上绘制多条曲线
plot(xlim, ylim, '--k') % 绘制理想预测线(真实值等于预测值的对角线),使用黑色虚线表示
xlabel('测试集真实值'); % 设置X轴标签为“测试集真实值”
ylabel('测试集预测值'); % 设置Y轴标签为“测试集预测值”
xlim([min(T_test) max(T_test)]) % 设置X轴的显示范围为[最小真实值, 最大真实值]
ylim([min(T_sim2) max(T_sim2)]) % 设置Y轴的显示范围为[最小预测值, 最大预测值]
title('测试集预测值 vs. 测试集真实值') % 设置图形的标题为“测试集预测值 vs. 测试集真实值”
代码说明
1. 清空环境变量
warning off % 关闭所有警告信息
close all % 关闭所有打开的图形窗口
clear % 清除工作区中的所有变量
clc % 清空命令行窗口
- warning off:关闭MATLAB中的所有警告信息,避免在代码运行过程中显示不必要的警告。
- close all:关闭所有打开的图形窗口,避免之前的图形干扰当前的绘图。
- clear:清除工作区中的所有变量,确保代码运行环境的干净。
- clc:清空命令行窗口,提升可读性。
2. 导入数据
result = xlsread('数据集.xlsx'); % 从Excel文件中读取时间序列数据,假设数据为单列
- xlsread:从指定的Excel文件
数据集.xlsx
中读取时间序列数据。 - result:存储读取的时间序列数据,假设数据为单列,表示时间序列的连续值。
3. 数据分析
num_samples = length(result); % 计算时间序列数据的样本数量(数据点数)
kim = 15; % 设定延时步长(lag),即使用15个历史数据点作为输入特征
zim = 1; % 设定预测步长(forecast step),即预测当前点之后的1个时间点
- num_samples:计算时间序列数据的样本数量,即数据点的总数。
- kim:设定延时步长(lag),即每次使用15个连续的历史数据点作为输入特征,用于预测未来的值。
- zim:设定预测步长(forecast step),即预测当前点之后的1个时间点的值。
4. 划分数据集
for i = 1: num_samples - kim - zim + 1
res(i, :) = [reshape(result(i: i + kim - 1), 1, kim), result(i + kim + zim - 1)];
end
- 循环构造数据集:
- 遍历时间序列数据,从第1个数据点到第
num_samples - kim - zim + 1
个数据点。 - reshape(result(i: i + kim - 1), 1, kim):将连续的
kim
个历史数据点转换为1行kim
列的向量,作为输入特征。 - result(i + kim + zim - 1):获取当前输入特征对应的目标变量,即第
kim + zim
个时间点的值。 - res(i, 😃:将输入特征和目标变量组合成一行,存储在结果矩阵
res
中。
- 遍历时间序列数据,从第1个数据点到第
5. 数据集分析
outdim = 1; % 设定数据集的最后一列为输出(目标变量)
num_size = 0.7; % 设定训练集占数据集的比例(70%训练集,30%测试集)
num_train_s = round(num_size * num_samples); % 计算训练集样本个数,通过四舍五入确定
f_ = size(res, 2) - outdim; % 计算输入特征的维度,即总列数减去输出维度
- outdim:设定数据集的最后一列为输出(目标变量)。
- num_size:设定训练集占数据集的比例为70%,剩余30%作为测试集。
- num_train_s:计算训练集的样本数量,通过
round
函数对训练集比例与总样本数的乘积进行四舍五入。 - f_:计算输入特征的维度,即数据集的总列数减去输出维度。
6. 划分训练集和测试集
P_train = res(1: num_train_s, 1: f_)'; % 训练集输入特征,转置使每列为一个样本 (f_ × M)
T_train = res(1: num_train_s, f_ + 1: end)'; % 训练集输出目标变量,转置使每列为一个样本 (outdim × M)
M = size(P_train, 2); % 获取训练集的样本数量
P_test = res(num_train_s + 1: end, 1: f_)'; % 测试集输入特征,转置使每列为一个样本 (f_ × N)
T_test = res(num_train_s + 1: end, f_ + 1: end)';% 测试集输出目标变量,转置使每列为一个样本 (outdim × N)
N = size(P_test, 2); % 获取测试集的样本数量
- P_train:提取前
num_train_s
个样本的输入特征,并进行转置,使每列为一个样本。 - T_train:提取前
num_train_s
个样本的输出(目标变量),并进行转置,使每列为一个样本。 - M:获取训练集的样本数量。
- P_test:提取剩余样本的输入特征,并进行转置,使每列为一个样本。
- T_test:提取剩余样本的输出(目标变量),并进行转置,使每列为一个样本。
- N:获取测试集的样本数量。
7. 数据归一化
[P_train, ps_input] = mapminmax(P_train, 0, 1); % 对训练集输入特征进行归一化,范围[0,1]
P_test = mapminmax('apply', P_test, ps_input); % 使用训练集的归一化参数对测试集输入特征进行归一化
[t_train, ps_output] = mapminmax(T_train, 0, 1); % 对训练集输出目标变量进行归一化,范围[0,1]
t_test = mapminmax('apply', T_test, ps_output); % 使用训练集的归一化参数对测试集输出目标变量进行归一化
- mapminmax:使用
mapminmax
函数将数据缩放到指定的范围内(这里为[0,1])。 - P_train:归一化后的训练集输入特征数据。
- ps_input:保存输入特征的归一化参数,以便对测试集数据进行相同的归一化处理。
- P_test:使用训练集的归一化参数对测试集输入特征数据进行归一化,确保训练集和测试集的数据尺度一致。
- t_train:归一化后的训练集输出目标变量数据。
- ps_output:保存输出目标变量的归一化参数,以便对测试集数据进行相同的归一化处理。
- t_test:使用训练集的归一化参数对测试集输出目标变量数据进行归一化。
8. 数据平铺
% 将数据平铺成1维数据只是一种处理方式
% 也可以平铺成2维数据,以及3维数据,需要修改对应模型结构
% 但是应该始终和输入层数据结构保持一致
P_train = double(reshape(P_train, f_, 1, 1, M)); % 将训练集输入特征数据平铺为[f_, 1, 1, M]的四维矩阵,适应CNN输入
P_test = double(reshape(P_test , f_, 1, 1, N)); % 将测试集输入特征数据平铺为[f_, 1, 1, N]的四维矩阵,适应CNN输入
t_train = double(t_train)'; % 转置训练集输出目标变量,使每行为一个样本,并转换为double类型
t_test = double(t_test )'; % 转置测试集输出目标变量,使每行为一个样本,并转换为double类型
- 数据平铺:
- 将一维时间序列数据转换为适合CNN输入的多维数据结构。
- reshape(P_train, f_, 1, 1, M):将训练集输入特征数据平铺为[f_, 1, 1, M]的四维矩阵,适应MATLAB中CNN的输入要求。
- reshape(P_test , f_, 1, 1, N):将测试集输入特征数据平铺为[f_, 1, 1, N]的四维矩阵,适应CNN输入。
- double(…):确保数据类型为double,以适应CNN模型的要求。
- t_train = double(t_train)';:转置训练集输出目标变量,使每行为一个样本,并转换为double类型。
- t_test = double(t_test )';:转置测试集输出目标变量,使每行为一个样本,并转换为double类型。
9. 构造网络结构
layers = [
imageInputLayer([f_, 1, 1]) % 输入层,输入数据规模为[f_, 1, 1]
convolution2dLayer([3, 1], 16, 'Stride', [1, 1], 'Padding', 'same') % 卷积层,卷积核大小为3x1,生成16张特征图,步幅为1x1,填充方式为'same'保持尺寸不变
batchNormalizationLayer % 批归一化层,对卷积层输出进行归一化处理,加速训练并稳定网络
reluLayer % ReLU激活层,引入非线性因素
convolution2dLayer([3, 1], 32, 'Stride', [1, 1], 'Padding', 'same') % 卷积层,卷积核大小为3x1,生成32张特征图,步幅为1x1,填充方式为'same'
batchNormalizationLayer % 批归一化层,对卷积层输出进行归一化处理
reluLayer % ReLU激活层,引入非线性因素
dropoutLayer(0.2) % Dropout层,随机丢弃20%的神经元,防止过拟合
fullyConnectedLayer(outdim) % 全连接层,输出节点数为outdim(目标变量维度)
regressionLayer]; % 回归层,适用于回归任务
% 定义了一个包含两个卷积块(每个卷积块包含卷积层、批归一化层和ReLU激活层)、Dropout层、全连接层和回归层的CNN网络
-
imageInputLayer([f_, 1, 1]):
- 定义输入层,输入数据的尺寸为[f_, 1, 1],其中f_为输入特征维度,1和1代表高度和宽度。
-
convolution2dLayer([3, 1], 16, ‘Stride’, [1, 1], ‘Padding’, ‘same’):
- 定义一个二维卷积层,卷积核大小为3x1,生成16张特征图,步幅为1x1,填充方式为’same’保持输出尺寸与输入尺寸相同。
-
batchNormalizationLayer:
- 定义批归一化层,对卷积层的输出进行归一化处理,加速训练并稳定网络。
-
reluLayer:
- 定义ReLU激活层,引入非线性因素,使网络能够学习复杂的非线性关系。
-
convolution2dLayer([3, 1], 32, ‘Stride’, [1, 1], ‘Padding’, ‘same’):
- 定义另一个二维卷积层,卷积核大小为3x1,生成32张特征图,步幅为1x1,填充方式为’same’。
-
batchNormalizationLayer:
- 定义批归一化层,对卷积层的输出进行归一化处理。
-
reluLayer:
- 定义ReLU激活层,引入非线性因素。
-
dropoutLayer(0.2):
- 定义Dropout层,随机丢弃20%的神经元,防止过拟合,提高模型的泛化能力。
-
fullyConnectedLayer(outdim):
- 定义全连接层,输出节点数为outdim(目标变量的维度)。
-
regressionLayer:
- 定义回归层,适用于回归任务,计算预测值与真实值之间的误差。
10. 参数设置
options = trainingOptions('adam', ... % 使用Adam优化算法进行训练
'MaxEpochs', 800, ... % 设置最大训练次数为800
'InitialLearnRate', 5e-3, ... % 设置初始学习率为0.005
'LearnRateSchedule', 'piecewise', ... % 学习率调整策略为分段调整
'LearnRateDropFactor', 0.1, ... % 学习率下降因子为0.1
'LearnRateDropPeriod', 600, ... % 学习率每经过600次迭代下降一次
'L2Regularization', 1e-4, ... % 设置L2正则化参数为1e-4,防止过拟合
'Shuffle', 'every-epoch', ... % 每个训练轮次打乱数据集顺序
'Plots', 'training-progress', ... % 显示训练过程中的进度图
'Verbose', false); % 关闭详细的训练信息显示
% 设置训练选项,包括优化算法、训练轮次、学习率调整策略、正则化、数据打乱和训练过程可视化
-
trainingOptions(‘adam’, …):
- 使用Adam优化算法进行训练,Adam是一种自适应学习率优化算法,结合了Momentum和RMSProp的优点。
-
‘MaxEpochs’, 800:
- 设置最大训练次数(Epochs)为800,控制训练的轮次。
-
‘InitialLearnRate’, 5e-3:
- 设置初始学习率为0.005,控制每次权重更新的步长大小。
-
‘LearnRateSchedule’, ‘piecewise’:
- 设置学习率调整策略为分段调整,即在特定的训练轮次后调整学习率。
-
‘LearnRateDropFactor’, 0.1:
- 设置学习率下降因子为0.1,表示每次下降后学习率乘以0.1。
-
‘LearnRateDropPeriod’, 600:
- 设置学习率每经过600次迭代下降一次,即在第600轮时学习率从0.005下降到0.0005。
-
‘L2Regularization’, 1e-4:
- 设置L2正则化参数为1e-4,防止模型过拟合。
-
‘Shuffle’, ‘every-epoch’:
- 每个训练轮次打乱数据集顺序,增加模型的泛化能力。
-
‘Plots’, ‘training-progress’:
- 显示训练过程中的进度图,包括训练和验证误差的变化。
-
‘Verbose’, false:
- 关闭详细的训练信息显示,减少命令行输出的冗余信息。
11. 训练模型
net = trainNetwork(P_train, t_train, layers, options); % 使用训练集数据训练CNN模型,调整网络权重和偏置
- trainNetwork(P_train, t_train, layers, options):
- 使用训练集数据
P_train
和目标变量T_train
,根据定义的网络结构layers
和训练选项options
,训练CNN模型。
- 使用训练集数据
- net:
- 存储训练完成后的CNN模型,权重和偏置已调整至最优状态。
12. 仿真预测
t_sim1 = predict(net, P_train); % 使用训练集数据进行预测,得到训练集预测结果
t_sim2 = predict(net, P_test ); % 使用测试集数据进行预测,得到测试集预测结果
- predict(net, P_train):
- 使用训练好的CNN模型对训练集输入特征
P_train
进行预测,得到训练集预测结果T_sim1
。
- 使用训练好的CNN模型对训练集输入特征
- predict(net, P_test):
- 使用训练好的CNN模型对测试集输入特征
P_test
进行预测,得到测试集预测结果T_sim2
。
- 使用训练好的CNN模型对测试集输入特征
13. 数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output); % 将训练集预测结果反归一化,恢复到原始尺度
T_sim2 = mapminmax('reverse', t_sim2, ps_output); % 将测试集预测结果反归一化,恢复到原始尺度
- mapminmax(‘reverse’, …):
- 使用
mapminmax
函数将预测结果反归一化,恢复到原始数据的尺度。
- 使用
- T_sim1:
- 训练集预测结果,恢复到原始尺度。
- T_sim2:
- 测试集预测结果,恢复到原始尺度。
14. 均方根误差(RMSE)
error1 = sqrt(sum((T_sim1' - T_train).^2) ./ M); % 计算训练集的均方根误差(RMSE)
error2 = sqrt(sum((T_sim2' - T_test ).^2) ./ N); % 计算测试集的均方根误差(RMSE)
- RMSE:均方根误差,衡量模型预测值与真实值之间的平均差异。
- error1:
- 训练集的RMSE,计算公式为:
[
RMSE = \sqrt{\frac{1}{M} \sum_{i=1}^{M} (T_{\text{sim1}} - T_{\text{train}})^2}
]
- 训练集的RMSE,计算公式为:
- error2:
- 测试集的RMSE,计算公式为:
[
RMSE = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (T_{\text{sim2}} - T_{\text{test}})^2}
]
- 测试集的RMSE,计算公式为:
15. 查看网络结构
analyzeNetwork(net) % 使用MATLAB的analyzeNetwork函数可视化和分析CNN网络的结构和层级信息
- analyzeNetwork(net):
- 使用MATLAB的
analyzeNetwork
函数可视化和分析CNN网络的结构和层级信息,帮助用户理解网络的组成和特征提取过程。
- 使用MATLAB的
16. 绘图
绘制训练集预测结果对比图
figure
plot(1: M, T_train, 'r-', 1: M, T_sim1, 'b-', 'LineWidth', 1) % 绘制训练集真实值与预测值的对比曲线,红色实线为真实值,蓝色实线为预测值
legend('真实值', '预测值') % 添加图例,区分真实值和预测值
xlabel('预测样本') % 设置X轴标签为“预测样本”
ylabel('预测结果') % 设置Y轴标签为“预测结果”
string = {'训练集预测结果对比'; ['RMSE=' num2str(error1)]}; % 创建标题字符串,包括RMSE值
title(string) % 添加图形标题
xlim([1, M]) % 设置X轴显示范围为[1, M]
grid % 显示网格,提升图形的可读性
- figure:创建新的图形窗口。
- plot(1: M, T_train, ‘r-’, 1: M, T_sim1, ‘b-’, ‘LineWidth’, 1):
- 绘制训练集真实值与预测值的对比曲线,红色实线表示真实值,蓝色实线表示预测值。
- legend(‘真实值’, ‘预测值’):
- 添加图例,区分真实值和预测值。
- xlabel(‘预测样本’) 和 ylabel(‘预测结果’):
- 设置X轴和Y轴的标签为“预测样本”和“预测结果”。
- string = {‘训练集预测结果对比’; [‘RMSE=’ num2str(error1)]};:
- 创建标题字符串,包括RMSE值。
- title(string):
- 添加图形标题。
- xlim([1, M]):
- 设置X轴的显示范围为[1, M],其中M为训练集样本数。
- grid:
- 显示网格,提升图形的可读性。
绘制测试集预测结果对比图
figure
plot(1: N, T_test, 'r-', 1: N, T_sim2, 'b-', 'LineWidth', 1) % 绘制测试集真实值与预测值的对比曲线,红色实线为真实值,蓝色实线为预测值
legend('真实值', '预测值') % 添加图例,区分真实值和预测值
xlabel('预测样本') % 设置X轴标签为“预测样本”
ylabel('预测结果') % 设置Y轴标签为“预测结果”
string = {'测试集预测结果对比'; ['RMSE=' num2str(error2)]}; % 创建标题字符串,包括RMSE值
title(string) % 添加图形标题
xlim([1, N]) % 设置X轴显示范围为[1, N]
grid % 显示网格,提升图形的可读性
- figure:创建新的图形窗口。
- plot(1: N, T_test, ‘r-’, 1: N, T_sim2, ‘b-’, ‘LineWidth’, 1):
- 绘制测试集真实值与预测值的对比曲线,红色实线表示真实值,蓝色实线表示预测值。
- legend(‘真实值’, ‘预测值’):
- 添加图例,区分真实值和预测值。
- xlabel(‘预测样本’) 和 ylabel(‘预测结果’):
- 设置X轴和Y轴的标签为“预测样本”和“预测结果”。
- string = {‘测试集预测结果对比’; [‘RMSE=’ num2str(error2)]};:
- 创建标题字符串,包括RMSE值。
- title(string):
- 添加图形标题。
- xlim([1, N]):
- 设置X轴的显示范围为[1, N],其中N为测试集样本数。
- grid:
- 显示网格,提升图形的可读性。
17. 相关指标计算
% 决定系数(R²)
R1 = 1 - norm(T_train - T_sim1')^2 / norm(T_train - mean(T_train))^2; % 计算训练集的决定系数R²
R2 = 1 - norm(T_test - T_sim2')^2 / norm(T_test - mean(T_test ))^2; % 计算测试集的决定系数R²
disp(['训练集数据的R²为:', num2str(R1)]) % 显示训练集的R²
disp(['测试集数据的R²为:', num2str(R2)]) % 显示测试集的R²
% 平均绝对误差(MAE)
mae1 = sum(abs(T_sim1' - T_train)) ./ M ; % 计算训练集的平均绝对误差MAE
mae2 = sum(abs(T_sim2' - T_test )) ./ N ; % 计算测试集的平均绝对误差MAE
disp(['训练集数据的MAE为:', num2str(mae1)]) % 显示训练集的MAE
disp(['测试集数据的MAE为:', num2str(mae2)]) % 显示测试集的MAE
% 平均偏差误差(MBE)
mbe1 = sum(T_sim1' - T_train) ./ M ; % 计算训练集的平均偏差误差MBE
mbe2 = sum(T_sim2' - T_test ) ./ N ; % 计算测试集的平均偏差误差MBE
disp(['训练集数据的MBE为:', num2str(mbe1)]) % 显示训练集的MBE
disp(['测试集数据的MBE为:', num2str(mbe2)]) % 显示测试集的MBE
% 平均绝对百分比误差(MAPE)
mape1 = sum(abs((T_sim1' - T_train)./T_train)) ./ M ; % 计算训练集的平均绝对百分比误差MAPE
mape2 = sum(abs((T_sim2' - T_test )./T_test )) ./ N ; % 计算测试集的平均绝对百分比误差MAPE
disp(['训练集数据的MAPE为:', num2str(mape1)]) % 显示训练集的MAPE
disp(['测试集数据的MAPE为:', num2str(mape2)]) % 显示测试集的MAPE
% 均方根误差(RMSE)
disp(['训练集数据的RMSE为:', num2str(error1)]) % 显示训练集的RMSE
disp(['测试集数据的RMSE为:', num2str(error2)]) % 显示测试集的RMSE
-
决定系数(R²):
- R1:训练集的决定系数R²,衡量模型对训练数据的拟合程度。值越接近1,表示模型对数据的解释能力越强。
- R2:测试集的决定系数R²,衡量模型对测试数据的泛化能力。值越接近1,表示模型在未见数据上的表现越好。
- disp([‘训练集数据的R²为:’, num2str(R1)]):
- 显示训练集的R²值。
- disp([‘测试集数据的R²为:’, num2str(R2)]):
- 显示测试集的R²值。
-
平均绝对误差(MAE):
- mae1:训练集的平均绝对误差MAE,表示预测值与真实值之间的平均绝对差异。值越小,表示模型性能越好。
- mae2:测试集的平均绝对误差MAE,表示预测值与真实值之间的平均绝对差异。值越小,表示模型性能越好。
- disp([‘训练集数据的MAE为:’, num2str(mae1)]):
- 显示训练集的MAE值。
- disp([‘测试集数据的MAE为:’, num2str(mae2)]):
- 显示测试集的MAE值。
-
平均偏差误差(MBE):
- mbe1:训练集的平均偏差误差MBE,衡量模型是否存在系统性偏差。正值表示模型倾向于高估,负值表示模型倾向于低估。
- mbe2:测试集的平均偏差误差MBE,衡量模型是否存在系统性偏差。正值表示模型倾向于高估,负值表示模型倾向于低估。
- disp([‘训练集数据的MBE为:’, num2str(mbe1)]):
- 显示训练集的MBE值。
- disp([‘测试集数据的MBE为:’, num2str(mbe2)]):
- 显示测试集的MBE值。
-
平均绝对百分比误差(MAPE):
- mape1:训练集的平均绝对百分比误差MAPE,表示预测值与真实值之间的平均绝对百分比差异。适用于评估相对误差。
- mape2:测试集的平均绝对百分比误差MAPE,表示预测值与真实值之间的平均绝对百分比差异。适用于评估相对误差。
- disp([‘训练集数据的MAPE为:’, num2str(mape1)]):
- 显示训练集的MAPE值。
- disp([‘测试集数据的MAPE为:’, num2str(mape2)]):
- 显示测试集的MAPE值。
-
均方根误差(RMSE):
- error1:训练集的RMSE,显示训练集的均方根误差。
- error2:测试集的RMSE,显示测试集的均方根误差。
- disp([‘训练集数据的RMSE为:’, num2str(error1)]):
- 显示训练集的RMSE值。
- disp([‘测试集数据的RMSE为:’, num2str(error2)]):
- 显示测试集的RMSE值。
18. 绘制散点图
绘制训练集散点图
figure
scatter(T_train, T_sim1, sz, c) % 绘制训练集真实值与预测值的散点图,蓝色散点表示预测结果
hold on % 保持当前图形,允许在同一图形上绘制多条曲线
plot(xlim, ylim, '--k') % 绘制理想预测线(真实值等于预测值的对角线),使用黑色虚线表示
xlabel('训练集真实值'); % 设置X轴标签为“训练集真实值”
ylabel('训练集预测值'); % 设置Y轴标签为“训练集预测值”
xlim([min(T_train) max(T_train)]) % 设置X轴的显示范围为[最小真实值, 最大真实值]
ylim([min(T_sim1) max(T_sim1)]) % 设置Y轴的显示范围为[最小预测值, 最大预测值]
title('训练集预测值 vs. 训练集真实值') % 设置图形的标题为“训练集预测值 vs. 训练集真实值”
- figure:创建新的图形窗口。
- scatter(T_train, T_sim1, sz, c):
- 使用
scatter
函数绘制训练集真实值T_train
与预测值T_sim1
的散点图,蓝色散点表示预测结果。
- 使用
- hold on:
- 保持当前图形,允许在同一图形上绘制多条曲线。
- plot(xlim, ylim, ‘–k’):
- 绘制理想预测线,即真实值等于预测值的对角线,使用黑色虚线表示。
- xlabel(‘训练集真实值’) 和 ylabel(‘训练集预测值’):
- 设置X轴和Y轴的标签为“训练集真实值”和“训练集预测值”。
- xlim([min(T_train) max(T_train)]) 和 ylim([min(T_sim1) max(T_sim1)]):
- 设置X轴和Y轴的显示范围为数据的最小值和最大值。
- title(‘训练集预测值 vs. 训练集真实值’):
- 设置图形的标题为“训练集预测值 vs. 训练集真实值”。
绘制测试集散点图
figure
scatter(T_test, T_sim2, sz, c) % 绘制测试集真实值与预测值的散点图,蓝色散点表示预测结果
hold on % 保持当前图形,允许在同一图形上绘制多条曲线
plot(xlim, ylim, '--k') % 绘制理想预测线(真实值等于预测值的对角线),使用黑色虚线表示
xlabel('测试集真实值'); % 设置X轴标签为“测试集真实值”
ylabel('测试集预测值'); % 设置Y轴标签为“测试集预测值”
xlim([min(T_test) max(T_test)]) % 设置X轴的显示范围为[最小真实值, 最大真实值]
ylim([min(T_sim2) max(T_sim2)]) % 设置Y轴的显示范围为[最小预测值, 最大预测值]
title('测试集预测值 vs. 测试集真实值') % 设置图形的标题为“测试集预测值 vs. 测试集真实值”
- figure:创建新的图形窗口。
- scatter(T_test, T_sim2, sz, c):
- 使用
scatter
函数绘制测试集真实值T_test
与预测值T_sim2
的散点图,蓝色散点表示预测结果。
- 使用
- hold on:
- 保持当前图形,允许在同一图形上绘制多条曲线。
- plot(xlim, ylim, ‘–k’):
- 绘制理想预测线,即真实值等于预测值的对角线,使用黑色虚线表示。
- xlabel(‘测试集真实值’) 和 ylabel(‘测试集预测值’):
- 设置X轴和Y轴的标签为“测试集真实值”和“测试集预测值”。
- xlim([min(T_test) max(T_test)]) 和 ylim([min(T_sim2) max(T_sim2)]):
- 设置X轴和Y轴的显示范围为数据的最小值和最大值。
- title(‘测试集预测值 vs. 测试集真实值’):
- 设置图形的标题为“测试集预测值 vs. 测试集真实值”。
代码使用注意事项
-
数据集格式:
- 时间序列数据:确保
数据集.xlsx
中的数据为单列时间序列数据,表示时间序列的连续值。 - 数据顺序:时间序列数据应按照时间顺序排列,确保数据的时间依赖关系。
- 时间序列数据:确保
-
参数调整:
- 延时步长(kim):通过
kim = 15
设定,表示使用15个历史数据点作为输入特征。根据时间序列的特性和周期性调整延时步长,步长过大可能导致模型复杂度增加,步长过小可能导致模型捕捉不到足够的时间依赖信息。 - 预测步长(zim):通过
zim = 1
设定,表示预测当前点之后的1个时间点的值。根据实际需求调整预测步长,适用于单步预测或多步预测。 - 训练集比例(num_size):通过
num_size = 0.7
设定,表示70%的数据用于训练,30%的数据用于测试。根据数据集大小和分布调整训练集比例,确保训练集和测试集具有代表性。 - 隐藏层神经元数量:通过
convolution2dLayer
和fullyConnectedLayer
中的参数设定卷积核数量和全连接层的输出节点数。根据数据的复杂度和特征数量调整卷积核数量和全连接层神经元数量,提升模型的特征提取能力和拟合能力。
- 延时步长(kim):通过
-
环境要求:
- MATLAB版本:确保使用的MATLAB版本支持
trainNetwork
、imageInputLayer
、convolution2dLayer
等深度学习相关函数。需要安装MATLAB的Deep Learning Toolbox。 - 工具箱:
- Deep Learning Toolbox:支持CNN模型的构建、训练和预测。
- MATLAB版本:确保使用的MATLAB版本支持
-
性能优化:
- 数据预处理:
- 归一化:通过
mapminmax
函数对输入数据和目标变量进行归一化,提升模型训练速度和稳定性。 - 降维:如果输入特征过多,可以考虑使用主成分分析(PCA)等降维方法,减少特征数量,提升模型训练效率和性能。
- 归一化:通过
- 网络结构优化:
- 卷积核大小和数量:调整卷积核的大小和数量,提升模型的特征提取能力。
- 隐藏层数量和神经元数量:根据数据的复杂度调整隐藏层的数量和每层的神经元数量,优化模型的拟合能力和泛化能力。
- 激活函数选择:选择适当的激活函数(如ReLU、Sigmoid等),提升模型的非线性拟合能力。
- 训练参数优化:
- 学习率调整:根据训练过程中的误差变化趋势,适当调整学习率,提升模型的收敛速度和稳定性。
- 正则化参数调整:通过调整L2正则化参数,防止模型过拟合。
- 早停策略:监控验证集误差,当误差不再下降时停止训练,防止过拟合。
- 数据预处理:
-
结果验证:
- 交叉验证:采用k折交叉验证方法评估模型的稳定性和泛化能力,避免因数据划分偶然性导致的性能波动。
- 多次运行:由于CNN对初始参数敏感,建议多次运行模型,取平均性能指标,以获得更稳定的评估结果。
- 模型对比:将CNN时序预测模型与其他预测模型(如ARIMA、LSTM、SVM回归等)进行对比,评估不同模型在相同数据集上的表现差异。
-
性能指标理解:
- 决定系数(R²):衡量模型对数据的拟合程度,值越接近1表示模型解释变量变异的能力越强。
- 平均绝对误差(MAE):表示预测值与真实值之间的平均绝对差异,值越小表示模型性能越好。
- 平均偏差误差(MBE):表示预测值与真实值之间的平均差异,正值表示模型倾向于高估,负值表示模型倾向于低估。
- 平均绝对百分比误差(MAPE):表示预测值与真实值之间的平均绝对百分比差异,适用于评估相对误差。
- 均方根误差(RMSE):表示预测值与真实值之间的平方差的平均值的平方根,值越小表示模型性能越好。
-
模型分析与可视化:
- 网络结构分析:通过
analyzeNetwork
函数可视化CNN网络的结构,了解各层的配置和特征提取过程。 - 预测结果对比图:通过绘制训练集和测试集的真实值与预测值对比图,直观展示模型的预测效果。
- 散点图:通过绘制真实值与预测值的散点图,评估模型的拟合能力和误差分布。
- 网络结构分析:通过
-
代码适应性:
- 模型参数调整:根据实际数据和任务需求,调整CNN模型的参数(如卷积核大小、学习率、迭代次数等),优化模型性能。
- 数据格式匹配:确保输入数据的格式与CNN模型的要求一致。输入数据应为多维矩阵,符合CNN的输入层配置。
- 特征处理:如果输入数据包含类别特征,需先进行数值编码转换,确保所有特征均为数值型数据。
通过理解和应用上述CNN时序预测模型,用户可以有效地处理各种时间序列预测任务,充分发挥CNN在特征提取和模式识别方面的优势,提升模型的预测准确性和鲁棒性。