首页 > 解决方案 > 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软件包特有的。

抱歉,我无法提供可重现的示例——我的数据集很大,我不确定小示例数据集是否会发生同样的事情。

标签: rlogistic-regressionpredictiongammgcv

解决方案


来自predict.bam帮助:
“当离散=真时,newdata 中的预测数据以与使用 bam 的离散拟合方法相同的方式离散化。但是,离散化网格当前与拟合期间使用的网格不同。相反,离散化完成重新获取预测数据。这意味着,如果您正在预测一组相对较小的预测数据,或者在规则网格上,那么结果实际上可能与没有离散化的结果相同。这种方法的缺点是,如果你用一个大的数据框进行预测,然后将其拆分成更小的数据框再次进行预测,结果可能会略有不同,因为离散化误差略有不同。”

您可能无法切换到游戏或使用离散=假,因为您需要速度。但是你必须处理一些小的差异作为交换。从帮助中,听起来您可以通过仔细选择子集来最小化这种情况,但您无法完全消除它。


推荐阅读