连续排名概率分数(CRPS)或“连续排名概率分数”是将分布预测与真实值进行比较的函数或统计量。机器学习工作流程的一个重要部分是模型评估。该过程本身可以被认为是常识:将数据分成训练集和测试集,在训练集上训练模型,并使用评分函数评估其在测试集上的性能。评分函数(或度量)是真实值及其预测到单个可比较值的映射[1]。例如,RMSE、MAE、MAPE或R平方等评分函数可用于连续预测。如果预测不是逐点估计而是分布怎么办?在贝叶斯机器学习中,预测通常不是逐点估计,而是值的分布。例如,预测可以是分布的估计参数,或者在非参数情况下,来自MCMC方法的样本数组。在这种情况下,传统的评分函数不适合统计设计;将预测分布聚合到它们的均值或中值会导致丢失有关预测分布的分布和形状的大量信息。CRPSContinuouslyRankedProbabilityScore(CRPS)是一种将单个真实值与累积分布函数(CDF)进行比较的得分函数:它最早于70年代引入[4],主要用于天气预报,现在用于文学和工业重新受到关注[1][6]。当目标变量是连续的并且模型预测目标上的分布时,它可以用作评估模型性能的指标;示例包括贝叶斯回归或贝叶斯时间序列模型[5]。CRPS通过使用CDF对于参数预测和非参数预测都很有用:CRPS[3]具有许多分布的分析表达式,对于非参数预测,CRPS使用经验累积分布函数(eCDF)。在计算了测试集中每个观察值的CRPS之后,我们还需要将结果聚合成一个值。与RMSE和MAE类似,它们使用(可能是加权的)平均值进行聚合:将个体值与分布进??行比较的主要挑战是如何将个体值转换为分布的表示。CRPS通过将groundtruth转化为具有指示函数的退化分布来解决这个问题。例如,如果真值是7,我们可以使用:指标函数是一个有效的CDF,它满足CDF的所有要求。然后可以将预测分布与真实值的退化分布进行比较。我们肯定希望预测的分布尽可能接近真实情况;所以这可以通过测量这两个CDF之间的(平方)面积来数学表达:MAEvs.MAECRPS与众所周知的MAE(平均绝对误差)密切相关。如果采用逐点预测并将其视为退化CDF并将其输入CRPS方程,则可以获得此结果:因此,如果预测分布是退化的(例如逐点估计),则CRPS会减少为MAE。这有助于我们从另一个角度理解CRPS:它可以看作是将MAE推广到分布的预测,或者MAE是预测分布退化时CRPS的特例。当模型的预测是参数分布时(例如需要预测分布参数时),CRPS对于一些常见的分布有一个解析表达式[3]。如果模型预测正态分布的参数μ和σ,则可以使用以下公式计算CRPS:该方案可以求解已知分布,例如Beta、Gamma、Logistic、lognormal等[3]。当预测是非参数的,或者更具体地说,当预测是一系列模拟时,计算eCDF是一项繁重的任务。但CRPS也可以表示为:其中X,X'是F独立同分布的。这些表达式虽然仍然需要一些计算,但更容易计算。Python实现importnumpyasnp#Adaptedtonumpyfrompyro.ops.stats.crps_empirical#Copyright(c)2017-2019UberTechnologies,Inc.#SPDX-License-Identifier:Apache-2.0defcrps(y_true,y_pred,sample_weight=无):num_samples=y_pred.shape[0]absolute_error=np.mean(np.abs(y_pred-y_true),axis=0)ifnum_samples==1:returnnp.average(absolute_error,weights=sample_weight)y_pred=np.sort(y_pred,axis=0)diff=y_pred[1:]-y_pred[:-1]权重=np.arange(1,num_samples)*np.arange(num_samples-1,0,-1)weight=np.expand_dims(weight,-1)per_obs_crps=absolute_error-np.sum(diff*weight,axis=0)/num_samples**2returnnp.average(per_obs_crps,weights=sample_weight)根据NRG形式[2]实际的CRPS函数。改编自pyroppl[6]importnumpyasnpdefcrps(y_true,y_pred,sample_weight=None):num_samples=y_pred.shape[0]absolute_error=np.mean(np.abs(y_pred-y_true),axis=0)ifnum_samples==1:returnnp.average(absolute_error,weights=sample_weight)y_pred=np.sort(y_pred,axis=0)b0=y_pred.mean(axis=0)b1_values=y_pred*np.arange(num_samples).reshape((num_samples,1))b1=b1_values.mean(axis=0)/num_samplesper_obs_crps=absolute_error+b0-2*b1returnnp.average(per_obs_crps,weights=sample_weight)以上代码基于PWM形式[2]实现CRPS。总结连续排名概率得分(CRPS)是一种评分函数,用于将单个真实值与其预测分布进行比较。此属性使其与贝叶斯机器学习相关,其中模型通常输出分布预测而不是逐点估计。它可以看作是著名的MAE用于分布预测的推广。它具有用于参数预测的解析表达式和用于非参数预测的简单计算。CRPS可能成为评估具有连续目标的贝叶斯机器学习模型性能的新标准方法。
