如何进行不确定度估算:模型为何不确定以及如何估计不确定性水平( 二 )
CatBoost中的知识不确定性我们知道如何估算数据中的噪声 。但是 , 如何衡量由于特定地区缺乏培训数据而导致的知识不确定性? 如果我们要检测异常值该怎么办? 估计知识不确定性需要模型的整体 。如果所有模型都理解输入 , 则它们将给出相似的预测(较低的知识不确定性) 。但是 , 如果模型不理解输入 , 则它们可能会提供不同的预测 , 并且彼此之间会强烈不同意见(知识不确定性很高) 。对于回归 , 可以通过测量多个模型之间的均值方差来获得知识不确定性 。请注意 , 这与单个模型的预测方差不同 , 后者可以捕获数据不确定性 。
让我们考虑一下生成的GBDT模型的集合 , 如下所示:
def ensemble(train_pool, val_pool, num_samples=10, iters=1000, lr=0.2):ens_preds = []for seed in range(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))return np.asarray(ens_preds)
使用选项posterior_sampling生成模型 , 因为这可以使获得的(随机)预测很好地分布(具有良好的理论属性 , 在这里我们参考[2]以获得详细信息) 。
然后 , 为了估计知识的不确定性 , 我们只计算模型预测的平均值的方差:
knowledge = np.var(ens_preds, axis=0)[:, 0]
我们得到以下结果:
文章插图
该模型正确检测到心脏内部的知识不确定性(我们看不到原始心脏边界的痕迹) 。这说明了如何通过估计知识的不确定性来检测异常输入 。
实际上 , 训练多个CatBoost模型的集成可能太昂贵了 。理想情况下 , 我们希望训练一个模型 , 但仍然能够检测异常值 。有一个解决方案:我们可以使用从单个训练模型中获得的虚拟集合:
def virt_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)return np.asarray(ens_preds)
CatBoost通过一个训练完成的模型返回多个预测 。这些预测是通过截断模型获得的:
文章插图
同样 , 我们使用选项posterior_sampling来保证裁剪预测的理想分布 。让我们看看我们得到了什么:
文章插图
注意 , 由于虚拟集合元素是相关的 , 因此知识不确定性的预测绝对值现在要小得多 。但是 , 它仍然可以成功检测到未被占用的区域(异常值) 。
代替返回几个模型的预测的predictiontype =" VirtEnsembles" , 我们可以使用predictiontype =" 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] # mean values predicted by a virtual ensembleknowledge = preds[:,1] # knowledge uncertainty predicted by a virtual ensembledata = http://kandian.youth.cn/index/preds[:,2] # average estimated data uncertainty
推荐阅读
- 大一非计算机专业的学生,如何利用寒假自学C语言
- 红米K40渲染图曝光:居中挖孔+后置四摄,这外观你觉得如何?
- 奋斗|该如何看待拼多多员工猝死:鼓励奋斗,也要保护好奋斗者
- 装机点不亮 如何简易排查硬件问题?
- 虾米音乐宣布关停!我的歌单如何导入QQ音乐、网易云音乐?
- 人脸识别设备主板如何选型 软硬整合大幅缩短开发时间
- 微软|外媒:微软将对Windows 10界面进行彻底改进 已招兵买马
- Linux 5.11开始围绕PCI Express 6.0进行早期准备
- Mini-LED产品效果究竟如何?
- AMP Robotics募资5500万美元 开发AI对可回收物进行分拣