使用CNN进行回归预测代码
最后更新于:2024-05-30 21:38:00
-使用波士顿房价预测作为演示案例。
-可以自由设置神经网络卷积层结构、池化层结构
-可以快速划分训练集、验证集、测试集
-程序运行完后自动绘制出收敛过程、训练集和测试集的预测结果对比、相对误差图、MAE/MSE/MAPE/RMSE/R等指标
-多种训练参数可设置,包括求解器、迭代次数、初始学习率等等
-可设置随机种子,保证每次运行结果保持一致
–需要你做的基本只有导入数据和调参。
–绝大多数流程都被封装固化到函数中,仿照案例导入你的数据即刻得到结果~
一、代码运行环境
MATLAB2018b及更新版本。
二、程序介绍
注:图标代表该m文件为脚本文件,可以直接运行;图标代表函数文件,在没有输入变量的情况下无法直接运行。更详细的解释可以看这里。
1.scriptRegCNNs.m文件
使用波士顿城郊区域的房价数据集进行回归预测的案例,其中演示了FunRegCNNs函数的应用方式示范。
文件可以直接运行。程序运行完成后,将会画出如下图像:
收敛过程图
网络结构图
训练过程中损失值和RMSE收敛图
训练集拟合结果对比图
训练集预测结果相对误差
测试集预测结果对比图
测试集预测结果相对误差
在命令行窗口还会打印出以下内容:
网络结构
每层网络的输出尺寸
MAE/MSE/MAPE/RMSE/R等指标
2.FunRegCNNs.m文件
使用CNN进行回归预测的快速实现函数。
代码说明:
function [foreData,foreDataTrain,net,info] = FunRegCNNs(dataX,dataY,trainR,cLayer,poolingLayer,fcLayer,options,figflag)
% 使用CNN进行回归预测的快速实现函数
% 该函数需要输入的数据为array数组型
% 输入:
% dataX:输入数据,R*Q的矩阵,R为输入数据的维度,Q为批次数,输入该变量时一定要注意维度正确
% 例:对于一维特征,每组数据长度为20,共1000组数据,则dataX的可以维度为:20*1000
% dataY:输出结果
% trainR:数据集中训练集划分比例,如:trainR = 0.6,则代表60%数据用于训练集,40%数据用于测试集
% cLayer:卷积层结构,为n*5的二维数组,其中n为卷积层的数量
% 列向的5个维度时分别代表滤波器的高、滤波器的宽、滤波器数量、步长、填充
% 例,cLayer = [3,1,16,1,1;3,1,32,1,0]时,则代表有两层卷积层,其中第一层滤波器高为3,宽为1,滤波器数量为16,步长1,填充1
% 第二次滤波器高为3,宽为1,滤波器数量为32,步长1,填充0
% poolingLayer:池化层结构,为长度为n*5的cell数据,其中n为池化层的数量,和卷积层层数相同。
% 列向的三个维度分别代表:1.池化层类型,分为'maxPooling2dLayer'和'averagePooling2dLayer'两种,如果不用池化层设置为'none'
% 2.池化区域高度尺寸
% 3.池化区域宽度尺寸
% 4.步长
% 5.填充
% 例如:
% poolingLayer = {'maxPooling2dLayer',2,1,2,1; 'averagePooling2dLayer',2,1,1,0};
% 代表第一个池化层为最大池化层,尺寸为2*1,步长2,填充1,第二个池化层为平均池化层,尺寸为2*1,步长1,填充0
% 注意!如果对应卷积层后不设置池化层,请在对应的位置设置为'none',0,0,0,0
% 比如cLayer设置为两层时,如果只想在第一层卷积层后对应有池化层,第二层卷积层后无池化层,那么池化层应该设置为:
% poolingLayer = {'maxPooling2dLayer',1,2,1,0;
% 'none',0,0,0,0 }; %后边的四个0主要是占位,不起实际作用
% options:一些与网络训练等相关的设置,使用结构体方式赋值,比如 options.MaxEpochs = 1000,具体包括:
% solverName:求解器,'sgdm'(默认) | 'rmsprop' | 'adam'
% MaxEpochs:最大迭代次数,默认30
% MiniBatchSize:批尺寸,默认128
% GradientThreshold:梯度极限,默认为Inf
% InitialLearnRate:初始化学习速率(默认0.005)
% Plots:是否显示训练过程,'none' 为不显示(默认) | 'training-progress'为显示
% ValidationFrequency:验证频率,即每间隔多少次迭代进行一次验证,默认50
% LearnRateSchedule:即LearnRateSchedule是否在一定迭代次数后学习速率下降, LearnRateSchedule ='piecewise'为使用,'none'为不使用(默认)
% LearnRateDropPeriod:即LearnRateDropPeriod学习速率下降时的迭代数,默认为10
% LearnRateDropFactor:即LearnRateDropFactor学习速率下降因子,下降后变为LearnRateDropFactor*InitialLearnRate,LearnRateSchedule为0时可以赋0,默认为0.1
% (未启用)NorFlag:即Normalization Flag,设置为1时则在程序中进行数据归一化和反归一化操作,否则不进行,建议设置为1
% SeedFlag:随机种子标志,设置为1时启用随机种子,(默认为1)
% fcLayer:全连接层,可以设置多层,如果设置fcLayer=[],则在网络结构中只包含一个全连接层,输出的维度与数据类别相同。
% 如果设置fcLayer为数组,则代表在上边的全连接层之前再加入对应数量的全连接层和ReLU层
% 例如设置fcLayer=[32,16],则代表在共有三个全连接层,第一个是fullyConnectedLayer(32)+ReLU,第二个是fullyConnectedLayer(16)+ReLU,
% 第三个是fullyConnectedLayer(numClasses)
% figflag:是否画图,'on'为画图,'off'为不画
% 输出:
% foreData:测试集的回归预测结果
% foreDataTrain:训练集的回归预测结果
% net:训练好的网络
% info:神经网络训练相关参数,如loss值、准确度等
3.EvaForeEffect.m文件
用于评价时间序列预测效果各个量化指标的通用函数。可以计算MAE/MSE/MAPE/RMSE/R2/R等
function ind = EvaForeEffect(realData,foreData,indNamesCell)
% 用于评价时间序列预测效果各个量化指标的通用函数
% 输入:
% realData:真实值
% foreData:预测值
% indNamesCell:拟进行预测评价指标名称,该变量为cell类型,其中包含的指标名称为字符串,指标名称在下边列表中:
% 目前支持的指标(2021.12.5):
% MSE:均方误差(Mean Square Error)
% RMSE:均方根误差(Root Mean Square Error)
% MAE:平均绝对误差(Mean Absolute Error)
% MAPE:平均绝对百分比误差(Mean Absolute Percentage Error)
% R2:决定系数(R2-R-Square)
% R:相关系数
% 如果想获取MSE、MAE两个指标,则设置:indNamesCell = {'MSE','MAE'}
% 输出:
% ind:预测效果评价指标结果数组,其评价指标值顺序与indNamesCell一一对应
三、快速开始
1.运行测试脚本
先在MATLAB里打开下载好的文件夹,然后运行scriptRegCNNs.m程序,程序运行完毕后如果没报错,且正常画出上述图像,则说明运行环境正常,程序正确。
2.修改仿真数据/导入数据
复制一个scriptRegCNNs.m的文件副本,在这个副本里做如下修改:
根据你的文件类型的不同(excel,txt,csv等),将数据导入MATLAB的方法有所不同。同学们可以看博主针对常用文件的导入方法的这个教程,教程上未包含的数据类型,大家可以再参考这个文档。
3.实现CNN回归预测
参照脚本文件中第三、四步,根据需要调整相关参数。
运行程序即可。
四、关于完整版与公开版代码
功能 | 完整版 | 公开版 |
数据导入、参数设置、实现滤波 | √ | √ |
软件全部源码(函数m文件) | √ | × |
画图无水印 | √ | × |
最大迭代次数 | 不限制 | 100 |
导出预测结果、训练好的网络模型、神经网络训练相关参数(如loss值、准确度)等 | 可导出 | 不可导出 |
五、获取公开版程序(需使用电脑浏览器打开)
CNN回归预测代码公开版
注:公开版代码需使用MATLAB2022a及以上版本
六、获取完整版程序(使用电脑浏览器或者手机浏览器打开)
获取通道一(淘宝):点击此处获取完整版程序
获取通道二(本页面):点击下面“立即支付”按钮,付款后获取完整版代码下载链接和售后联系方式~本通道处于测试阶段,使用该通道可以额外优惠(仅需76元)。付款完成后刷新一下本页面即可看到下载链接。
(注意支付跳转失败的话,请使用浏览器打开本页面)
七、完整版代码重要更新
20231019 完成初版代码
八、常见问题
无。