CRPS:贝叶斯机器学习模型的评分函数

news2024/11/15 12:27:38

连续分级概率评分(Continuous Ranked Probability Score, CRPS)或“连续概率排位分数”是一个函数或统计量,可以将分布预测与真实值进行比较。

机器学习工作流程的一个重要部分是模型评估。这个过程本身可以被认为是常识:将数据分成训练集和测试集,在训练集上训练模型,并使用评分函数评估其在测试集上的性能。

评分函数(或度量)是将真实值及其预测映射到一个单一且可比较的值 [1]。例如,对于连续预测可以使用 RMSE、MAE、MAPE 或 R 平方等评分函数。如果预测不是逐点估计,而是分布呢?

在贝叶斯机器学习中,预测通常不是逐点估计,而是值的分布。例如预测可以是分布的估计参数,或者在非参数情况下,来自MCMC方法的样本数组。

在这种情况下,传统的评分函数不适合统计设计;预测的分布聚合成它们的平均值或中值会导致关于预测分布的分散和形状的大量信息的损失。

CRPS

连续分级概率评分(CRPS)是一个分数函数,它将单个真实值与累积分布函数(CDF)进行比较:

它于 70 年代首次引入 [4],主要用于天气预报,现在在文献和行业中重新受到关注 [1] [6]。当目标变量是连续的并且模型预测目标的分布时,它可以用作评估模型性能的指标;示例包括贝叶斯回归或贝叶斯时间序列模型 [5]。

通过使用CDF, CRPS 对于参数和非参数预测都很有用:对于许多分布,CRPS [3] 都有一个解析表达式,对于非参数预测, CRPS 使用经验累积分布函数 (eCDF)。

在计算测试集中每个观察值的 CRPS 后,还需要将结果聚合成一个值。与 RMSE 和 MAE 类似,使用(可能是加权的)平均值对它们进行汇总:

将单个值与分布进行比较的主要挑战是如何将单个值转换成为分布的表示。CRPS通过将基本真值转换为带有指标函数的退化分布来解决这一问题。例如如果真值是7,我们可以用:

指标函数是一个有效的 CDF,可以满足 CDF 的所有要求。然后就可以将预测分布与真值的退化分布进行比较。我们肯定希望预测的分布尽可能接近真实情况;所以可以通过测量这两个 CDF 之间的(平方)面积来数学表示:

MAE与MAE关系

CRPS与著名的MAE(平均绝对误差)密切相关。如果采用逐点预测将其视为退化 CDF 并将其注入 CRPS 方程可以得到:

所以如果预测分布是退化分布(例如逐点估计),则 CRPS 会降低为 MAE。这有助于我们从另一个角度理解CRPS:它可以被视为将 MAE 推广到分布的预测中,或者说当预测分布退化时,MAE 是 CRPS 的特例。

当模型的预测是参数分布时(例如需要预测分布参数),CRPS 对一些常见的分布有一个解析表达式 [3]。如果模型预测正态分布的参数 μ 和 σ,则可以使用以下公式计算 CRPS:

这个方案可以解决已知的分布,如Beta, Gamma, Logistic,对数正态分布和其他[3]。

当预测是非参数的,或者更具体地说——预测是一系列模拟时,计算 eCDF 是一项繁重的任务。但是CRPS 也可以表示为:

其中 X, X’ 是 F 独立同分布。这些表达式虽然仍然需要一些计算量,但更易于计算。

Python实现

 importnumpyasnp
 
 
 # Adapted to numpy from pyro.ops.stats.crps_empirical
 # Copyright (c) 2017-2019 Uber Technologies, Inc.
 # SPDX-License-Identifier: Apache-2.0
 defcrps(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)
     diff=y_pred[1:] -y_pred[:-1]
     weight=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**2
     returnnp.average(per_obs_crps, weights=sample_weight)

