拓冰建站拓冰建站
首页 / 资讯中心 / 正文

贝叶斯机器学习中CRPS:评估概率预测准确性与不确定性的核心指标

1. 项目概述为什么我们需要CRPS在贝叶斯机器学习的实战中我们常常会陷入一个困境模型训练好了后验分布也采样出来了但怎么评价这个模型的好坏呢特别是当模型的输出不是一个确定的点而是一个完整的概率分布时传统的均方误差MSE、平均绝对误差MAE这些“点估计”评分函数就显得力不从心了。它们只关心预测的“中心”准不准却完全忽略了模型对自己预测的“信心”或者说“不确定性”的刻画。这就像你问一个气象预报员明天是否下雨他如果只给你一个“50%概率”的答案用“对/错”来评判他显然是不公平的。我们需要一个能同时衡量预测的“准确性”和“不确定性校准度”的标尺这就是连续分级概率评分Continuous Ranked Probability Score, CRPS登场的背景。CRPS的核心价值在于它直接比较模型预测的累积分布函数CDF与观测值的真实分布一个阶跃函数。一个理想的预测模型其预测分布应该与真实数据的生成分布一致。CRPS通过计算这两个CDF之间差异的平方积分为我们提供了一个单一、可解释的数值来量化这个“一致程度”。分数越低说明预测分布与真实情况越吻合模型越好。它不仅是评估贝叶斯模型预测性能的利器在概率天气预报、金融风险量化、资源调度等需要对不确定性进行定价的领域CRPS已经成为事实上的标准评估指标。接下来我将拆解CRPS的数学内核、计算方法、实战应用以及那些容易踩坑的细节。2. CRPS的数学内核与直观理解要真正用好CRPS不能只把它当做一个黑箱评分函数。理解其数学形式背后的直觉能帮助我们在模型选择、超参数调优时做出更明智的判断。2.1 从定义式看本质CRPS最通用的定义是针对预测分布F和观测值x的[ CRPS(F, x) \int_{-\infty}^{\infty} [F(y) - \mathbb{1}(y \geq x)]^2 dy ]这里F(y)是我们模型预测的累积分布函数而 (\mathbb{1}(y \geq x)) 是观测值x的“真实”CDF它是一个从0跳到1的阶跃函数。这个公式非常直观它计算了预测CDF与真实CFF在整个实数轴上的“距离”以L2范数衡量。为什么是平方积分平方运算确保了差异的惩罚是凸的并且处处可微这在优化过程中非常友好。积分则意味着我们关心的是整个预测分布的形状而不是某个特定的分位数。如果预测分布过于分散不确定度过高那么它的CDF曲线会缓慢上升与陡峭的真实阶跃函数差异很大导致积分值大CRPS高。反之如果预测分布过于集中过度自信但中心偏离了真实值其CDF曲线会在错误的位置快速上升同样会导致与阶跃函数的大面积差异。一个生活化类比想象预测分布是你对朋友到达时间的估计。你画了一条概率曲线9点到的可能性低曲线平缓10点到的可能性最高曲线陡升11点后可能性又降低。朋友的真实到达时间比如10:30则像一把垂直的刀在10:30处将概率曲线切开。CRPS衡量的就是你画的整条概率曲线与这把“刀”所定义的理想阶跃曲线之间的贴合程度。曲线形状越符合“刀”的位置和陡峭程度你的预测就越准、越自信恰当CRPS就越低。2.2 关键性质为什么它优于其他指标与MAE的关联当预测分布F退化为一个确定的点预测即狄拉克δ函数时CRPS就退化为了平均绝对误差MAE。这意味着CRPS是MAE在概率预测框架下的自然推广。一个好的概率预测模型的CRPS应该至少比其点估计如后验均值的MAE要小这体现了利用不确定性信息带来的价值。公平性Proper Scoring Rule这是CRPS作为评分函数最核心、最优秀的性质。一个“Proper”的评分规则意味着如果你的模型确实掌握了真实的数据生成分布G那么用G作为预测所得到的期望分数将优于任何其他分布F。用大白话说诚实汇报你的真实信念从长远看是最优策略。这防止了模型通过“作弊”例如总是输出一个非常分散的分布来规避错误来获得一个好的分数。可解释性CRPS的单位与观测值的单位相同例如预测温度误差是摄氏度预测股价误差是美元。这使得不同模型、不同数据集之间的CRPS值可以直观比较。一个CRPS降低0.5的模型改进其意义可以直接理解为“平均预测误差减少了0.5个单位”。注意CRPS是“分数越低越好”的评分规则这与似然函数对数似然值越大越好正好相反。在报告结果时务必明确说明。3. 实战计算从理论公式到代码理论很优美但落到代码上我们如何计算CRPS呢这取决于你得到的预测分布F以何种形式呈现。3.1 当预测是参数分布时解析解或数值积分如果你的模型直接输出分布参数例如高斯分布的均值和方差那么对于某些分布CRPS有解析解。最经典的例子高斯分布假设预测分布为 ( N(\mu, \sigma^2) )观测值为x则其CRPS为[ CRPS(N(\mu, \sigma^2), x) \sigma \left[ \frac{x-\mu}{\sigma} (2\Phi(\frac{x-\mu}{\sigma}) - 1) 2\phi(\frac{x-\mu}{\sigma}) - \frac{1}{\sqrt{\pi}} \right] ]其中(\Phi) 和 (\phi) 分别是标准正态分布的CDF和PDF。这个公式可以直接向量化计算效率极高。import numpy as np from scipy.stats import norm def crps_gaussian(mu, sigma, x): 计算高斯分布预测的CRPS。 参数: mu: 均值形状 (n_samples,) 或标量 sigma: 标准差形状同mu x: 观测值形状同mu 返回: CRPS值 # 标准化误差 z (x - mu) / sigma # 标准正态的CDF和PDF phi norm.pdf(z) Phi norm.cdf(z) # 套用解析公式 crps sigma * (z * (2 * Phi - 1) 2 * phi - 1/np.sqrt(np.pi)) return crps对于其他参数分布如拉普拉斯分布、逻辑分布等也可能存在解析解或半解析解需要查阅相关文献。如果没有解析解就需要退回到数值积分方法直接对定义式进行离散化计算。3.2 当预测是样本集合时经验CDF法在贝叶斯机器学习中更常见的情况是我们通过MCMC采样或变分推断得到了来自后验预测分布的一组样本 ( {y^{(1)}, y^{(2)}, ..., y^{(S)}} )。此时预测分布F由这些样本构成的经验分布函数ECDF来近似。[ \hat{F}S(y) \frac{1}{S} \sum{i1}^{S} \mathbb{1}(y^{(i)} \leq y) ]在这种情况下CRPS有一个非常高效且稳定的计算公式基于样本的排序[ CRPS(\hat{F}S, x) \frac{1}{S} \sum{i1}^{S} |y^{(i)} - x| - \frac{1}{2S^2} \sum_{i1}^{S} \sum_{j1}^{S} |y^{(i)} - y^{(j)}| ]这个公式包含两项第一项是样本与观测值的平均绝对距离第二项是样本内部两两距离的平均值的一半。第二项可以理解为对预测分布“离散程度”的惩罚。计算时通常先对样本 (y^{(i)}) 进行排序可以将计算复杂度从 (O(S^2)) 优化到 (O(S \log S))。def crps_ensemble(ensemble, x): 计算基于样本集合经验分布的CRPS。 参数: ensemble: 预测样本形状 (n_samples,) x: 观测值标量 返回: CRPS值 ensemble np.sort(ensemble) S len(ensemble) # 第一项样本与观测值的平均绝对距离 term1 np.mean(np.abs(ensemble - x)) # 第二项样本内部两两距离的平均值利用排序优化计算 # 对于排序后的数组a sum_{i,j} |a_i - a_j| 2 * sum_{i1}^{S} (2i - S - 1) * a_i i np.arange(1, S 1) term2_inner_sum np.sum((2 * i - S - 1) * ensemble) term2 term2_inner_sum / (S ** 2) crps term1 - 0.5 * term2 return crps实操心得当样本量S很大时例如1000直接计算两两距离的第二项会非常慢。务必使用上述基于排序的优化算法。此外确保你的样本是独立同分布的如果样本来自MCMC且自相关性很高可能需要先进行稀释thinning以获得有效的独立样本数否则会低估预测分布的真实宽度导致CRPS计算有偏。3.3 批量计算与平均在实际评估中我们通常有一个测试集包含N个观测值 ( {x_1, ..., x_N} )以及对应的N个预测分布。我们需要计算每个数据点的CRPS然后取平均得到模型的整体性能指标[ \overline{CRPS} \frac{1}{N} \sum_{n1}^{N} CRPS(F_n, x_n) ]这个平均CRPS就是模型在测试集上的最终得分。4. 在贝叶斯机器学习工作流中的应用CRPS不是一个孤立的评估指标它应该被深度集成到贝叶斯建模的整个生命周期中。4.1 模型比较与选择假设你在为一个时间序列预测问题尝试几种不同的贝叶斯模型模型A线性回归贝叶斯模型。模型B高斯过程回归模型。模型C贝叶斯神经网络。在同一个测试集上你可以分别计算三个模型后验预测分布的 (\overline{CRPS})。分数最低的模型其预测分布整体上最贴近真实数据的生成过程。这比单纯比较RMSE或MAE更有说服力因为它考虑了不确定性。例如模型A的RMSE可能略好于模型B但模型B的CRPS显著更低这说明模型B更好地捕捉了预测的不确定性在需要风险规避的决策场景下模型B是更优的选择。4.2 超参数调优CRPS可以作为超参数优化的目标函数。例如在高斯过程中核函数的长度尺度length-scale和方差variance是关键超参数。你可以使用贝叶斯优化恰好这也是一个热词来寻找最小化验证集 (\overline{CRPS}) 的超参数组合。# 伪代码示例使用Optuna以CRPS为目标优化GP超参数 import optuna import gpflow from your_crps_module import calculate_avg_crps def objective(trial): lengthscale trial.suggest_loguniform(lengthscale, 0.1, 10.0) variance trial.suggest_loguniform(variance, 0.1, 5.0) # 构建带有建议超参数的GP模型 kernel gpflow.kernels.RBF(variancevariance, lengthscaleslengthscale) model gpflow.models.GPR(data(X_train, y_train), kernelkernel) # 在验证集上获取后验预测分布的样本 samples model.predict_f_samples(X_val, num_samples1000) # 计算平均CRPS avg_crps calculate_avg_crps(samples, y_val) return avg_crps study optuna.create_study(directionminimize) study.optimize(objective, n_trials50) print(f最佳超参数: {study.best_params}, 最佳CRPS: {study.best_value})4.3 不确定性分解与诊断CRPS的分解形式可以帮助我们诊断模型的不足。CRPS可以近似分解为“不确定性”Uncertainty、“分辨率”Resolution和“可靠性”Reliability三个部分但这通常需要将数据分组到不同的预测概率区间。更实用的方法是可视化分析绘制概率积分变换图对于每个观测值x_n计算其在对应预测CDFF_n处的值 ( u_n F_n(x_n) )。如果预测是完美的那么 ( u_n ) 应该服从标准均匀分布 U(0,1)。绘制 ( u_n ) 的直方图或经验CDF可以直观检查预测分布的校准程度是否过于自信或自信不足。绘制分位数-分位数图比较预测分布的分位数与观测值的经验分位数。如果点大致落在对角线上说明预测分布校准良好。如果点在对角线上方说明模型预测偏小。如果点在对角线下方说明模型预测偏大。这些诊断工具与CRPS结合使用可以告诉你模型在哪里出了问题是系统性偏差可靠性差还是无法区分不同情况分辨率低亦或是整体不确定性估计不准。5. 常见陷阱、疑难排查与进阶技巧即使理解了原理和计算在实际应用中依然会遇到各种问题。以下是我在实践中总结的一些坑和应对策略。5.1 样本量不足导致的评估噪声问题当后验预测分布的采样数S太少时例如100基于经验CDF计算的CRPS会不稳定方差很大导致模型比较的结果不可靠。解决方案增加采样数这是最直接的方法。对于关键模型比较建议S 1000。虽然计算量增加但评估结果更稳健。使用参数化计算如果后验预测分布可以很好地用某个参数分布如高斯分布近似那么直接拟合该分布并采用解析公式计算CRPS通常比用少量样本更稳定。重复计算与置信区间对每个测试点用不同的随机种子多次采样计算CRPS然后汇报其均值和标准差或置信区间以反映评估本身的不确定性。5.2 数据尺度的影响与标准化问题CRPS的值依赖于数据的原始尺度。在特征量纲差异巨大的多变量预测中或者当比较不同数据集上的模型时直接比较原始CRPS没有意义。解决方案标准化CRPS将计算出的CRPS除以观测值的标准差或平均绝对偏差得到一个无量纲的相对分数。例如标准化CRPS (\overline{CRPS} / \text{std}(y_{\text{test}}))。这个值越接近0越好大于1则说明模型比直接用历史均值预测还要差。使用技能分数与一个基准模型如气候学模型、持久性模型的CRPS进行比较。CRPS技能分数定义为 [ SS 1 - \frac{CRPS_{\text{model}}}{CRPS_{\text{baseline}}} ] SS 0 表示模型优于基准SS 1 表示完美预测。这是气象领域常用的报告方式。5.3 处理极端值与分布尾部问题CRPS对分布尾部的行为比较敏感。如果真实数据中存在极端值异常值而模型的预测分布尾部较薄会导致该点的CRPS异常高从而拉高整体平均分。排查与应对检查计算每个测试点的CRPS贡献找出“CRPS异常值”。分析观察这些点对应的预测分布。是预测均值严重偏离还是预测方差太小模型层面考虑使用具有厚尾部的似然函数如学生t分布似然而不是高斯分布似然。这能让模型在预测时自然地给极端值分配更高的不确定性。评估层面如果极端值确实是不可预测的噪声可以考虑使用截断CRPS只积分到某个分位数如99%或者使用更稳健的评分规则如分位数评分Quantile Score的聚合。5.4 高维与多变量输出的挑战问题当预测目标是多维向量时例如预测未来24小时每小时的温度如何定义总的CRPS常见方案各维度独立求和分别计算每个维度的CRPS然后求和或取平均。这假设各维度预测是独立的忽略了维度间的相关性。使用能量分数能量分数是CRPS在多变量情况下的一个推广。对于样本集合 ({y^{(i)}}) 和观测值 (x)能量分数定义为 [ ES(F, x) \frac{1}{S}\sum_{i1}^{S} | y^{(i)} - x | - \frac{1}{2S^2} \sum_{i1}^{S}\sum_{j1}^{S} | y^{(i)} - y^{(j)} | ] 其中 (| \cdot |) 通常是欧几里得范数。它考虑了变量间的依赖结构但计算成本更高且对范数的选择敏感。5.5 与对数评分的比较与选择另一个常用的Proper Scoring Rule是对数评分即预测分布在观测值处的对数概率密度Log-Likelihood。它和CRPS各有优劣特性CRPS对数评分敏感性对预测分布的整个形状敏感尤其是中心部分。对预测分布在精确观测值处的概率密度高度敏感。稳健性对极端值相对更稳健因为是L2距离积分。对极端值/异常值非常敏感一个离谱的预测会导致对数分数趋于负无穷。计算对于样本形式有稳定高效的计算公式。需要估计概率密度对于样本形式可能需要核密度估计引入带宽超参数。可解释性单位与数据相同易于解释。单位是“纳特/位”比较抽象。适用场景通用性强尤其适合连续型预测和决策。特别适合强调模型“精准命中”观测值能力的场景。选择建议在大多数回归和预测任务中CRPS是更通用、更稳健的选择。当你的模型假设似然函数非常明确且你极度关心模型对观测数据本身的拟合优度时可以使用对数评分。在实践中同时汇报两者可以提供更全面的模型性能画像。6. 性能优化与工程实践在大规模数据集或需要实时评估的场景下CRPS的计算可能成为瓶颈。以下是一些优化技巧。向量化计算无论是解析公式还是样本公式都要利用NumPy等库的向量化操作避免Python层级的循环。对于批量计算N个测试点的CRPS应将数据组织为 (N, S) 的数组进行操作。近似计算当样本数S极大时精确计算样本CRPS公式中的第二项两两距离和代价高昂。可以采用随机子采样Random Subsampling的方法从S个样本中随机抽取M个例如 M500来计算第二项作为全样本的近似。这能大幅降低计算量且对最终的平均CRPS影响很小。利用GPU加速如果使用PyTorch或JAX等框架可以将样本数据放在GPU上并利用其并行计算能力加速距离矩阵的计算尽管仍需注意 (O(S^2)) 的内存消耗。缓存与预计算在超参数调优等需要反复计算CRPS的场景下如果预测样本不随某些超参数变化例如在集成学习中可以预先计算好样本内部的第二项在循环中只计算随观测值变化的第一项。7. 总结与个人体会CRPS不仅仅是一个评分函数它代表了一种评估哲学在不确定性的世界里一个好的预测应该是一个诚实的概率分布。在贝叶斯机器学习的项目中从模型设计、训练到最终部署将CRPS作为核心的评价和优化目标能迫使你的模型不仅学会“猜答案”更学会“评估自己猜的把握”。我个人最深刻的体会是关注CRPS能帮你发现那些被点估计指标掩盖的模型缺陷。我曾有一个金融波动率预测模型其RMSE与基准模型相差无几但CRPS却明显更优。深入分析发现我的模型在市场平静期和动荡期给出了更合理的不确定性估计这使得它在下游的风险价值计算中表现出了巨大的优势。这正是概率预测的价值所在。最后一个小技巧在团队报告结果时除了给出平均CRPS不妨附上一张可靠性示意图。这张图能直观地向非技术背景的伙伴展示“我们的模型有多靠谱”往往比一个抽象的数字更有说服力。记住贝叶斯建模的终极产品是“可用的不确定性”而CRPS是衡量这份产品品质的一把不可或缺的卡尺。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门