千呼万唤始出来!
一直以来有小伙伴在问:我现在已经有完整的代码了,预测效果也还可以,如何用来预测新数据呢,或者如何把这个训练好的网络保存下来,来预测一下没有实际输出数据集,其实很简单,但是在开始之前,先纠正一个定义:
验证集和测试集,目前绝大部分小伙伴理解的都不太正确,很多发表的文章中写的也不是很规范,当然这不怎么妨碍使用。目前我们一直在说的测试集,其实在真正的机器学习定义里算作验证集,有真实输出与神经网络的预测做对比,其实是验证集的功能,测试集在定义中是在实际使用时的数据集,是没有真实值的,要用训练好的网络来预测。
那么,训练集、验证集、测试集的作用分别是:
- 训练集:用于供模型进行训练学习;
- 验证集:用于验证训练的模型的好坏:
- 测试集:模型训练完成,验证集验证结果好的话,再对未知数据进行预测。
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为例,如果网络模型复杂的时候,保存的参数可能也比较多,需要注意的是变量命名时避免冲突,以及,以及具体问题具体分析。
它看起来虽然很容易,实际上一点也不难!