尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

贝叶斯机器学习中的CRPS:从概率预测评估到模型优化实战

贝叶斯机器学习中的CRPS:从概率预测评估到模型优化实战 1. 从预测到评估为什么我们需要CRPS在贝叶斯机器学习的实践中我们常常会陷入一种“自嗨”的境地模型训练得很顺利后验分布画得也很漂亮损失函数曲线一路向下看起来一切完美。但当我们拿着这个模型去做实际预测时比如预测明天的气温、预测股票的下一个波动或者预测一个复杂系统的状态问题就来了——我们如何判断这个模型给出的一整套概率预测而不仅仅是一个点估计到底准不准这就是传统评分函数比如均方误差MSE或平均绝对误差MAE的盲区。它们只关心你预测的那个“最可能的值”比如后验均值或中位数和真实值之间的差距。但贝叶斯模型的精髓在于其不确定性量化它输出的不是一个数字而是一个完整的概率分布。MSE会完全忽略这个分布的形状、方差和尾部信息。一个预测分布很“瘦”自信但预测均值偏离真实值很远的模型和一个预测分布很“胖”不确定但预测均值恰好蒙中真实值的模型用MSE来评价后者可能得分更高。但这显然不合理前者虽然猜错了但它诚实地表达了“我不确定”后者虽然蒙对了但它的不确定性评估是失灵的下次很可能就猜不中了。连续分级概率评分Continuous Ranked Probability Score, CRPS就是为了解决这个问题而生的。它不是一个新概念在气象预报、经济预测等领域已经应用了几十年但在贝叶斯机器学习社区其重要性正被越来越深刻地认识到。简单来说CRPS衡量的是你预测的累积分布函数CDF与代表真实值的“退化”CDF之间的差距。你可以把它理解为一种概率预测版本的“距离”这个距离越小说明你的概率预测整体上越准确、越校准。我最初接触CRPS是在一个时间序列预测项目里。我们用了高斯过程回归Gaussian Process Regression, GPR模型它天然地输出每个预测点的均值和方差即一个高斯分布。项目方不仅想知道明天的销量是多少更想知道“销量在某个区间内的可能性有多大”以便进行库存的风险管理。这时汇报MSE毫无意义而CRPS成为了我们模型“比武”的唯一擂台。它迫使模型不仅在点估计上要准在不确定性估计上也要诚实可靠。2. CRPS的数学内核它到底在计算什么要真正用好CRPS不能只把它当做一个黑箱评分函数。理解其数学形式能帮助我们在模型设计、损失函数构建时更有方向。CRPS的定义基于预测分布的累积分布函数 ( F(y) ) 和真实观测值 ( x ) 的指示函数 ( \mathbb{1}_{x \leq y} )。对于一次预测其CRPS计算公式为[ CRPS(F, x) \int_{-\infty}^{\infty} [F(y) - \mathbb{1}_{x \leq y}]^2 dy ]这个公式初看有点抽象我们来拆解一下( F(y) ) 这是我们模型预测的CDF。例如如果预测是正态分布 ( N(\mu, \sigma^2) )那么 ( F(y) \Phi(\frac{y-\mu}{\sigma}) )其中 ( \Phi ) 是标准正态分布的CDF。( \mathbb{1}_{x \leq y} ) 这是真实值 ( x ) 的“理想”CDF也叫作Heaviside阶跃函数。它在 ( y x ) 时为0在 ( y \geq x ) 时跃变为1。你可以把它想象成一个在 ( x ) 处垂直上升的台阶。( [F(y) - \mathbb{1}_{x \leq y}]^2 ) 计算的是在每一个 ( y ) 值上我们预测的CDF与“理想”CDF的平方差。最后的积分 将这个平方差在所有实数域上求和积分。积分值越小说明我们的预测CDF ( F(y) ) 在整体形状上越贴近那个在真实值处陡升的“理想”台阶。一个直观的几何解释是CRPS计算的是预测CDF曲线与那个“理想”阶跃函数曲线之间所夹区域的面积。预测越准、越确定分布越窄这个面积就越小。对于某些常见的分布CRPS有解析解这大大方便了计算**对于高斯分布 ( N(\mu, \sigma^2) ) ** [ CRPS(N(\mu, \sigma^2), x) \sigma [ \frac{x-\mu}{\sigma} (2\Phi(\frac{x-\mu}{\sigma}) - 1) 2\phi(\frac{x-\mu}{\sigma}) - \frac{1}{\sqrt{\pi}} ] ] 其中 ( \phi ) 是标准正态分布的概率密度函数PDF。这个公式告诉我们CRPS同时依赖于标准化误差 ( (x-\mu)/\sigma ) 和分布的标准差 ( \sigma )。当预测完全准确( \mu x )且绝对确定( \sigma \to 0 )时CRPS趋近于0。对于经验分布例如来自MCMC或深度集成模型的样本 当我们没有参数化分布只有一组后验样本 ( {y_1, y_2, ..., y_N} ) 时CRPS可以通过以下公式近似计算 [ \widehat{CRPS} \frac{1}{N} \sum_{i1}^{N} |y_i - x| - \frac{1}{2N^2} \sum_{i1}^{N} \sum_{j1}^{N} |y_i - y_j| ] 这个形式非常实用第一项是后验样本与真实值的平均绝对误差第二项是后验样本内部的平均两两绝对差可以理解为对分布“宽度”的度量。CRPS鼓励的是第一项要小预测中心要准但同时第二项不能无限制地小不能为了分数而强行让分布变窄。它自动在“准确性”和“不确定性校准”之间取得了平衡。注意在实际编程中尤其是面对大规模样本时直接计算双求和项的计算复杂度是 ( O(N^2) )可能会很慢。通常可以采用对样本排序后利用公式优化或者使用一些开源库如properscoring库中的高效实现。3. CRPS vs. 其他评分函数在什么场景下它是唯一选择理解了CRPS是什么我们还需要知道它比别的工具强在哪里以及它的局限。这样我们才能在做模型评估时做出正确选择。3.1 与点估计评分函数的对比这是我们最需要厘清的区别。假设我们有一个预测分布我们从中提取了一个点估计如均值 ( \mu )用于汇报。评分函数输入评估对象局限性在概率预测背景下均方误差 (MSE)预测均值 ( \mu ), 真实值 ( x )点估计的准确性完全忽略预测分布的形状和方差。可能奖励“蒙对”但校准差的模型。平均绝对误差 (MAE)预测中位数, 真实值 ( x )点估计的准确性同上。对异常值更鲁棒但仍不评估不确定性。连续分级概率评分 (CRPS)预测分布 ( F ) 或样本, 真实值 ( x )整个概率预测的准确性计算相对复杂需要分布信息或大量样本。核心结论如果你的业务决策只依赖于一个“最优猜测”点估计那么MSE/MAE是合适的。但如果你的决策需要考虑风险例如“销量低于阈值的概率超过10%就要预警”那么评估整个预测分布的CRPS是必不可少的。3.2 与对数评分Log Score和间隔评分的对比在概率预测领域CRPS并非独苗。对数评分Log Score也是一个经典且理论性质良好的评分规则。对数评分 ( LogS(F, x) -\log f(x) )其中 ( f ) 是预测分布的概率密度函数PDF。它直接评估真实值在预测分布下的对数似然。优点 具有严格的局部性Local Properness只依赖于真实值处的概率密度。在模型比较和贝叶斯模型平均中理论根基深厚。缺点 对预测分布的尾部行为极度敏感。如果真实值落在你预测分布的尾部即使只是稍微偏离中心( f(x) ) 会变得非常小导致对数评分惩罚极其严厉趋向无穷大。这在实践中可能过于严苛尤其是当模型有轻微的重尾或偏斜时。CRPS优点 具有距离敏感性。它考虑的是整个CDF的差距因此对预测分布的校准Calibration和锐度Sharpness的平衡有更好的度量。它对异常值的敏感度低于对数评分。从经验公式看它本质上是衡量一个“能量”距离。缺点 不具备局部性。一个在真实值处概率密度很低但在其附近迅速升高的分布CRPS可能仍然不错但这可能暗示分布形状怪异。如何选择如果你的预测目标是整个分布且希望评估其对所有可能事件的整体预测性能CRPS通常是更稳健、更实用的选择。如果你非常关心模型对极端事件如金融风险中的巨亏的预测能力并且能确保模型分布形式正确对数评分可能更能凸显差异但需要小心解释。在实践中我通常会同时计算CRPS和对数评分。如果两者趋势一致则结论强健如果出现分歧就需要深入分析模型预测分布的细节看是哪个评分规则更贴合当前的实际业务需求。4. 在贝叶斯机器学习工作流中集成CRPS理论说得再多不如一行代码。CRPS如何无缝嵌入到我们的建模、训练和评估流程中这里我以PyTorch和Python生态为例分享几个关键环节的实操经验。4.1 作为训练损失函数在深度学习中我们可以直接使用CRPS作为损失函数来训练一个输出概率分布的神经网络。这被称为核评分规则Kernel Score或能量评分Energy Score在样本形式下的应用。对于输出多元分布的模型这是更通用的形式。假设我们的模型输出一个高斯分布的参数均值和方差我们可以实现一个可微的CRPS损失import torch import torch.distributions as dist import math def crps_loss_gaussian(pred_mean, pred_std, target): 计算高斯分布预测下的CRPS损失。 pred_mean: 预测均值 [batch_size, ...] pred_std: 预测标准差 [batch_size, ...] (确保为正数如用softplus激活) target: 真实值 [batch_size, ...] 返回: CRPS标量 # 标准化误差 z (target - pred_mean) / (pred_std 1e-8) # 加小量防止除零 # 标准正态CDF和PDF phi torch.distributions.Normal(0, 1).cdf(z) pdf_val torch.exp(-0.5 * z**2) / math.sqrt(2 * math.pi) # 高斯分布CRPS解析公式 crps pred_std * (z * (2 * phi - 1) 2 * pdf_val - 1 / math.sqrt(math.pi)) return crps.mean() # 返回批次平均损失在训练循环中你可以像使用MSE一样使用它optimizer.zero_grad() mean, log_std model(inputs) # 模型输出对数标准差以保证正值 std torch.exp(log_std) loss crps_loss_gaussian(mean, std, targets) loss.backward() optimizer.step()这样做的好处是模型被直接优化以产生“整体上”更准确的概率预测而不仅仅是准确的均值。在实践中这通常能产生不确定性校准更好的模型尤其是在数据存在异方差性时。4.2 作为模型评估与选择的指标对于更复杂的贝叶斯模型如通过MCMC采样的贝叶斯神经网络、高斯过程回归我们通常得到的是后验样本。这时使用经验CRPS公式进行评估是标准做法。import numpy as np from scipy.stats import norm def crps_for_samples(samples, true_value): 计算基于后验样本的CRPS。 samples: 形状为 [n_samples, ...] 的数组多个样本。 true_value: 标量或与samples[0]同形状的数组。 返回: CRPS值。 samples np.asarray(samples).flatten() n len(samples) # 经验CRPS公式 term1 np.mean(np.abs(samples - true_value)) # 高效计算样本两两绝对差的和 (避免O(N^2)循环) sorted_samples np.sort(samples) term2 np.mean([(2*i - n - 1) * s for i, s in enumerate(sorted_samples, start1)]) / (n**2) # 另一种等价但更直观的向量化计算对于中等规模N尚可 # term2 np.sum(np.abs(np.subtract.outer(samples, samples))) / (2 * n**2) return term1 - term2 # 示例假设我们有来自MCMC的1000个后验样本 posterior_samples np.random.normal(loc5.0, scale1.5, size1000) # 模拟样本 true_val 5.2 crps_val crps_for_samples(posterior_samples, true_val) print(fCRPS: {crps_val:.4f})在模型对比时你应该在独立的测试集上计算每个模型所有预测点的平均CRPS。平均CRPS更低的模型其概率预测的综合性能更好。4.3 使用现有库简化流程为了可靠性和效率推荐使用成熟的库。properscoring库是社区标准之一。pip install properscoringimport properscoring as ps import numpy as np # 情况1参数化分布如高斯 pred_mean 5.0 pred_std 1.5 obs 5.2 crps_gaussian ps.crps_gaussian(obs, pred_mean, pred_std) # 情况2经验样本如集成学习或MCMC输出 samples np.random.normal(5.0, 1.5, 1000) crps_ensemble ps.crps_ensemble(obs, samples) # 计算整个测试集上的平均CRPS all_observations np.array([...]) all_ensemble_forecasts np.array([...]) # 形状 [n_test, n_samples] mean_crps ps.crps_ensemble(all_observations, all_ensemble_forecasts).mean()使用这些库可以避免自己实现时的数值稳定性问题并且它们通常经过高度优化。5. 实战中的陷阱与高级技巧让CRPS真正发挥作用掌握了基础用法我们来看看在实际项目中应用CRPS时那些文档里不会写但能决定成败的细节。5.1 陷阱一忽略数据的尺度——CRPS不是无量纲的CRPS的值依赖于预测变量本身的单位。预测身高的CRPS单位厘米和预测股价的CRPS单位元在数值上直接比较没有意义。这在两种场景下需要注意多输出模型如果你的模型同时预测多个量纲不同的变量例如一个模型同时预测温度℃和湿度%计算总损失时不能简单地将各自的CRPS相加。你需要先对每个目标变量进行标准化例如减去均值除以标准差或者为每个目标设置一个权重系数。模型对比在对比不同数据集上的模型或对比不同文献中的CRPS值时必须注意其数值的绝对大小没有跨情境可比性。通常我们报告标准化CRPS例如除以数据的标准差或者计算相对于某个基准模型如历史均值法的CRPS技能分数CRPS Skill Score。CRPS技能分数的计算公式为 [ CRPSS 1 - \frac{\overline{CRPS}{model}}{\overline{CRPS}{baseline}} ] 其中 ( \overline{CRPS} ) 是平均CRPS。CRPSS 0 表示你的模型优于基线模型且越接近1越好。5.2 陷阱二当预测分布非高斯时CRPS的解析公式对于高斯分布很简洁但现实中的数据往往具有偏斜、多峰或重尾特性。如果你的模型输出一个复杂的分布如混合高斯、学生t分布、通过归一化流得到的复杂分布直接计算CRPS的解析解可能非常困难甚至不存在。解决方案蒙特卡洛近似这是最通用、最强大的方法。即使你的模型输出一个非常复杂的分布只要你能够从中采样就可以使用经验CRPS公式。对于深度学习模型这通常意味着在输出层设计一个能产生随机样本的机制例如输出分布参数然后在计算损失时进行重参数化采样。# 伪代码在训练中使用蒙特卡洛CRPS def mc_crps_loss(model, inputs, targets, n_samples50): total_crps 0 for _ in range(n_samples): # 假设model在forward时加入了随机性如dropout随机采样 predictions model(inputs) # [batch_size] # predictions 是本次前向传播的样本 # 我们需要累积所有样本用于计算批次内经验CRPS # 更高效的做法是让模型一次输出多个样本 [batch_size, n_samples] ... # 计算整个批次的平均CRPS return average_crps分位数回归视角CRPS与分位数评分的加权积分有密切关系。另一种策略是训练一个分位数回归模型直接优化多个分位数如从0.05到0.95步长0.05然后利用这些分位数来近似计算CRPS。这种方法特别适用于需要直接提供分位数预测的场景。5.3 高级技巧用CRPS诊断模型缺陷CRPS不仅仅是一个最终评分它还是一个强大的诊断工具。我们可以对CRPS进行分解以了解模型在哪些方面出了问题。CRPS分解理论上CRPS可以分解为“不确定性”Uncertainty、“可靠性”Reliability和“分辨率”Resolution等成分类似于Brier评分的分解。虽然完全分解在连续变量上更复杂但我们可以通过一些操作来获得洞见绘制可靠性图概率积分变换图PIT对于一组概率预测计算每个真实值在其对应预测CDF上的值即 ( u_i F_i(x_i) )。如果预测是完美校准的这些 ( u_i ) 应该服从均匀分布 ( U(0,1) )。绘制 ( u_i ) 的直方图如果形状明显偏离均匀分布如U形、山峰形则说明预测分布存在系统性偏差欠分散或过分散。分析CRPS随条件变化将测试集按照某个协变量如输入数据的模值、时间、类别分组分别计算各组的平均CRPS。如果某个子组的CRPS显著更高就提示模型在该区域表现不佳可能需要更多的数据或更复杂的模型结构。例如在一个预测城市不同区域客流量的项目中我们发现模型在商业区的CRPS远高于居民区。进一步分析发现商业区的客流波动性方差更大且存在更复杂的周期性模式。这指引我们为不同区域引入异方差的噪声模型并加入了更精细的节假日特征最终显著提升了整体CRPS。6. 超越单变量多元预测与时空场景下的挑战到目前为止我们讨论的都是单变量预测。但在现实世界中我们经常需要预测一组相关的变量多元预测或者在时空网格上进行预测如气象预报图像。如何将CRPS推广到这些场景6.1 多元CRPS与能量评分对于一组 ( d ) 维的预测向量最直接的推广是能量评分Energy Score它是CRPS在多维空间的一种自然扩展。对于来自预测分布的样本 ( Y_1, ..., Y_N ) 和真实观测向量 ( x )能量评分的经验估计为[ ES \frac{1}{N} \sum_{i1}^{N} | Y_i - x | - \frac{1}{2N^2} \sum_{i1}^{N} \sum_{j1}^{N} | Y_i - Y_j | ]这里 ( | \cdot | ) 通常采用欧几里得范数L2范数。这个公式和单变量经验CRPS的形式完全一致只是把绝对值差换成了向量距离。它同样衡量了预测样本集合的“紧密度”以及其与真实观测的“接近度”。6.2 时空场的CRPS对每个格点独立计算与集成在气象或视频预测中我们的目标是预测一个时空场例如未来24小时全国的温度网格图。一种常见且实用的方法是对每个空间格点或像素独立计算CRPS然后取平均得到平均CRPS。这种方法计算简单并且能反映模型在每个局部位置的预测性能。然而它忽略了空间相关性。一个在空间上平滑但整体偏移的预测和一个在空间上噪声很大但局部均值准确的预测可能会有相似的平均CRPS但前者在实际应用中通常更有用。为了考虑空间结构可以采用以下进阶方法基于空间聚类的CRPS先将空间域聚类成几个有意义的区域如华东、华北计算每个区域内部格点的平均观测值和平均预测分布然后计算区域层面的CRPS。这更符合某些业务决策单元如大区销售预测。使用空间加权的CRPS根据每个格点的重要性如人口密度、业务价值赋予不同的权重然后计算加权平均CRPS。谱域CRPS将预测场和观测场进行傅里叶变换在波数空间计算CRPS。这可以分别评估模型在不同尺度大尺度环流 vs. 小尺度湍流上的预测性能对于物理诊断非常有价值。6.3 实操建议从简单开始逐步复杂在大多数工程应用中我建议从独立格点平均CRPS开始。它易于实现、解释并且能提供有价值的基线性能。只有当你有明确的证据表明空间相关性对你的评估至关重要并且简单平均CRPS掩盖了重要问题时才去考虑更复杂的空间评分方法。毕竟评估指标本身不应该成为项目的主要复杂度来源。7. 案例复盘用CRPS优化一个销量预测项目让我用一个简化但真实的案例串联起CRPS的应用全流程。我们的目标是预测某零售商品未来7天的日销量。7.1 基线模型与问题我们一开始用一个LSTM神经网络使用MSE作为损失函数输出一个点预测值。模型在验证集上的MSE看起来不错但当业务方问“明天销量低于100件的概率有多大”时我们无法给出可靠答案。我们只能提供一个基于历史误差的经验置信区间这很不“贝叶斯”。7.2 转向概率预测模型我们决定升级模型使其能输出概率分布。我们选择了深度ARDeepAR这类架构的变体。模型结构如下编码器LSTM处理历史序列。输出层不再是一个神经元而是两个神经元分别预测未来销量的条件高斯分布的均值 ( \mu_t ) 和对数标准差 ( \log(\sigma_t) )。损失函数从MSE改为负对数似然NLL。对于高斯分布NLL就是MSE加上一个由方差决定的惩罚项。这迫使模型同时学习均值和方差。7.3 引入CRPS进行模型调优与选择我们用NLL训练了几个不同超参数如隐层维度、dropout率的模型。在验证集上我们同时计算NLL和CRPS。我们发现一个有趣的现象某个模型的NLL略高差3%但其CRPS却显著更低好15%。分析其预测结果发现这个CRPS更优的模型在销量波动大的日子如周末预测的标准差 ( \sigma_t ) 会显著变大而NLL略优的那个模型其预测的方差相对恒定。CRPS更优的模型其不确定性估计与实际情况更匹配——在难预测的日子更“谦虚”。尽管它偶尔的均值预测偏差稍大导致NLL略高但其整体概率预测质量更高。我们最终依据CRPS选择了模型因为业务决策更依赖于可靠的概率而非单纯的最优猜测。7.4 后处理与模型监控上线后我们持续监控模型性能。除了每日的销量预测我们还每天计算预测的CRPS并滚动计算过去30天的平均CRPS。我们设置了一个警戒线如果滚动平均CRPS连续5天上升超过10%则触发告警提示模型可能因为数据分布漂移而性能下降需要重新审视或训练。此外我们定期绘制PIT直方图。运行一段时间后我们发现PIT直方图呈现轻微的“山峰形”中间多两边少这表明我们的高斯分布假设可能导致了过分散预测分布比实际分布更窄。这促使我们尝试了输出学生t分布的模型以更好地捕捉厚尾特性最终进一步降低了CRPS。7.5 经验总结CRPS是指引方向的灯塔在概率预测任务中尽早将CRPS纳入评估体系它能帮你选择真正对业务有用的模型而不是在MSE上过度优化。损失函数与评估指标可以不同训练时使用NLL便于梯度下降评估时使用CRPS更符合业务目标这是完全合理的。可视化是关键永远不要只看一个平均CRPS数字。绘制预测分布与真实值的对比图、PIT图、按条件分组的CRPS图这些可视化能提供比单一分数丰富得多的信息。从简单分布开始高斯分布是一个非常好的起点。在它的基础上用CRPS和PIT诊断问题再逐步考虑更复杂的分布学生t、混合模型等。避免一开始就陷入复杂分布的泥潭。回到开头的问题CRPS不仅仅是一个评分函数它是连接贝叶斯机器学习理论输出与现实世界决策需求的桥梁。它迫使我们的模型不仅要说“我认为是多少”还要说“我有多确定”。在这个充满不确定性的世界里后者的价值往往比前者更大。
返回列表