ARTICLE DETAIL

资讯详情

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

GPR+贝叶斯网络+LSTM:给时序预测加上置信区间

GPR+贝叶斯网络+LSTM:给时序预测加上置信区间 简介这份资源面向机器学习与时间序列预测方向的研究者或进阶学习者整合了高斯过程回归、贝叶斯网络与长短期记忆网络的深度学习方法及MATLAB实现。内容包含高斯过程回归工具箱、两个LSTM预测演示脚本、配套函数库、示例数据与PDF教程可帮助读者理解非参数概率建模和序列建模的结合方式快速复现并改造为自定义预测任务。资源共278个文件以201个MATLAB脚本为主另有C/C源码、MEX编译文件、数据集和PDF文档压缩包仅1.73MB。MEX文件覆盖多种平台版本便于直接运行实验。已有606人浏览学习适合需要借助贝叶斯网络改进LSTM预测性能、应对小样本或高不确定性数据的场景。通过演示脚本与工具箱文档可掌握高斯过程回归与LSTM的建模流程、门控机制原理及参数调整思路并借助MATLAB完成从数据准备到模型评估的完整链路。1. 设备寿命预测里LSTM 为什么不给置信区间做过设备剩余寿命预测的人都遇到过这个场景LSTM 模型训练完预测曲线和真实值贴合得不错RMSE 也不高但现场工程师拿着结果问了一句「这个值上下浮动多少」你答不上来。因为标准 LSTM 输出的是一个点估计它告诉你第 500 天大概率剩 120 小时寿命却说不清这个 120 的误差范围是 ±5 还是 ±50。遇到小样本、强噪声的工业数据LSTM 的点估计甚至会给你一个非常自信的错误答案。把 Gaussian Process Regression 的不确定性输出、贝叶斯网络的变量依赖建模、LSTM 的非线性时序拟合接成一条管线恰好能补上这个缺口。GPR 负责给预测值配一个置信区间贝叶斯网络负责把输入变量之间的依赖关系捋清楚LSTM 负责把时序特征榨干。这篇笔记不绕弯子直接讲清楚三个模型各自解决什么问题、怎么组合起来做时间序列预测、参数怎么定、坑在哪。适合正在做设备寿命预测、负荷预测、故障预警或者想在 LSTM 预测结果上多一个「可靠度」维度的工程师。2. 先立住三个模型GPR 的不确定性、贝叶斯网络的依赖结构、LSTM 的非线性拟合2.1 GPR小样本下还能给出预测分布的回归方法高斯过程回归的核心不是「拟合一条曲线」而是「对函数本身做推断」。它假设目标函数 f(x) 服从一个高斯过程先验均值函数通常取 0协方差函数由核函数 k(x, x) 定义。给定训练数据后通过高斯过程的解析性质得到预测点的后验均值和后验方差。这个后验方差就是置信区间的来源也是 GPR 区别于普通回归方法最值钱的产出。GPR 的优势在小样本场景下特别明显。设备寿命预测往往只有几十台同型号设备的失效数据深度模型在这种数据量下容易过拟合而 GPR 是典型的非参数方法训练样本越少它的归纳偏置越强给出的区间反而越保守、越可靠。另一个优势是核函数的可解释性RBF 核告诉你样本越近相关性越强Matern 核允许你控制函数的平滑程度WhiteKernel 单独建模噪声。这些都是在模型里显式表达的假设调起来比调神经网络结构直观得多。代价也明确GPR 的复杂度是 O(n³)训练样本上到一万条就非常吃力。所以常见做法是把 GPR 用在残差建模或小样本场景而不是拿它直接拟合几十万条时序数据。我在实际项目里一般让 LSTM 处理主趋势GPR 负责对残差做概率建模两边各干各擅长的活。2.2 贝叶斯网络用有向无环图表达变量之间的条件依赖贝叶斯网络是一个有向无环图节点是随机变量边表示条件依赖关系。联合概率分布被分解成每个节点在给定父节点下的条件概率乘积P(X₁, X₂, …, Xₙ) ∏ P(Xᵢ | Pa(Xᵢ))。这个分解就是贝叶斯网络的精华——它把一个高维联合分布拆成了若干局部条件分布让建模和推断都变得可操作。在 LSTM 预测任务里贝叶斯网络的价值不在最终预测而在特征工程和结构解释。比如设备寿命预测中振动幅值、温度、电流、润滑压力这些变量不是相互独立的温度升高可能影响润滑油的黏度黏度变化又反映在振动特征上。直接用 LSTM 吃所有这些原始变量模型会自己学出一个隐式的依赖关系但这个关系不可解释你也很难判断哪个传感器是冗余的。用贝叶斯网络做结构学习可以从数据里学到变量之间的依赖图和条件独立性帮你回答「哪些传感器信号其实是一组」「哪个变量在统计意义上独立于标签」。这些结论可以直接指导 LSTM 的输入特征选择也可以作为异常检测的因果线索。动态贝叶斯网络DBN进一步把时间步建模进去适合处理时序依赖但复杂度上了一个台阶初学时先把静态结构跑通更重要。2.3 LSTM门控结构如何把长时序压缩成特征向量LSTM 解决的核心问题是长距离依赖。RNN 在反向传播时梯度会指数级衰减序列一长前面的信息就传不到后面。LSTM 在单元里加了输入门、遗忘门、输出门和一个细胞状态细胞状态像一条传送带门控决定哪些信息写入、哪些丢弃、哪些输出。这个机制让 LSTM 在数百步的序列上依然能保留早期的重要信息。在预测任务里LSTM 的输入是一个 (batch, seq_len, input_size) 的三维张量输出可以取最后一个时间步的隐藏状态也可以取所有时间步的输出序列。做单步预测通常取最后一个时间步接一个全连接层映射到预测值做序列到序列预测则用 Encoder-Decoder 结构。门控的代价是参数量变大、训练变慢而且对数据尺度非常敏感——后面踩坑章节会详细说这件事。深度学习的价值在这里体现得很直接LSTM 可以自动从原始传感器信号里提取特征不需要手动设计滞后变量或小波特征。但这也是它的黑匣子属性来源。所以在实际管线里我不会只丢一个 LSTM 就完事而是用贝叶斯网络约束输入、用 GPR 校准输出让每一层都有可解释的边界。2.4 为什么是这三者组合而不是换一个更「新」的模型Transformer、TCN、N-BEATS 这些模型在时序预测上都有不错的表现但在这个标题的场景里选 GPR 贝叶斯网络 LSTM 有明确的工程理由。第一LSTM 是工业界落地最成熟的深度时序模型PyTorch 直接调用不需要像 Transformer 那样调注意力头数和位置编码第二设备寿命预测的数据量通常不足以训练大模型LSTM 的参数量适中配合 GPR 的小样本建模能力正好互补第三贝叶斯网络补的是「可解释性」这块短板它让你能回答「为什么预测值会掉下来」而不是只能说「模型学到的」。三者的分工是一条清晰的流水线贝叶斯网络在前端做特征筛选和依赖关系建模LSTM 在中段做非线性时序压缩GPR 在后端做残差概率建模和置信区间输出。每一段的输入输出都是明确的张量或分布调试时可以单独验证每一段的效果而不是出了问题只能对着一个黑匣子干瞪眼。3. 搭一条可复现的预测管线滑窗、LSTM 训练、GPR 残差区间、贝叶斯网络选变量3.1 数据准备滑窗构造样本按时间顺序切分时序预测的第一步是把原始序列转成监督学习样本。常见做法是滑窗用过去 seq_len 个时间步预测下一个时间步。窗口长度就是常说的 lookback它是整个管线里第一个要拍的参数直接决定模型能看到的「记忆长度」。import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler def make_windows(data: np.ndarray, seq_len: int, horizon: int 1): 把一维或多维时序数据切成 (X, y) 监督样本 data: (n_samples, n_features) seq_len: 每个样本包含的历史步数 horizon: 预测未来第几个时间步 xs, ys [], [] for i in range(len(data) - seq_len - horizon 1): xs.append(data[i : i seq_len]) ys.append(data[i seq_len horizon - 1]) return np.array(xs), np.array(ys) # 示例温度、振动、电流三个特征用过去 48 步预测下一个时刻的温度 raw np.random.randn(2000, 3) # 替换为真实传感器数据 scaler MinMaxScaler(feature_range(0, 1)) raw_scaled scaler.fit_transform(raw) X, y make_windows(raw_scaled, seq_len48, horizon1) # X: (1953, 48, 3), y: (1953, 3)逻辑说明make_windows 的核心是维护滑窗的平移关系i 从 0 走到 len(data) - seq_len - horizon保证每个窗口都有完整的未来标签。horizon 参数用来控制预测步长horizon1 是单步预测horizon10 就是预测未来第 10 个时刻。返回值 X 是三维张量直接喂给 LSTM不需要再 reshape。参数说明seq_len 一般从数据周期性的 2~5 倍开始试比如传感器数据有 24 小时周期那就先取 48 或 72horizon 越大预测越难区间也应该越宽。归一化用 MinMaxScaler 是因为 LSTM 的激活函数对尺度敏感但注意必须先用训练集 fit 再 transform 测试集不能混在一起归一化否则就是数据泄露。切分数据还有一个铁律不能随机打乱必须按时间顺序切。前 70% 训练、后 30% 验证是最基本的做法后面避坑章节会专门讲这一点。3.2 LSTM 时序预测的 PyTorch 最小实现模型结构不追求花哨一个双层 LSTM 接一个全连接输出层足够应付大多数设备寿命预测场景。下面这份代码可以直接复制到 PyTorch 环境里跑通如果你的深度学习环境还没配好优先把 PyTorch 和 CUDA 版本对齐再继续。import torch import torch.nn as nn class LSTMPredictor(nn.Module): def __init__(self, input_size: int, hidden_size: int, num_layers: int, output_size: int, dropout: float 0.2): super().__init__() self.lstm nn.LSTM( input_sizeinput_size, hidden_sizehidden_size, num_layersnum_layers, batch_firstTrue, dropoutdropout if num_layers 1 else 0.0 ) self.reg nn.Linear(hidden_size, output_size) def forward(self, x): # x: (batch, seq_len, input_size) out, _ self.lstm(x) # out: (batch, seq_len, hidden_size)取最后一个时间步 last_step out[:, -1, :] return self.reg(last_step)训练循环用 Adam 优化器 MSE 损失批量大小按数据量定设备寿命预测这种小样本场景 batch_size 取 32~64 就够。def train_model(model, X_train, y_train, epochs100, lr1e-3, batch_size64): optimizer torch.optim.Adam(model.parameters(), lrlr) loss_fn nn.MSELoss() dataset_size X_train.shape[0] model.train() for epoch in range(epochs): perm np.random.permutation(dataset_size) total_loss 0.0 for i in range(0, dataset_size, batch_size): idx perm[i : i batch_size] xb torch.tensor(X_train[idx], dtypetorch.float32) yb torch.tensor(y_train[idx], dtypetorch.float32) optimizer.zero_grad() pred model(xb) loss loss_fn(pred, yb) loss.backward() nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0) optimizer.step() total_loss loss.item() if (epoch 1) % 20 0: print(fepoch {epoch 1}, loss {total_loss / (dataset_size // batch_size):.6f})逻辑说明训练循环里最容易被忽略的是梯度裁剪这一行。LSTM 在长序列上容易出现梯度爆炸clip_grad_norm_ 把梯度的 L2 范数限制在 1.0 以内这是 LSTM 训练的常规操作不加的话 loss 经常在某个 epoch 突然变成 NaN。perm 打乱的是训练样本的顺序注意不是打乱时间顺序每个样本内部的时序结构保持不变。参数说明input_size 等于特征维度比如 3 个传感器就是 3hidden_size 取 32~128 之间设备数据量小的时候 32 足够num_layers 取 2 是性价比最高的选择再深在小样本上只会过拟合output_size 等于预测目标维度单变量预测就是 1。学习率从 1e-3 起步loss 震荡就把 lr 降到 3e-4 重新训练。3.3 用 GPR 对残差建模补上置信区间LSTM 的预测值减去真实值得到残差序列。残差里往往还残留着 LSTM 没学到的局部波动和噪声模式。用 GPR 对残差建模核心目的有两个一是看残差里还有没有可利用的结构二是得到预测值的概率分布输出置信区间。from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import RBF, WhiteKernel, Matern # 假设用过去 10 个时间步的 LSTM 残差预测下一步残差 # X_res: (n_res_samples, 10)y_res: (n_res_samples, 1) kernel ( RBF(length_scale1.0, length_scale_bounds(1e-2, 1e2)) WhiteKernel(noise_level1e-3, noise_level_bounds(1e-6, 1e-1)) ) gpr GaussianProcessRegressor( kernelkernel, alpha1e-4, # 额外的数值稳定性噪声 normalize_yTrue, # 自动标准化目标值 n_restarts_optimizer5 ) gpr.fit(X_res, y_res) # 预测并返回均值与标准差 res_mean, res_std gpr.predict(X_res_test, return_stdTrue) # LSTM 点预测 GPR 残差分布 最终区间 pred_mean lstm_pred res_mean pred_lower lstm_pred res_mean - 1.96 * res_std pred_upper lstm_pred res_mean 1.96 * res_std逻辑说明RBF 核负责捕捉残差里的平滑局部相关WhiteKernel 把纯粹的随机噪声单独建模两者相加是时序残差建模最常见的核组合。1.96 是 95% 置信水平对应的标准正态分位数如果业务上需要 90% 区间就换成 1.645。gpr.fit 里 n_restarts_optimizer5 表示用 5 组不同的初始值去优化核函数的超参数避免陷入局部最优。参数说明length_scale 的初始值是参考性的拟合过程中会自动优化bounds 只要不设得太离谱就行alpha 是给协方差矩阵对角线加的微小正值纯粹为了数值稳定数据量小的时候可以设 0normalize_yTrue 必须开否则残差均值不为零时 GPR 的零均值先验会失效。预测阶段如果报 Cholesky 分解失败第一反应是检查训练数据里有没有重复样本或标准差为零的列。3.4 用贝叶斯网络筛变量别让模型吃太多无关输入LSTM 虽然能自动学特征但输入变量太多、相关性太弱时它会把容量浪费在拟合噪声上。用贝叶斯网络的结构学习先跑一遍把与目标变量条件独立的特征剔除再用筛选后的特征训练 LSTM效果通常比直接灌全部特征更稳定。from pgmpy.estimators import HillClimbSearch, BicScore from pgmpy.models import BayesianNetwork # data_df: pandas DataFrame每列一个传感器变量已经离散化或连续值 # 设备寿命场景建议把连续变量先分箱离散化结构学习更稳定 hc HillClimbSearch(data_df) best_model hc.estimate(scoring_methodBicScore(data_df)) print(best_model.edges()) # 输出示例: [(temp, vibration), (vibration, ruls), ...]逻辑说明HillClimbSearch 是常用的结构学习算法从一个空图开始每次加减一条边或反转方向用 BIC 分数衡量结构对数据的解释能力迭代到分数不再提升为止。BIC 分数天然包含复杂度惩罚项能防止学到过复杂的图结构。输出的边集就是变量之间的条件依赖关系你可以直接看目标变量比如 ru l s 剩余寿命的父节点有哪些那些和它没有路径相连的变量就可以考虑从 LSTM 输入里去掉。参数说明data_df 里如果包含连续变量BIC 打分时 pgmpy 内部会做离散化处理但分箱数会影响结果建议先用 pandas 的 qcut 把连续变量按分位数离散化成 3~5 档再交给结构学习。另一个常用选项是 scoring_methodExactScore数据量大时计算量会暴涨建议先跑 BIC。学出来的边只能解释为「统计依赖」不代表因果方向和业务常识冲突的边要人工修正pgmpy 的 set_edges 接口可以手动调整边的增删。4. 参数怎么调hidden_size、核函数、结构评分三个模型各看什么4.1 LSTMseq_len 和 hidden_size 先定学习率后调LSTM 的参数优先级是有先后顺序的。第一个定 seq_len也就是滑窗长度它决定模型能看到多长的历史。定 seq_len 有个实用技巧先画数据的自相关图自相关系数衰减到接近 0 的滞后阶数就是 seq_len 的下限如果数据有日周期至少取一个完整周期。定好之后不要频繁改它是整个管线的地基。第二个定 hidden_size这个参数和数据的复杂程度成正比但设备寿命预测这种小样本任务里32 和 64 的差距远没有想象中大。我习惯的做法是先取 32 跑通整个管线然后翻倍到 64 对比验证集损失如果提升不到 5% 就留在 32因为更大的 hidden_size 意味着更长的训练时间和更严重的过拟合风险。学习率和 batch_size 最后调。Adam 的默认学习率 1e-3 对大多数场景够用loss 曲线震荡就降一个量级到 1e-4同时把 batch_size 从 64 降到 32给优化器更多波动空间。一个血泪经验是不要同时调两个以上的参数每次只动一个记录验证集损失的变化否则你根本不知道是谁的功劳。4.2 GPR核函数是灵魂alpha 是噪声先验GPR 的预测质量几乎完全由核函数决定换核函数的效果远大于调任何超参数。做时序残差建模时我的默认选择是 RBF WhiteKernel理由很直接RBF 平滑、WhiteKernel 吸收噪声两者组合正好对应「信号 噪声」的数据假设。如果残差有明显的周期成分加一个 ExpSineSquared 核进去周期参数先按业务经验给初始值比如 24 小时周期就设 period24。length_scale 是这个核函数里最直观的参数——小 length_scale 表示函数波动剧烈大 length_scale 表示函数平缓。拟合过程会自动优化它你只需要给一个合理的搜索范围1e-2 到 1e2 是比较稳妥的默认值太窄会限制优化器的搜索空间太宽会导致优化不稳定。alpha 参数容易被忽略它是在协方差矩阵对角线上加的额外噪声项表示「数据本身的观测噪声」。alpha 设太大置信区间会整体变宽预测均值也向后验先验方向收缩设太小接近 0 时矩阵容易数值奇异。另一个值得注意的参数是 normalize_y残差均值不等于 0 的时候一定要设 True否则模型会默认目标均值是 0输出整体偏移。4.3 贝叶斯网络BIC 评分与边约束贝叶斯网络结构学习有两个关键选择评分函数和搜索策略。BIC 评分是首选因为它在拟合优度和模型复杂度之间取了平衡对小样本数据尤其重要。另一个常用评分是 K2它对先验更敏感但默认的 K2 实现里节点顺序是固定的对时序数据不一定成立。搜索策略上HillClimbSearch 是默认选择但要注意它收敛到的是局部最优。一个实用性做法是跑多次随机初始图对比每次学出的结构把稳定的边当作强依赖关系保留只在一次运行中出现的边当作噪声忽略。对样本量小于 500 的数据学出的结构本身就不够稳定不要指望它给出精确的因果图把它当成特征筛选工具更现实。4.4 参数速查表模型参数推荐初始值调参方向LSTMseq_len一个完整周期 × 2自相关衰减到 0 的滞后阶数LSTMhidden_size32翻倍对比验证集收益不足 5% 则保留小值LSTMnum_layers2小样本不建议超过 3 层LSTMlearning_rate1e-3loss 震荡则降到 1e-4LSTMbatch_size64数据量 1000 时降到 32GPRkernelRBF WhiteKernel残差有周期则加 ExpSineSquaredGPRlength_scale bounds(1e-2, 1e2)按数据波动幅度收窄GPRalpha1e-4区间过宽则减小数值奇异则增大贝叶斯网络scoring_methodBicScore数据量极小可对比 K2贝叶斯网络离散化分箱数3~5连续变量用 qcut 按分位数离散5. 避坑数据泄露、复制粘贴预测、协方差奇异五个血泪记录5.1 踩坑一验证集混进未来数据指标虚高到不敢信现象模型在验证集上的 RMSE 远低于业务预期曲线拟合得像是抄了答案但一上真实数据就原形毕露。原因做数据预处理时先对全量数据做了归一化和滑窗再切分训练集和验证集。归一化时 MinMaxScaler 用了全量数据的最大值和最小值验证集的信息已经通过归一化参数泄漏进了训练过程。更隐蔽的另一种泄漏是滑窗时窗口跨过了切分点训练集最后几个窗口包含了验证集开头的数据。解决所有预处理都在切分之后做。先按时间切出训练集和测试集再分别用训练集的统计量执行归一化。滑窗也要在切分后各自执行保证训练集和验证集没有任何重叠窗口。检查方法很简单打印训练集和验证集的时间戳范围确认没有交叉。5.2 踩坑二预测退化成「复制粘贴」输出比输入滞后一拍现象训练 loss 收敛得很漂亮但画预测曲线时发现预测值几乎是上一个时刻真实值的平移整体滞后了一个时间步。这个现象在金融时序和工业时序预测里都特别常见。原因模型学到了一个捷径——用当前时刻的值去预测下一时刻因为对于平滑变化的时序这比学习真实动态规律要容易得多。LSTM 的损失函数只惩罚数值误差不惩罚「没有学到动态」这件事。解决最有效的办法是预测多步而不是单步哪怕你最终只需要单步预测训练时也把 horizon 设为 3~5让模型被迫学习跨多步的动态规律。另一个做法是在损失上叠加一阶差分项惩罚预测趋势与真实趋势的偏差。判断是否中招的标准也很简单计算预测值和输入序列最后一个值的相关系数如果接近 1基本就是复制粘贴了。5.3 踩坑三GPR 报 Cholesky 分解失败协方差矩阵奇异现象GPR 拟合时报 numpy.linalg.LinAlgError或者 sklearn 提示 Kernel is not positive definite。原因训练数据里存在完全重复的样本或者某个特征的方差接近 0导致核矩阵的秩亏缺。另一个常见来源是核函数的 length_scale 初始值设得太小比如默认值附近出现数值溢出协方差矩阵对角线被极小值主导矩阵条件数爆炸。解决先检查数据删除完全相同的行再把 alpha 从 1e-4 上调到 1e-2 试试给对角线加一点数值稳定性最后检查核函数的 length_scale_bounds下限不要低于 1e-3。如果数据量超过 5000考虑只用最近 N 条残差训练 GPR既能缓解奇异问题也能让小样本区间估计更符合时序的局部特性。5.4 踩坑四贝叶斯网络在小样本下学到反向依赖现象结构学习输出的边方向与业务常识完全相反比如温度应该影响振动学出来的图却是振动指向温度。原因BIC 评分在小样本下对方向的区分能力很弱条件独立测试的统计功效不足。更麻烦的是pgmpy 的 HillClimbSearch 做边反向操作时只认评分不认因果两个方向评分接近时它会随机选一个。解决不要指望纯数据驱动学出因果方向。先让业务工程师给出一组「必须存在」的边作为约束比如温度 → 振动然后用 pgmpy 的 EdgeTester 或手动调整去固定这些边只让算法在其余变量之间搜索结构。另一个退一步的做法是放弃方向只用贝叶斯网络做无向依赖分析把学到的邻接关系当作特征筛选依据。5.5 踩坑五归一化不一致训练正常推理全崩现象训练和验证都很好但部署后模型对新数据预测全偏或者输出惨不忍睹。原因推理时的归一化参数和训练时不一致。最常见的是部署脚本里重新 fit 了一个 MinMaxScaler或者把训练时保存的 scaler 文件用错。还有一个隐蔽场景新数据流里出现了训练集中从未见过的极大值超出归一化范围后被截断到 1.0。解决训练完成后把 scaler 和模型一起保存部署时只 load 不 fit。对新数据的极端值要单独做鲁棒化处理——把归一化从 MinMaxScaler 换成 RobustScaler它基于中位数和四分位距对离群值没那么敏感。这个坑几乎每次上线都会踩一次提前处理能省下大量排查时间。6. 进阶混合架构与区间质量验证用 PICP 和 MPIW 说话三段模型各自跑通之后下一步是把它们拼成一个完整的混合架构贝叶斯网络从原始传感器变量里筛出依赖关系较强的特征子集数据滑窗后进入 LSTM 提取时序特征并产生点预测GPR 对 LSTM 残差拟合出残差的均值和方差最后合成为带置信区间的预测输出。拼装顺序我建议从后往前验证先单独检验 GPR 残差区间是否合理再检查 LSTM 点预测的误差水平最后才调贝叶斯网络的特征筛选否则问题会互相掩盖。区间质量验证是概率预测里最容易做错的一步。只看 RMSE 无法评价置信区间的好坏需要同时看两个指标PICP 衡量区间覆盖率即真实值落在预测区间内的比例理论上应接近设定的置信水平MPIW 衡量区间宽度区间过宽虽然覆盖率达标但毫无实用价值。两个指标矛盾时优先保证 PICP 不显著低于置信水平再收窄 MPIW。import numpy as np def picp(y_true: np.ndarray, y_lower: np.ndarray, y_upper: np.ndarray) - float: 预测区间覆盖率真实值落在区间内的比例越接近置信水平越好 return np.mean((y_true y_lower) (y_true y_upper)) def mpiw(y_lower: np.ndarray, y_upper: np.ndarray) - float: 平均预测区间宽度区间太宽说明预测没有区分度 return np.mean(y_upper - y_lower) # 使用示例置信水平 95%PICP 应接近 0.95MPIW 越小越好 assert picp(y_true, pred_lower, pred_upper) 0.9 print(fPICP: {picp(y_true, pred_lower, pred_upper):.3f}) print(fMPIW: {mpiw(pred_lower, pred_upper):.3f})逻辑说明PICP 是覆盖率指标0.95 置信水平下低于 0.9 就说明区间过窄模型过于自信MPIW 是效率指标在保证覆盖率的前提下越窄越好。两个指标要一起看只报 PICP 不报 MPIW 的结论都是耍流氓。设备寿命预测这类场景里安全余量设计本质上就是在 PICP 和 MPIW 之间做权衡——现场更关心下限值那就把 95% 区间的下限当作保守可用寿命而 MPIW 决定了这个保守值有多「紧」。我在实际项目里留下的习惯是每次训练完先打印这两个指标再决定要不要调 GPR 的 alpha 和核函数而不是直接改 LSTM 结构。因为区间质量变差时九成问题出在残差建模这一环调 LSTM 只会让事情更糟。这套三模型管线跑通之后你手上就不再只有一个光秃秃的预测值而是一个能回答「大概在什么范围、可靠度多高」的完整预测方案。希望帮到你。本文还有配套的精品资源点击获取
返回列表