ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

灰色神经网络预测小样本数据:MATLAB实现与优化指南

灰色神经网络预测小样本数据:MATLAB实现与优化指南 简介这是一份MATLAB神经网络与优化算法主题的实操资源聚焦灰色神经网络在小样本数据预测中的建模与实现。灰色系统理论由邓聚龙提出擅长处理信息不完全、数据量有限的系统将其与神经网络结合可有效挖掘小样本中的潜在规律缓解传统模型因数据不足而出现的过拟合与泛化难题。压缩包共2个文件包含1个mp4操作演示视频和1个.m源码脚本整体仅10.76MB轻量易用。内容涵盖从原理到实战的完整链路视频完整演示了数据预处理、网络结构定义、trainNetwork训练、交叉验证及预测输出等关键步骤源码脚本可直接运行或修改便于逐行理解灰色神经网络的搭建细节训练时还可选用梯度下降、Levenberg-Marquardt等优化算法改善收敛效果。目前已有139人学习下载适合MATLAB初学者、科研人员以及需要处理小样本预测任务的工程师参考也可作为灰色系统方向课程设计与科研预研的入门资料。1. 灰色神经网络预测小样本数据为什么它值得你花时间拿到一份只有十几个点的历史数据却要预测未来三五个点的走势这种事在电力负荷、设备寿命、产量规划、销量爬坡里太常见了。二十个样本直接扔给 BP 网络权值参数比样本数量还多训练结果基本靠运气验证集稍微一换就翻车。灰色神经网络解决的正是这个尴尬区间先用灰色理论把短序列“加工”成适合学习的单调形态再由前馈神经网络去拟合其中的非线性关系最后还原成原始量纲做预测。这篇笔记从一个能直接跑的 MATLAB 脚本出发把数据检查、模型搭建、参数调整、优化算法改进和常见的坑完整过一遍适合正在用 MATLAB 做时序预测却被小样本卡住的工程师和研究者。2. 灰色神经网络的核心逻辑两个模块各干各的活2.1 小样本为什么是神经网络的死穴先算一笔账输入层 3 个节点、隐藏层 6 个节点、输出层 1 个节点的前馈神经网络权值和阈值加起来是 3×6 6 6×1 1 31 个参数。12 个训练样本对应 12 组输入输出方程未知数比方程数多一倍还不止解不唯一是必然的。更麻烦的是反向传播里的梯度是对当前 batch 的近似估计样本越少这个估计的方差越大训练曲线抖得厉害跑到几百轮还在震荡的情况很常见。我见过不少人遇到这种情况后的第一反应是加大网络、加正则、加 dropout。但小样本时序数据有一个特殊性样本之间是先后依赖的不能像图像那样随机裁剪、翻转来做数据增强你很难在不泄漏未来信息的前提下凭空造出更多训练点。所以问题的关键不是把网络调得更复杂而是先换一种办法让 12 组样本能撑起一个合理的模型。灰色理论加神经网络的组合就是在模型结构上降低对样本量的需求。2.2 GM(1,1) 做了什么把随机波动磨平灰色系统理论处理小样本的核心不是统计而是“生成”。很多短序列其实带着明确的指数趋势比如设备退化、负荷增长、新产品的销量爬坡波动只是叠加在趋势上的扰动。GM(1,1) 的第一步是累加生成AGO把原始序列 x(1), x(2), …, x(n) 逐项累加得到 y(k)Σx(i)。累加之后原来上下跳动的序列变成一条单调递增、形状稳定的曲线随机扰动的影响被大幅压缩。第二步是用一阶微分方程 dy/dt a·y b 去拟合这条累加曲线。方程只有 a 和 b 两个未知参数用最小二乘一步就能解出来所以它对样本量的要求极低四五个点就能建模。拿到累加序列的拟合和预测结果后再用累减还原IAGO把预测值减回去x(k)y(k)-y(k-1)。这个流程听着简单但 GM(1,1) 本身能表达的形态很有限本质是一条指数曲线碰到序列里有转折点、季节性或者突发变化的时候就力不从心。这正是需要神经网络补位的地方。2.3 两种结合方式组合式与融合式灰色神经网络在文献里其实有两种差别很大的实现。一种是组合式先做 GM(1,1) 的累加生成再用 BP 网络对累加序列建滑动窗口回归最后累减还原。另一种是融合式把灰色微分方程里的灰参数 a、b 直接当成神经网络的权值构造出带灰色神经元结构的网络训练过程同时更新网络权值和灰参数。结合方式实现难度参数敏感性适合场景组合式AGO BP IAGO低MATLAB 工具箱直接搭对 BP 初始值敏感但中间过程好观察工程落地、代码复现、快速验证融合式灰色神经元网络高需要手写网络结构对 a、b 初值非常敏感调参周期长学术对比实验追求模型理论一致性我一般用组合式。原因很直白训练过程中你能随时看到累加序列的拟合曲线、还原后的误差、每一步的中间量出了问题知道往哪查。融合式的灰色神经元网络在论文里更“漂亮”但隐藏层灰参数初值设不好训练直接不收敛排错难度翻倍。做工程预测先求能稳定复现再谈理论优雅。2.4 整体流水线从原始序列到预测值组合式灰色神经网络的完整流程可以拆成五步。第一步对原始序列做可建模性检查主要是级比检验确认序列适合用灰色模型处理。第二步做累加生成得到单调的累加序列。第三步用滑动窗口把累加序列切成训练样本每 m 个历史累加点预测下一个累加点这一步决定了网络的输入维度。第四步训练 BP 网络推荐贝叶斯正则化训练函数小样本下不容易过拟合。第五步滚动预测把网络输出的累加预测值逐步回填到输入窗口继续预测下一步得到完整的累加预测序列后累减还原。这里有个关键点必须提前说滚动预测是递归进行的前一步的预测误差会作为输入影响后一步所以预测步数越多误差累积越明显。这也是后面第 5 章踩坑记录里最常出现的问题。灰色神经网络适合的是“训练 15 个点、预测 3 到 5 步”这种场景而不是拿 20 个点预测未来 20 个点后者任何模型都救不了。3. 在 MATLAB 里跑通灰色神经网络完整脚本与参数设置3.1 一份可以直接用的样本数据为了演示我构造了 20 个月的负荷序列前 15 个点做训练后 5 个点做验证。数据整体呈增长趋势相邻点比值在 0.92 到 0.98 之间这是典型的适合灰色模型的形态。你换成自己的销量、流量、水位数据时只要满足这个形态特点脚本可以直接套用。如果原始数据里含零值或负值先把整体平移成正数再做后面的处理原因在第 5 章会细说。% 20 个月的负荷序列单位可以是任意业务量纲 x [2.60 2.85 3.10 3.35 3.55 3.80 4.05 4.30 4.50 ... 4.75 5.00 5.20 5.45 5.70 5.95 6.20 6.45 6.70 6.95 7.20]; n length(x); % 20 trainEnd 15; % 前15个点训练后5个点验证这段代码的作用是固定原始序列和训练/验证划分。trainEnd 这个变量建议单独定义后面所有阶段都用它避免在多个脚本里改数字导致训练集和预测区间对不上。划分一旦定了就不要来回改这属于基本的数据卫生。3.2 级比检验序列能不能用灰色模型灰色模型 GM(1,1) 对原始序列有光滑度要求工程上最常用的检查手段是级比检验。级比定义为相邻两个原始值的比值 λ(k)x(k-1)/x(k)理论上要求所有级比落在区间 (exp(-2/(n1)), exp(2/(n1))) 内。n20 时这个区间大约是 (0.909, 1.100)。如果级比全部落在这个区间里说明序列的指数趋势明显灰色预处理是合理的如果大部分点落在区间外就要考虑先做平移或对数变换。% 级比检验lambda 应落在 (exp(-2/(n1)), exp(2/(n1))) 内 lambda x(1:end-1) ./ x(2:end); lb exp(-2/(n1)); ub exp(2/(n1)); ok (lambda lb) (lambda ub); fprintf(级比区间: [%.3f, %.3f]通过比例: %.0f%%\n, ... lb, ub, sum(ok)/length(lambda)*100);计算级比时注意 MATLAB 索引从 1 开始x(1:end-1)./x(2:end) 得到的是第 k-1 项比第 k 项。这里用逐元素除法对应每个相邻点对。通过比例只要不是 100%并不代表必须放弃灰色模型而是提醒你后续预测的置信度要打折或者先做数据变换再回来检验。级比检验是灰色建模的第一道闸门跳过它直接跑网络往往会在预测段出现莫名其妙的发散。3.3 主脚本GM(1,1)-BP 训练与五步预测下面是完整的灰色神经网络预测脚本。它做的事情是累加生成、滑动窗口切样本、归一化、训练前馈网络、滚动预测累加序列、累减还原、输出验证集误差。rng(42); % 固定随机种子保证结果可复现 % 1) 累加生成 AGO得到单调累加序列 ago cumsum(x); % 2) 滑动窗口构造训练样本用前 m 个累加点预测下一个累加点 m 3; % 输入窗口长度 Xtr []; Ytr []; for t m1:trainEnd Xtr [Xtr; ago(t-m:t-1)]; % 每行是一个样本的输入 Ytr [Ytr; ago(t)]; % 每行是对应的累加预测目标 end % 3) 归一化到 [-1,1]保存映射参数供滚动预测时使用 [Xn, Xps] mapminmax(Xtr, -1, 1); [Yn, Yps] mapminmax(Ytr, -1, 1); Xn Xn; Yn Yn; % 4) 前馈 BP 网络6 个隐层节点贝叶斯正则化训练 net feedforwardnet(6, trainbr); net.trainParam.epochs 1000; net.trainParam.goal 1e-5; net.divideFcn dividetrain; % 全部样本训练正则化由 trainbr 负责 % 5) 训练 [net, ~] train(net, Xn, Yn); % 6) 滚动预测累加序列预测点逐步回填到输入窗口 predAgo zeros(1, n); predAgo(1:trainEnd) ago(1:trainEnd); lastWin ago(trainEnd-m1:trainEnd); for k trainEnd1:n xn mapminmax(apply, lastWin, Xps); % 新输入做同样的归一化 yn net(xn); pk mapminmax(reverse, yn, Yps); % 还原到累加量纲 predAgo(k) pk; lastWin [lastWin(2:end); pk]; % 回填滚动前进 end % 7) 累减还原 IAGO得到原始序列的预测值 predX predAgo; for k trainEnd1:n predX(k) predAgo(k) - predAgo(k-1); end % 8) 验证集误差第16到20点 idx trainEnd1:n; mape mean(abs((predX(idx) - x(idx)) ./ x(idx))) * 100; fprintf(5步验证集 MAPE %.2f%%\n, mape); % 画图真实值 vs 预测值 figure; plot(1:n, x, o-, 1:n, predX, x-, LineWidth, 1.2); legend(真实值, 灰色神经网络预测, Location, northwest); xlabel(时间序号); ylabel(负荷值); grid on;脚本第 2 步的滑动窗口是核心窗口长度 m3 意味着用最近 3 个累加点预测下一个累加点。训练样本数是 trainEnd-m12 个输入维度 3。第 6 步的滚动预测里lastWin 初始取自真实累加序列的最后 3 个点之后每预测出一个新值就把它拼到窗口尾部、丢掉最老的值这一步直接决定了预测误差是可控的还是滚雪球式的。第 7 步累减还原时保留真实值的第一个点 x(1) 作为基准从第二个点开始作差。参数方面feedforwardnet(6, trainbr) 第一参数是隐层节点数第二参数是训练函数。trainbr 全称 Bayesian Regularization它在训练中自动权衡拟合误差和权值大小对 12 个样本的训练集非常友好。epochs 设 1000 是因为 trainbr 在小样本上收敛偏慢实际训练中往往在两三百轮就达到了 goal但给足上限能避免中途停在不理想的位置。3.4 网络结构与训练参数速查同样的数据换一组参数可能得出截然不同的结果。我把这套灰色神经网络里真正值得调的参数整理成一张表按影响程度排序。参数常见取值小样本倾向说明窗口长度 m2/3/4m3m 太大会吃掉本就稀少的训练样本m2 则容易丢失趋势信息隐层节点数4/6/866 个节点对应 31 个参数已经接近 12 个样本的极限训练函数trainbr/trainlm/trainscgtrainbrtrainlm 在样本少时容易矩阵奇异trainbr 自带正则归一化范围[-1,1] 或 [0,1][-1,1]tansig 激活函数输出范围与 [-1,1] 对齐收敛更稳epochs500-20001000trainbr 收敛慢给足迭代次数随机种子任意固定整数42不固定种子同一份代码多次运行结果差异可能很大这里特别提醒一点尽量不要同时加大 m 和隐层节点数。12 组训练样本输入维度从 3 提到 5隐层再加到 10参数数量轻松超过 60 个训练误差可以做到近乎为零但验证集必然一塌糊涂。小样本建模的黄金法则是模型容量永远低于样本信息量灰色累加已经帮你把序列变得平滑了网络不需要太复杂。3.5 误差评估单看 MAPE 够不够脚本里输出的 MAPE 是验证集上的平均绝对百分比误差一般小于 8% 就可以认为这个灰色神经网络在可用范围内。但工程判断不能只看这一个数我习惯同时看三个东西MAPE 衡量整体偏差水平MAE 看绝对量级是否在业务可接受范围内RMSE 则会把个别离群点放大暴露那些“大部分点都准、偶尔爆一个”的情况。画图时重点看预测段的曲线形态预测曲线应该平滑地衔接训练段尾巴而不是在衔接点出现明显跳变。如果训练段末尾和验证段开头之间有一道“坎”说明累加序列的拟合在边界处出了偏差往往是滑动窗口最后几个点的预测误差被后续滚动放大了。这种情况下先不要急着调网络回到第 2 步检查累加序列的拟合质量问题通常出在预处理而不是网络结构上。4. 用优化算法改进灰色神经网络粒子群搜初始权值4.1 初始权值为什么值得搜跑过几次上面的脚本你就会发现一个现象rng 种子一换验证集 MAPE 可能从 4% 跳到 9%。这不完全是坏事至少说明模型还有提升空间但也暴露了 BP 网络的通病——初始权值是随机给的训练只保证收敛到一个局部最优不保证是个好局部最优。小样本下梯度信息弱初始点对最终结果的影响被进一步放大。与其反复手试种子碰运气不如用一个优化算法去搜索一组更好的初始权值再交给 trainbr 去精修。这种做法在工程里叫“两层训练”外层用群智能优化算法搜索网络初始参数内层用传统梯度训练在给定初始点附近精调。注意优化算法只负责找起点不是替代 BP 的反向传播。很多人在这里理解偏了以为粒子群直接输出最终权值就行结果精度反而更差因为群智能算法在高维连续空间里的精细搜索能力远不如梯度法。4.2 优化变量与适应度函数的设计第一步是确定优化变量。把网络全部初始权值和阈值按顺序拼成一个一维向量每个粒子就是这样一个向量。对于输入维度 3、隐层 6、输出 1 的网络变量维度是 3×6 6 6×1 1 31。每个变量的取值边界设为 ±3因为输入已经归一化到 [-1,1]权值超过 3 时神经元很容易饱和梯度趋近于零。第二步是适应度函数。这里有个重要原则适应度必须稳定可比较否则优化算法会把随机性当成信号来利用。我的做法是在适应度函数里固定 rng比如每次评估都先 rng(0)让网络初始化完全相同唯一的差异就是粒子本身。适应度取训练集上的均方误差 MSE不去算验证集因为外层搜索的过程本身就是在训练集上拟合如果把验证集放进去优化算法会变相在验证集上过拟合跟反复看测试集调参是同一个错误。4.3 粒子群核心代码与参数先写一个适应度函数它接收一个粒子向量解码成网络初始权值训练后返回训练集 MSE。function mse trainAndEvalNet(pos, X, T, hs) nIn size(X, 2); % 输入维度 nOut 1; nW1 nIn * hs; % 输入到隐层权值个数 nB1 hs; % 隐层阈值个数 nW2 hs * nOut; % 隐层到输出权值个数 net feedforwardnet(hs, trainbr); rng(0); % 固定初始化过程只让粒子本身起作用 % 解码粒子向量到网络初始参数 w1 reshape(pos(1:nW1), [hs, nIn]); b1 pos(nW11 : nW1nB1); w2 reshape(pos(nW1nB11 : nW1nB1nW2), [nOut, hs]); b2 pos(end); net.IW{1} w1; net.b{1} b1; net.LW{2,1} w2; net.b{2} b2; net.divideFcn dividetrain; net.trainParam.epochs 300; [net, ~] train(net, X, T); Y net(X); mse mean((Y - T).^2); end然后调用 MATLAB 自带的 particleswarm 做外层搜索。用内置函数而不是手写粒子群更新公式不是偷懒而是optimoptions里提供了收敛判据和种群多样性控制手写版本很容易在迭代后期所有粒子挤在一起失去探索能力。% 调用粒子群优化搜出最优初始权值 nIn m; hs 6; nOut 1; D nIn*hs hs hs*nOut nOut; % 31 维 lb -3 * ones(1, D); ub 3 * ones(1, D); fitfun (p) trainAndEvalNet(p, Xn, Yn, hs); rng(7); opt optimoptions(particleswarm, ... SwarmSize, 25, ... % 粒子数量 MaxIterations, 30, ... % 外层迭代次数 Display, iter); [bestp, bestmse] particleswarm(fitfun, D, lb, ub, opt); fprintf(粒子群搜索到的最优训练MSE %.6f\n, bestmse);这里 SwarmSize25、MaxIterations30 是相对保守的配置。31 维的搜索空间不需要特别大的种群粒子太少容易早熟太多则每次评估都要训练一个网络算力成本直线上升。训练网络内部把 epochs 降到 300 也是刻意的外层搜索只比较“哪个起点更好”不需要每个起点都训练到完全收敛节省下来的时间足够多跑几轮粒子群迭代。等粒子群收敛后用 bestp 解码出的初始权值再完整训练一次拿去做最终预测。如果想在这个基础上换别的优化算法思路完全一样算法输出一个 31 维向量适应度函数是上面那个 trainAndEvalNet剩下的只是搜索器不同。遗传算法、阿基米德优化算法、海星优化算法这类新出的群智能方法接口都可以按这个模式封装。它们的区别主要在收敛速度和跳出局部最优的能力对灰色神经网络这种低维平滑的适应度函数实际差别没有论文里渲染得那么大选一个自己熟的工具就好。4.4 优化算法的边界什么时候不值得做粒子群优化不是免费的午餐。每次粒子评估都要完整训练一次 BP30 次迭代乘 25 个粒子就是 750 次训练哪怕内部只跑 300 轮总耗时也远超直接训练一次。所以我给自己定了一条线如果普通训练出来的验证集 MAPE 在 8% 以内而且预测曲线形态正常不做外层优化直接进入滚动预测验证只有 MAPE 超过 10%或者结果对随机种子过于敏感才值得花这个算力去搜初始权值。小样本预测的核心矛盾从来不是“不够精细”而是“样本太少导致的可信度问题”优化算法改善的是局部最优困境补不了数据不足的底。5. 灰色神经网络落地避坑五个血泪经验5.1 归一化顺序错了验证集分数是假的现象训练集 MAPE 低到 2%验证集 MAPE 也低得喜人模型看起来完美结果换一批新数据预测一塌糊涂。原因预处理时用了全部 20 个点的统计量做归一化。mapminmax 求的是整个向量的最小值和最大值如果这个向量里包含训练阶段本不该出现的未来数据验证集的“真实值”信息就已经通过归一化参数泄漏到模型里了。这属于典型的数据泄漏比任何参数调优都致命。解决先划分训练集和验证集再分别做归一化。训练时用训练集数据计算 Xps 和 Yps预测时用mapminmax(apply, 新输入, Xps)套用同一套缩放参数。前面的主脚本里Xtr 和 Ytr 都只源自前 15 个点没有混入验证集所以没有踩这个坑但如果你复制代码后自己改了数据拼接方式这个坑很容易复发。5.2 级比检验不过预测段直接发散现象累加序列拟合得很平滑还原后验证集前一两步勉强能用第三步开始预测值要么暴涨要么掉到负值。原因原始序列含零值、负值或者相邻点波动太大级比落在容许区间之外。灰色模型对光滑度有要求强行建模相当于让一条指数曲线去拟合一个根本不是指数形态的序列末端外推必然失控。解决回到 3.2 的级比检验把通过比例打出来。如果低于 80%先对原始序列做整体平移比如所有点加一个常数使最小值大于 0再做对数变换压缩波动检查变换后的级比是否落在区间内。这两种变换都属于对原始数据的确定性变换不影响预测结果的相对含义但在报告误差时要记得把变换还原回去。5.3 累减还原后第一个预测点总差一截现象验证集后几步误差还好唯独第一步偏得离谱画图时第一个预测点像被绊了一下。原因累减还原 x(k)y(k)-y(k-1) 的基准出了问题。如果 y(k-1) 用的是网络预测的累加值而不是真实累加值第一步作差就叠加了误差更常见的是索引错位MATLAB 没有第 0 个元素循环从 k2 开始时有人会把 y(0) 默认当成 0导致第一项凭空多了一个原始值。解决累减还原时保留真实序列的第一个点作为基准从 k2 开始循环作差。在主脚本里predX 初始值直接复制了真实累加序列 predAgo前 15 个点都是真实值还原只需要从第 16 个点开始基准是真实的 ago(15)不存在这个坑。如果你改了 trainEnd 或者自己写循环注意基准点必须是真实累加值不能用预测值。5.4 trainlm 在小样本上疯狂报 NaN现象换用默认的 trainlm 训练函数训练到一半 loss 变成 NaN权值全部变成 NaN整个网络报废。原因trainlm 是 Levenberg-Marquardt 算法它需要构造近似的二阶导数矩阵并求逆矩阵尺寸和样本量直接相关。12 个训练样本时这个矩阵严重奇异求逆过程数值不稳定一步迭代就可能把权值推到无穷大。解决训练函数换成 trainbr。贝叶斯正则化在每次迭代里给大权值加惩罚数值稳定性好得多而且它不用构造完整二阶矩阵对样本量的宽容度明显更高。如果坚持用 trainlm至少把net.trainParam.mu_max调低到 1e10 以下并加 try-catch 捕获 NaN 后重新初始化但这只是缓解不是根治。小样本场景下 trainbr 是默认选择没有之一。5.5 同一份代码换台机器结果对不上现象本地跑 MAPE 5%别人电脑上跑 MAPE 12%代码一模一样数据一模一样。原因神经网络初始化依赖随机数生成器。不同 MATLAB 版本之间随机数算法可能不同更常见的是脚本里漏了 rng 设置每次运行初始化都不一样。如果连 rng 都设了还是对不上那多半是训练函数内部有并行计算多核环境下浮点累加顺序不同导致微小差异被训练过程放大。解决脚本第一行写死rng(42)并且确认并行池是关闭的或者用rng(42, twister)锁定生成器类型。严谨一点的做法是同一个配置跑 5 到 10 次记录 MAPE 的均值和标准差用均值横向对比不同模型方案。小样本模型的单次结果本来就有随机性只报一次最好成绩是不诚实的报均值加标准差才是工程习惯。6. 进阶残差建模与五步滚动验证习惯6.1 把 BP 挪到残差上灰色残差网络组合式灰色神经网络还有一种更稳的变体叫灰色残差网络。思路是先让 GM(1,1) 单独拟合原始序列的趋势部分得到一条指数曲线原始值减去趋势值得到残差序列再用 BP 网络对残差序列做滑动窗口回归。最终预测是灰色趋势外推加上网络预测的残差。这么做的好处是趋势由参数模型保证网络只负责估计非线性残差学习难度比直接学累加序列更低。% GM(1,1) 拟合前15个点得到趋势 y cumsum(x(1:trainEnd)); z 0.5 * (y(1:end-1) y(2:end)); % 紧邻均值生成 B [-z, ones(length(z), 1)]; u B \ x(2:trainEnd); a u(1); b u(2); % 累加趋势序列再累减得到原始趋势 trendAgo (k) (x(1) - b/a) * exp(-a*(k-1)) b/a; trend zeros(1, trainEnd); trend(1) x(1); for k 2:trainEnd trend(k) trendAgo(k) - trendAgo(k-1); end residual x(1:trainEnd) - trend; % 残差交给 BP 建模这段代码里\是 MATLAB 的最小二乘求解a、b 就是灰色微分方程的两个灰参数。用残差代替累加序列作为 BP 的预测目标后网络从“预测一个单调递增的量”变成“预测一个围绕零震荡的量”输出层的激活压力小很多。当你的序列里趋势很明确但局部波动也很大时这个变体通常比单纯 AGOBP 更稳。6.2 我的验证习惯先打 naive 再谈优化不管用哪种组合我的第一步永远是在验证集上跑一个最简单的基准用当前时刻的真实值当作下一时刻的预测也就是所谓 naive 预测。如果灰色神经网络连这个基准都打不过说明这个序列的规律性太弱或者模型结构选错了继续调参、上优化算法都是白费劲。只有明显跑赢 naive再谈滚动预测步数和误差优化。第二个习惯是每次只报告验证集指标训练集指标只用来排查错误不进入任何对比结论。我自己刚调这套模型时也翻过车盯着训练集 MAPE 调了整整一下午换到验证集才发现早就过拟合了那种黑匣子式的自我感动特别误事。从那以后所有时序预测代码里我都强制把验证集 MAPE 和 naive 基准打印在同一行一眼看清这个模型到底值不值得投入。希望帮到你。本文还有配套的精品资源点击获取
返回列表