r - GAM 预测的可重复性(mgcv 包)
问题描述
我正在使用使用R 包bam()
中的函数构建的广义加法模型mgcv
来预测二元响应的概率。
对于相同的输入数据,我似乎得到的预测略有不同,具体取决于所newdata
提供表格的组成,并且不明白为什么。
该模型是使用如下公式构建的:
model <- bam(response ~ categorical_predictor1 + s(continuous_predictor, bs='tp'),
data=data,
family="binomial",
select=TRUE,
discrete=TRUE,
nthreads = 16)
我还有几个分类和连续的预测变量,但为了节省空间,我在上面的公式中只提到了两个。
然后我这样预测:
predictions <- predict(model,
newdata = newdata,
type="response")
我想对大约 250 万行进行预测,但在测试期间,我预测了 250,000 行的子集。
每次我使用模型来预测该子集(即newdata=subset
)时,我都会得到相同的输出 - 这是可重现的。但是,如果我使用该模型来预测包含 250 万行(即newdata=full_data
)的完整表中的同一子集,那么对于 250,000 行的子集,我得到的预测与单独预测它们时的预测略有不同。
我一直认为每一行都是根据提供的预测器依次预测的,所以无法理解为什么预测会随着“newdata”的上下文而变化。如果我预测使用标准 glm 或随机森林,则不会发生这种情况,因此我认为这是游戏或mgcv
软件包特有的。
抱歉,我无法提供可重现的示例——我的数据集很大,我不确定小示例数据集是否会发生同样的事情。
解决方案
来自predict.bam
帮助:
“当离散=真时,newdata 中的预测数据以与使用 bam 的离散拟合方法相同的方式离散化。但是,离散化网格当前与拟合期间使用的网格不同。相反,离散化完成重新获取预测数据。这意味着,如果您正在预测一组相对较小的预测数据,或者在规则网格上,那么结果实际上可能与没有离散化的结果相同。这种方法的缺点是,如果你用一个大的数据框进行预测,然后将其拆分成更小的数据框再次进行预测,结果可能会略有不同,因为离散化误差略有不同。”
您可能无法切换到游戏或使用离散=假,因为您需要速度。但是你必须处理一些小的差异作为交换。从帮助中,听起来您可以通过仔细选择子集来最小化这种情况,但您无法完全消除它。
推荐阅读
- r - geom_area 默认绘制堆叠区域
- c# - 当源为空时如何防止 AutoMapper 初始化目标 JObject 成员
- gcc - x86 汇编程序如何知道从哪里开始执行?
- r - 如何在 Rmarkdown 的表格中添加 fontawesome 图标?
- node.js - 使用 CouchDB 和 Node.JS (Nano) 的忘记密码功能
- javascript - 引导示例轮播代码不切换幻灯片
- react-native - 当组件以 React Native 呈现时,动态添加组件道具
- object - Dart:如何将对象数组转换为哈希图数组?
- pandas - 如何获取日期以及我执行的功能?
- eclipse - 为什么 Eclipse 加载速度比 Canopy 快?