根据NRG形式[2]实现的CRPS函数。改编自pyroppl[6]

 importnumpyasnp
 
 
 defcrps(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_samples
 
     per_obs_crps=absolute_error+b0-2*b1
     returnnp.average(per_obs_crps, weights=sample_weight)

上面代码是根据PWM形式[2]实现CRPS。

总结

连续分级概率评分 (CRPS) 是一种评分函数,用于将单个真实值与其预测分布进行比较。此属性使其与贝叶斯机器学习相关,其中模型通常输出分布预测而不是逐点估计。它可以看作是众所周知的 MAE 对分布预测的推广。

它具有用于参数预测的解析表达式,并且可以针对非参数预测进行简单计算。CRPS 可能会成为评估具有连续目标的贝叶斯机器学习模型性能的新标准方法。

引用:

  1. Strictly Proper Scoring Rules, Prediction, and Estimation, Gneiting & Raftery (2007)
  2. Estimation of the Continuous Ranked Probability Score with Limited Information and Applications to Ensemble Weather Forecasts, Zamo & Naveau (2017)
  3. Calibrated Ensemble Forecasts Using Quantile Regression Forests and Ensemble Model Output Statistics, Taillardat, Zamo & Naveau (2016)
  4. Scoring Rules for Continuous Probability Distributions, Matheson & Winklers (1976)
  5. Distributional Regression and its Evaluation with the CRPS: Bounds and Convergence of the Minimax Risk, Pic, Dombry, Naveau & Taillardat (2022)
  6. CRPS Implementation in Pyro-PPL, Uber Technologies, Inc.
  7. CRPS Implementation in properscoring, The Climate Corporation

https://avoid.overfit.cn/post/302f7305a414449a9eb2cfa628d15853

作者:Itamar Faran

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CLYZ集训】变量取值【网络流】

思路: 容易把答案转化为∑siwi∑ti(wx−wy)\sum{s_iw_i}\sum{t_i(w_x-w_y)}∑si​wi​∑ti​(wx​−wy​),然后我们设初始代价为−∑∣si∣wi-\sum{|s_i|w_i}−∑∣si​∣wi​,然后考虑建模。 如果Si大于0,则源点向i连一条流量为2…

【Java AWT 图形界面编程】FileDialog 对话框 ( 打开文件 | 保存文件 | 构造函数 | 获取文件路径 | 获取文件名称 | 代码示例 )

文章目录一、FileDialog 对话框1、构造函数2、获取文件路径3、获取文件名称二、FileDialog 对话框代码示例一、FileDialog 对话框 在开发时 , 经常遇到文件相关操作 , 如 : 选择文件 , 保存文件 等 , 在 AWT 中使用 FileDialog 文件对话框 实现上述功能 ; 1、构造函数 FileDial…

量子计算初创公司Oxford Ionics完成3000万英镑A轮融资

(图片来源:网络)未来,量子计算机会解决世界上最大的超级计算机无法解决的问题。然而,大规模制造量子计算机仍然是一个巨大的挑战。英国量子计算初创公司Oxford IonicsA轮融资获得的3000万英镑(约合人民币2.…

Java集合(六)Set接口和常用方法

Set接口基本介绍: (1)无序(添加和取出的顺序不一致),没有索引 (2)不允许重复元素,所以最多包含一个null (3)JDK API中Set接口的实现类有: 其中set接口的已…

2023年,最新最权威的上海Java培训机构排行榜出炉!

2022也许你的很多学习和工作计划都被打乱,但是过去的2022不管多艰难,多难熬。都已经成为过去式。2023悄然而至,新的一年,你我都该有新气象新动力,学习什么时候开始都不晚,想跨行从事软件开发、IT行业的小伙…

跳槽至今0 offer的大冤种,问题到底出在哪儿?

众所周知,2022年市场很难!看着企业们纷纷裁员,甚至连内推这个后门都走不通!哪怕有面试,都是屡屡碰壁,你想清楚问题出在哪了吗?😭“求职不得,夜不能寐;三更半夜…

C++基础——C++ 指针

C基础——C 指针C 指针什么是指针?C 中使用指针C 指针详解C Null 指针C 指针的算术运算递增一个指针递减一个指针指针的比较C 指针 vs 数组C 指向指针的指针(多级间接寻址)C 传递指针给函数C 指针 学习 C 的指针既简单又有趣。通过指针&…

Python语言基础学习之Python基础之列表介绍和循环遍历

今天给大家分享一些Python基础 (列表基础和循环遍历介绍),一起来看看吧~ 一、列表介绍 想一想: 字符串可以用来存储一串信息,那么想一想,怎样存储所有同学的名字呢?定义100个变量,每个变量存放一个学生的姓名可行吗…

LinkedList VS ArrayList~

ArrayList VS LinkedList: One: ArrayList:基于数组,需要连续内存LinkedList:基于双向链表,无需连续内存Two: ArrayList:随机访问快(指根据下标访问)LinkedList:随机访问慢(要沿着链表遍历)点击ArrayList的源码: 点击LinkedList的源码: Ar…

九龙证券|看好2-4月份汽车月度销量增速的逐月改善

机构指出,考虑到22年末购置税补助等方针到期,叠加春节假期消费需求的提早,估计年内乘用车销量绝对值及同比增速均于1月触底,后续方针影响、消费回暖等一期效果下,看好车市回暖,估计销量增速将于2-4月逐月回…

15.Set系列,可变参数、Collections

目录 一.Set系列 1.1 Set系列集合特点 1.2 Set集合实现类特点 1.3 HashSet 1.3.1 特点 1.3.2 优点 1.3.3 在理解原理之前要知道的几个概念。 1.3.4 底层原理 1.3.5 哈希表的形成过程/元素的存入过程(Jdk8的版本) 1.3.6 注意事项 1.4 linkedHa…

通用数字支付网络(UDPN)于达沃斯论坛期间正式发布

2023年1月19日,在瑞士达沃斯举行的世界经济论坛 (WEF) 会议期间,通用数字支付网络 (Universal Digital Payment Network, UDPN)正式对外发布。 近年来,全球各国央行数字货币(CBDC)得到了广泛的关注与长足的进步&#…

WebHooks

webhook 究竟是什么呢? Webhook是一个API概念,webhoo是一种web回调或者http的push API。Webhook作为一个轻量的事件处理应用,正变得越来越有用。 具体的说,webhook 是应用给其它应用提供实时信息的一种方式。信息一产生&#xf…

Js如何实现当网页超过一屏时导航菜单始终置顶-吸顶盒效果

前言我们平时在逛一些电商网站时,无论是首页还是详情页,通常会有一个导航菜单石红跟随着页面,无论是页面滚动到中间还是底部这是为了方便用户查看商品的各类信息或提交订单购物也就是吸顶盒效果,那这个效果是怎么实现的?原生Js如下是原生js// 初始化函数 function init() {// …

[Pytorch] CIFAR-10数据集的训练和模型优化

本篇文章借鉴了我的朋友Jc的报告,他是一个十分优秀的人。 本篇文章记录了第一次完整训练优化的过程 0 关于数据集 在CIFAR-10 dataset的介绍中,cifar-10数据集一共10类图片,每一类有6000张图片,加起来就是60000张图片&#xff0…

深度卷积对抗神经网络 基础 第五部分 Inception-v3 architecture GANs

深度卷积对抗神经网络 基础 第五部分 Inception-v3 architecture GANs 对抗神经网络能够产生不存在的图片,换脸或者生成一些艺术品,这些有趣和强大的对抗神经网络的能力不仅能够创造价值,还能够用来犯罪。With Great Power , Comes With Res…

3.1.1 类和对象

文章目录1.类2.对象3.类和对象的关系4.类的创建使用5.对象在内存中的存储过程6.对象创建过程分析1.类 java最基本的单位就是类,可以理解为类型类是一类事物的抽象可以理解为模板或者设计图纸 注意:类在现实世界并不存在,它只是一种对象的数据类型。例如乌鸦&#…

如何使用DevExpress WPF组件实现异步加载TreeList节点?建议收藏

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。在本文中,我…

PADS Layout封装创建时批量放置焊盘的方法

批量放置焊盘一般是在BGA封装的是用的比较多,当然对于一些普通贴片焊盘也是挺常用的。 1、第一步:打开PCB封装编辑器,进入到封装编辑界面,放置焊盘后,点击焊盘右键“分步与重复”既可。2、第二步:点击以后弹…

常见的锁策略和synchronized的锁机制

文章目录一. 常见的锁策略1. 乐观锁和悲观锁2. 轻量级锁和重量级锁3. 自旋锁和挂起等待锁4. 普通互斥锁和读写锁5. 公平锁和非公平锁6. 可重入锁和不可重入锁二. synchronized的锁机制1. 锁升级/锁膨胀2. 锁消除3. 锁粗化一. 常见的锁策略 1. 乐观锁和悲观锁 乐观锁和悲观锁主…