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

简介: 使用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

目录
相关文章
|
安全 开发者 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'
847 1
|
4月前
|
传感器 算法 物联网
基于STM32 的智能导盲拐杖项目源码分享【源码分享】
基于 STM32 的智能导盲拐杖项目,是一个非常典型的“多传感器融合 + 嵌入式控制 + 人机交互”的 IoT 辅助设备示例。它不仅具有工程价值,也有重要的社会意义。通过本文的架构讲解、模块选型和软件思路,你可以快速搭建原型,并进一步扩展成一个可投入使用的辅助产品。
基于STM32 的智能导盲拐杖项目源码分享【源码分享】
|
存储 Java 编译器
🔍深入Android底层,揭秘JVM与ART的奥秘,性能优化新视角!🔬
【7月更文挑战第28天】在Android开发中,掌握底层机制至关重要。从Dalvik到ART, Android通过采用AOT编译在应用安装时预编译字节码至机器码,显著提升了执行效率。ART还优化了垃圾回收,减少内存占用及停顿。为了优化性能,可减少DEX文件数量、优化代码结构利用内联等技术、合理管理内存避免泄漏,并使用ART提供的调试工具。
476 7
|
机器学习/深度学习 分布式计算 算法框架/工具
大模型的内部结构复杂,导致其决策过程难以解释,这对于某些应用场景来说是不可接受的。
【10月更文挑战第23天】随着人工智能技术的发展,越来越多的企业开始探索大模型的私有化部署。本文详细介绍了在企业内部实现大模型私有化部署的方法,包括硬件配置、数据隐私保护、模型可解释性提升以及模型更新和维护等方面的解决方案,帮助企业克服相关挑战,提高数据处理的安全性和效率。
327 4
|
机器学习/深度学习 人工智能 并行计算
【AI系统】GPU 架构回顾(从2010年-2017年)
自1999年英伟达发明GPU以来,其技术不断革新。本文概述了从2010年至2024年间,英伟达GPU的九代架构演变,包括费米、开普勒、麦克斯韦、帕斯卡、伏特、图灵、安培、赫柏和布莱克韦尔。这些架构不仅在游戏性能上取得显著提升,还在AI、HPC、自动驾驶等领域发挥了重要作用。CUDA平台的持续发展,以及Tensor Core、NVLink等技术的迭代,巩固了英伟达在计算领域的领导地位。
1124 1
|
机器学习/深度学习 数据采集 人工智能
深度学习之稳健的模型推理与不确定性建模
基于深度学习的稳健模型推理与不确定性建模,是现代AI系统中至关重要的研究方向。随着深度学习在各类应用中的成功,如何保证模型在面对未知或不确定性输入时仍能做出稳健的推理,并能够量化这种不确定性,成为关键问题。稳健性与不确定性建模可以提高模型的安全性、可靠性,尤其在自动驾驶、医疗诊断等高风险领域。
759 0
|
数据采集 存储 运维
物联网设备的数据处理与分析技术探讨
【7月更文挑战第2天】探索物联网(IoT)数据处理技术,涵盖数据采集(传感器、无线通信)、存储(分布式系统、NoSQL)、处理(清洗、压缩、转换)和分析(描述性、聚类、分类、异常检测)。未来趋势涉及AI集成、边缘计算、多模态处理和系统自主化。随着技术演进,期待更智能、高效的解决方案。
1017 2

热门文章

最新文章