使用CatBoost进行不确定度估算:模型为何不确定以及如何估计不确定性水平

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 使用CatBoost进行不确定度估算:模型为何不确定以及如何估计不确定性水平

640.png

本教程涵盖以下主题:  

  1. 什么是预测不确定性,为什么您要关心它?  
  2. 不确定性的两个来源是什么?  
  3. 如何使用CatBoost梯度提升库估算回归问题的不确定性

什么是不确定性?

机器学习已广泛应用于一系列任务。但是,在某些高风险应用中,例如自动驾驶,医疗诊断和财务预测,错误可能导致致命的后果或重大的财务损失。在这些应用中,重要的是要检测系统何时犯错并采取更安全的措施。此外,还希望收集这些“故障场景”,对其进行标记,并教系统通过主动学习做出正确的预测。

预测不确定性估计可用于检测错误。理想情况下,该模型在可能会出错的情况下表明高度不确定性。这使我们能够发现错误并采取更安全的措施。至关重要的是,行动的选择取决于模型为何不确定。不确定性的主要来源有两个:数据不确定性(也称为偶然不确定性)和知识不确定性(也称为认知不确定性)。如果我们的目标是发现错误,则不必将这两个不确定性分开。但是,如果我们的目标是主动学习,那么我们想发现新的输入,并且可以将知识不确定性用于此。

数据的不确定性是由于数据固有的复杂性而产生的,例如加性噪声或重叠类。在这些情况下,模型知道输入具有多个类别的属性,或者目标有噪声。重要的是,无法通过收集更多的训练数据来减少数据不确定性。当模型的输入来自训练数据稀疏或远离训练数据的区域时,就会出现知识不确定性。在这些情况下,模型对该区域了解得很少,并且可能会犯错。与数据不确定性不同,可以通过从一个了解程度不高的区域收集更多的训练数据来减少知识不确定性。

本教程详细介绍了如何在CatBoost中量化数据和知识的不确定性。

CatBoost中的数据不确定性

为了说明这些概念,我们将使用一个简单的综合示例。

假设我们有两个分类特征x 1和x 2,每个都有9个值,所以有81种可能的特征组合。目标取决于以下函数:

y=mean(x₁,x₂) +eps(x₁,x₂)

其中平均值(x 1,x 2)是一个未知的固定值,而eps(x 1,x 2)是一个正态分布的噪声(即数据不确定性),平均值为0,方差为var(x 1,x 2)。在我们的示例中,均值(x 1,x 2)是随机生成的,而var(x 1,x 2)具有两个值(0.01和0.04),其分布如下:

640.png

红心上的点比红心外的点在目标中具有更多的噪音。请注意,我们列举了类别以获得更好的可视化效果,但是在数据集中,两个功能都是分类的,即未给出顺序。

当我们生成具有这种分布的数据集时,我们假设红心内没有任何训练示例-这些特征组合被认为是我们数据集的异常值。

用RMSE损失优化的标准模型只能预测平均值(x 1,x 2)。好的,但是如果我们要估算y的方差,即数据不确定性,该怎么办?换句话说,如果我们想了解哪些预测比较吵杂怎么办?为了估计数据的不确定性,必须使用预测均值和方差的概率回归模型。为此,CatBoost中有一个名为RMSEWithUncertainty的新损失函数。有了这个损失,类似于NGBoost算法[1],CatBoost估计正态分布的均值和方差,优化负对数似然率并使用自然梯度。对于每个示例,CatBoost模型返回两个值:估计平均值和估计方差。

让我们尝试将此损失函数应用于我们的简单示例。我们得到以下变化:

640.png

我们可以看到CatBoost成功地预测了心脏及其外部的变化。在心脏内部,我们没有训练数据,因此可以预测任何事情。

CatBoost中的知识不确定性

我们知道如何估算数据中的噪声。但是,如何衡量由于特定地区缺乏培训数据而导致的知识不确定性?如果我们要检测异常值该怎么办?估计知识不确定性需要模型的整体。如果所有模型都理解输入,则它们将给出相似的预测(较低的知识不确定性)。但是,如果模型不理解输入,则它们可能会提供不同的预测,并且彼此之间会强烈不同意见(知识不确定性很高)。对于回归,可以通过测量多个模型之间的均值方差来获得知识不确定性。请注意,这与单个模型的预测方差不同,后者可以捕获数据不确定性。

让我们考虑一下生成的GBDT模型的集合,如下所示:

defensemble(train_pool, val_pool, num_samples=10, iters=1000, lr=0.2):
ens_preds= []
forseedinrange(num_samples):
model=CatBoostRegressor(iterations=iters, learning_rate=lr,
loss_function='RMSEWithUncertainty', posterior_sampling=True,
verbose=False, random_seed=seed)
model.fit(train_pool, eval_set=val_pool)
ens_preds.append(model.predict(test))
returnnp.asarray(ens_preds)

使用选项posterior_sampling生成模型,因为这可以使获得的(随机)预测很好地分布(具有良好的理论属性,在这里我们参考[2]以获得详细信息)。

然后,为了估计知识的不确定性,我们只计算模型预测的平均值的方差:

knowledge=np.var(ens_preds, axis=0)[:, 0]

我们得到以下结果:

640.png

该模型正确检测到心脏内部的知识不确定性(我们看不到原始心脏边界的痕迹)。这说明了如何通过估计知识的不确定性来检测异常输入。

实际上,训练多个CatBoost模型的集成可能太昂贵了。理想情况下,我们希望训练一个模型,但仍然能够检测异常值。有一个解决方案:我们可以使用从单个训练模型中获得的虚拟集合:

