GAM 预测的可重复性(mgcv 包)
Reproducibility of predictions from GAM (mgcv package)
我正在使用 mgcv
R 包中的 bam()
函数构建的广义加性模型来预测二元响应的概率。
我似乎对相同的输入数据得到略有不同的预测,这取决于所提供的 newdata
table 的构成,不明白为什么。
模型是使用如下公式构建的:
model <- bam(response ~ categorical_predictor1 + s(continuous_predictor, bs='tp'),
data=data,
family="binomial",
select=TRUE,
discrete=TRUE,
nthreads = 16)
我还有几个分类和连续的预测变量,但是为了节省space我在上面的公式中只提到了两个。
然后我这样预测:
predictions <- predict(model,
newdata = newdata,
type="response")
我想预测大约 250 万行,但在测试期间我预测了 250,000 的一个子集。
每次我使用模型预测该子集(即 newdata=subset
)时,我都会得到相同的输出 - 这是可重现的。但是,如果我使用该模型在 250 万行的完整 table 中预测同一子集(即 newdata=full_data
),那么我对该 250,000 行子集的预测与我预测它们时的预测略有不同分开。
我一直认为每一行都是根据提供的预测器依次预测的,所以无法理解为什么预测会随着“新数据”的上下文而变化。如果我预测使用标准 glm 或随机森林,则不会发生这种情况,因此我假设它是特定于 gams 或 mgcv
包的东西。
抱歉,我无法提供可重现的示例 - 我的数据集很大,我不确定小示例数据集是否会发生同样的事情。
来自 predict.bam
帮助:
“当 discrete=TRUE 时,newdata 中的预测数据以与使用 bam 离散拟合方法时相同的方式离散化。但是,离散化网格目前与拟合期间使用的网格不相同。相反,离散化重新进行预测数据。这意味着,如果您针对相对较小的预测数据集或在规则网格上进行预测,那么结果实际上可能与未经离散化获得的结果相同。这种方法的缺点是,如果您使用一个大数据帧,然后将其拆分成更小的数据帧再次进行预测,结果可能会略有不同,因为离散化误差略有不同。"
您可能无法切换到 gam 或使用 discrete=FALSE,因为您需要速度。但是你必须处理一些小的交换差异。从帮助来看,您似乎可以通过仔细选择子集来最小化它,但您将无法完全消除它。
我正在使用 mgcv
R 包中的 bam()
函数构建的广义加性模型来预测二元响应的概率。
我似乎对相同的输入数据得到略有不同的预测,这取决于所提供的 newdata
table 的构成,不明白为什么。
模型是使用如下公式构建的:
model <- bam(response ~ categorical_predictor1 + s(continuous_predictor, bs='tp'),
data=data,
family="binomial",
select=TRUE,
discrete=TRUE,
nthreads = 16)
我还有几个分类和连续的预测变量,但是为了节省space我在上面的公式中只提到了两个。
然后我这样预测:
predictions <- predict(model,
newdata = newdata,
type="response")
我想预测大约 250 万行,但在测试期间我预测了 250,000 的一个子集。
每次我使用模型预测该子集(即 newdata=subset
)时,我都会得到相同的输出 - 这是可重现的。但是,如果我使用该模型在 250 万行的完整 table 中预测同一子集(即 newdata=full_data
),那么我对该 250,000 行子集的预测与我预测它们时的预测略有不同分开。
我一直认为每一行都是根据提供的预测器依次预测的,所以无法理解为什么预测会随着“新数据”的上下文而变化。如果我预测使用标准 glm 或随机森林,则不会发生这种情况,因此我假设它是特定于 gams 或 mgcv
包的东西。
抱歉,我无法提供可重现的示例 - 我的数据集很大,我不确定小示例数据集是否会发生同样的事情。
来自 predict.bam
帮助:
“当 discrete=TRUE 时,newdata 中的预测数据以与使用 bam 离散拟合方法时相同的方式离散化。但是,离散化网格目前与拟合期间使用的网格不相同。相反,离散化重新进行预测数据。这意味着,如果您针对相对较小的预测数据集或在规则网格上进行预测,那么结果实际上可能与未经离散化获得的结果相同。这种方法的缺点是,如果您使用一个大数据帧,然后将其拆分成更小的数据帧再次进行预测,结果可能会略有不同,因为离散化误差略有不同。"
您可能无法切换到 gam 或使用 discrete=FALSE,因为您需要速度。但是你必须处理一些小的交换差异。从帮助来看,您似乎可以通过仔细选择子集来最小化它,但您将无法完全消除它。