千呼万唤始出来!

一直以来有小伙伴在问:我现在已经有完整的代码了,预测效果也还可以,如何用来预测新数据呢,或者如何把这个训练好的网络保存下来,来预测一下没有实际输出数据集,其实很简单,但是在开始之前,先纠正一个定义:

验证集和测试集,目前绝大部分小伙伴理解的都不太正确,很多发表的文章中写的也不是很规范,当然这不怎么妨碍使用。目前我们一直在说的测试集,其实在真正的机器学习定义里算作验证集,有真实输出与神经网络的预测做对比,其实是验证集的功能,测试集在定义中是在实际使用时的数据集,是没有真实值的,要用训练好的网络来预测。

那么,训练集、验证集、测试集的作用分别是:

  • 训练集:用于供模型进行训练学习;
  • 验证集:用于验证训练的模型的好坏:
  • 测试集:模型训练完成,验证集验证结果好的话,再对未知数据进行预测。

ok,说了这么多,接下来如何修改代码!

二、如何修改代码

1. 以BP神经网络为例,BP的建立、参数设置、训练和预测过程如下:

% 构建BP
net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');

% 网络参数设置
net.trainParam.epochs=1000;         % 训练次数
net.trainParam.lr=0.01;             % 学习速率
net.trainParam.goal=0.000001;       % 训练目标最小误差

% 网络训练
net=train(net,inputn,outputn);      

% 网络预测
an=sim(net,inputn_test);                     % 仿真预测
test_simu=mapminmax('reverse',an,outputps);  % 预测结果反归一化

2. 现在BP已经训练好了,如何保存下来呢,用 save 命令来保存 “net” ,此外,还需要将“inputps”和“outputps”,因为我们在新脚本中导入新数据后,还需要采用相同的归一化和反归一化方式。

save net; 
save inputps;
save outputps;

3. 保存下来后,在同一文件夹下,建立一个新的脚本,用 load

% 加载网络参数
load net;  %加载训练好的网络模型net
load inputps;
load outputps;

% 导入新的预测数据集
data=xlsread('预测数据.xlsx'); 

% 新数据集归一化
inputn_test=mapminmax('apply',data',inputps);

% 仿真预测
an=sim(net,inputn_test); 

% 测试结果反归一化
test_simu=mapminmax('reverse',an,outputps); 

% 画图
figure
plot(test_simu,'bh-','linewidth',1.5,'markerfacecolor','b')
xlabel('测试集样本'),ylabel('预测值')

三、BP算法优化

BP算法优化

遗传算法  GA-BP

灰狼算法  GWO-BP

鲸鱼算法  WOA-BP

粒子群算法  PSO-BP

麻雀算法  SSA-BP

布谷鸟算法  CS-BP

四、结语

本文是以BP为例,如果网络模型复杂的时候,保存的参数可能也比较多,需要注意的是变量命名时避免冲突,以及,以及具体问题具体分析。

它看起来虽然很容易,实际上一点也不难!