defvirt_ensemble(train_pool, val_pool, num_samples=10, iters=1000, lr=0.2):
ens_preds= []
model=CatBoostRegressor(iterations=iters, learning_rate=lr,
loss_function='RMSEWithUncertainty', posterior_sampling=True,
verbose=False, random_seed=0)
model.fit(train_pool, eval_set=val_pool)
ens_preds=model.virtual_ensembles_predict(test, prediction_type='VirtEnsembles',
virtual_ensembles_count=num_samples)
returnnp.asarray(ens_preds)

CatBoost通过一个训练完成的模型返回多个预测。这些预测是通过截断模型获得的:

640.png

同样,我们使用选项posterior_sampling来保证裁剪预测的理想分布。让我们看看我们得到了什么:

640.png

注意,由于虚拟集合元素是相关的,因此知识不确定性的预测绝对值现在要小得多。但是,它仍然可以成功检测到未被占用的区域(异常值)。

代替返回几个模型的预测的prediction_type =“ VirtEnsembles”,我们可以使用prediction_type =“ TotalUncertainty”并使相同的结果更容易。对于这种预测类型,CatBoost使用虚拟集合计算所有类型的不确定性。即,对于RMSEWithUncertainty,它返回以下统计信息:[均值预测,知识不确定性,数据不确定性]:

model=CatBoostRegressor(iterations=1000, learning_rate=0.2,
loss_function='RMSEWithUncertainty', posterior_sampling=True,
verbose=False, random_seed=0)
model.fit(train_pool, eval_set=val_pool)
preds=model.virtual_ensembles_predict(test, prediction_type='TotalUncertainty',
virtual_ensembles_count=10)
mean_preds=preds[:,0] #meanvaluespredictedbyavirtualensembleknowledge=preds[:,1] #knowledgeuncertaintypredictedbyavirtualensembledata=preds[:,2] #averageestimateddatauncertainty

感谢您的关注!我希望本教程可以帮助您更好地了解不确定性的概念以及如何使用CatBoost进行估算。我们将在以后的文章中详细介绍不确定性的应用。敬请期待😺

引用

[1] T. Duan et al., NGBoost: Natural Gradient Boosting for Probabilistic Prediction (2020), ICML 2020

[2] A. Ustimenko, L. Prokhorenkova and A. Malinin, Uncertainty in Gradient Boosting via Ensembles” (2020), arXiv preprint arXiv:2006.10562

目录
相关文章
|
SQL 关系型数据库 数据库
RDS入门——Excel文件转存到RDS数据库实践
本实验将帮助您快速掌握RDS产品的实例开通,熟悉RDS产品的常用功能与基础操作,完成云上数据库搭建。
|
安全 开发者 C++
Windows10安装modelscope后import这个模块报错:OSError: [WinError 1] 函数不正确。: 'D:\Anaconda\envs\MDS\lib\site-packages\modelscope\utils\ast_utils.py'
Windows10安装modelscope后import这个模块报错:OSError: [WinError 1] 函数不正确。: 'D:\Anaconda\envs\MDS\lib\site-packages\modelscope\utils\ast_utils.py'
944 1
|
7月前
|
运维 网络协议 Shell
【网络运维】Ping不通?别慌!用Telnet和Netstat精准排查端口连通性
本文介绍网络排查两大利器:Telnet与Netstat。通过Ping只能检测服务器是否在线,而Telnet可测试端口连通性,区分“连接被拒”与“超时”;Netstat则用于服务端查看端口监听状态,识别如仅监听127.0.0.1导致外网无法访问的问题。结合ss命令和“三板斧”流程,快速定位网络故障。
|
7月前
|
传感器 算法 物联网
基于STM32 的智能导盲拐杖项目源码分享【源码分享】
基于 STM32 的智能导盲拐杖项目,是一个非常典型的“多传感器融合 + 嵌入式控制 + 人机交互”的 IoT 辅助设备示例。它不仅具有工程价值,也有重要的社会意义。通过本文的架构讲解、模块选型和软件思路,你可以快速搭建原型,并进一步扩展成一个可投入使用的辅助产品。
基于STM32 的智能导盲拐杖项目源码分享【源码分享】
|
存储 Java 编译器
🔍深入Android底层,揭秘JVM与ART的奥秘,性能优化新视角!🔬
【7月更文挑战第28天】在Android开发中,掌握底层机制至关重要。从Dalvik到ART, Android通过采用AOT编译在应用安装时预编译字节码至机器码,显著提升了执行效率。ART还优化了垃圾回收,减少内存占用及停顿。为了优化性能,可减少DEX文件数量、优化代码结构利用内联等技术、合理管理内存避免泄漏,并使用ART提供的调试工具。
571 7
|
PyTorch 算法框架/工具
Pytorch学习笔记(五):nn.AdaptiveAvgPool2d()函数详解
PyTorch中的`nn.AdaptiveAvgPool2d()`函数用于实现自适应平均池化,能够将输入特征图调整到指定的输出尺寸,而不需要手动计算池化核大小和步长。
1544 1
Pytorch学习笔记(五):nn.AdaptiveAvgPool2d()函数详解
|
11月前
|
数据采集 缓存 搜索推荐
301重定向:数字世界的永恒路标
301重定向是HTTP协议中用于资源永久迁移的技术,具有持久缓存和SEO权重传递特性。它在网站改版、流量过渡及移动端适配中发挥关键作用,同时可通过多种技术方案实现,具备显著的商业价值和品牌保护效益。
433 0

热门文章

最新文章