插入符号中没有重采样的 GAM 方法会产生停止错误
GAM method without resampling in caret produces stop error
我在 lapply 中编写了一个函数,用于为数据框中的响应变量向量中的每个元素拟合 GAM(带样条)。我选择使用 caret
来拟合模型而不是直接使用 mgcv
或 gam
包,因为我想最终将我的数据拆分成一个 train/test 集用于验证和使用各种重采样技术。现在,我只是将 trainControl
方法设置为 'none',如下所示:
# Set resampling method
# tc <- trainControl(method = "boot", number = 100)
# tc <- trainControl(method = "repeatedcv", number = 10, repeats = 1)
tc <- trainControl(method = "none")
fm <- lapply(group, function(x) {
printFormula <- paste(x, "~", inf.factors)
inputFormula <- as.formula(printFormula)
# Partition input data for model training and testing
# dpart <- createDataPartition(mdata[,x], times = 1, p = 0.7, list = FALSE)
# train <- mdata[ data.partition, ]
# test <- mdata[ -data.partition, ]
cat("Fitting:", printFormula, "\n")
# gam(inputFormula, family = binomial(link = "logit"), data = mdata)
train(inputFormula, family = binomial(link = "logit"), data = mdata, method = "gam",
trControl = tc)
})
当我执行这段代码时,我收到以下错误:
Error in train.default(x, y, weights = w, ...) :
Only one model should be specified in tuneGrid with no resampling
如果我在调试模式下重新运行代码,我可以找到caret
停止训练过程的地方:
if (trControl$method == "none" && nrow(tuneGrid) != 1)
stop("Only one model should be specified in tuneGrid with no resampling")
很明显,train
函数由于第二个条件而失败,但是当我查找 tuning parameters for a GAM(带样条曲线)时,只有一个用于特征选择的选项(不感兴趣,我想保留模型中的所有预测变量)和方法。因此,我在调用 train
时不包含 tuneGrid
数据框。这是模型以这种方式失败的原因吗?我会提供什么参数,tuneGrid 会是什么样子?
我应该补充一点,当我使用引导程序或 k-fold CV 时模型训练成功,但是这些重采样方法需要更长的时间来计算,我还不需要使用它们。
如能就此问题提供任何帮助,我们将不胜感激!
对于该模型,调整网格查看 select
参数的两个值:
> getModelInfo("gam", regex = FALSE)[[1]]$grid
function(x, y, len = NULL, search = "grid") {
if(search == "grid") {
out <- expand.grid(select = c(TRUE, FALSE), method = "GCV.Cp")
} else {
out <- data.frame(select = sample(c(TRUE, FALSE), size = len, replace = TRUE),
method = sample(c("GCV.Cp", "ML"), size = len, replace = TRUE))
}
out[!duplicated(out),]
}
您应该使用 tuneGrid = data.frame(select = FALSE, method = "GCV.Cp")
之类的东西来仅评估单个模型(如错误消息所述)。
我在 lapply 中编写了一个函数,用于为数据框中的响应变量向量中的每个元素拟合 GAM(带样条)。我选择使用 caret
来拟合模型而不是直接使用 mgcv
或 gam
包,因为我想最终将我的数据拆分成一个 train/test 集用于验证和使用各种重采样技术。现在,我只是将 trainControl
方法设置为 'none',如下所示:
# Set resampling method
# tc <- trainControl(method = "boot", number = 100)
# tc <- trainControl(method = "repeatedcv", number = 10, repeats = 1)
tc <- trainControl(method = "none")
fm <- lapply(group, function(x) {
printFormula <- paste(x, "~", inf.factors)
inputFormula <- as.formula(printFormula)
# Partition input data for model training and testing
# dpart <- createDataPartition(mdata[,x], times = 1, p = 0.7, list = FALSE)
# train <- mdata[ data.partition, ]
# test <- mdata[ -data.partition, ]
cat("Fitting:", printFormula, "\n")
# gam(inputFormula, family = binomial(link = "logit"), data = mdata)
train(inputFormula, family = binomial(link = "logit"), data = mdata, method = "gam",
trControl = tc)
})
当我执行这段代码时,我收到以下错误:
Error in train.default(x, y, weights = w, ...) :
Only one model should be specified in tuneGrid with no resampling
如果我在调试模式下重新运行代码,我可以找到caret
停止训练过程的地方:
if (trControl$method == "none" && nrow(tuneGrid) != 1)
stop("Only one model should be specified in tuneGrid with no resampling")
很明显,train
函数由于第二个条件而失败,但是当我查找 tuning parameters for a GAM(带样条曲线)时,只有一个用于特征选择的选项(不感兴趣,我想保留模型中的所有预测变量)和方法。因此,我在调用 train
时不包含 tuneGrid
数据框。这是模型以这种方式失败的原因吗?我会提供什么参数,tuneGrid 会是什么样子?
我应该补充一点,当我使用引导程序或 k-fold CV 时模型训练成功,但是这些重采样方法需要更长的时间来计算,我还不需要使用它们。
如能就此问题提供任何帮助,我们将不胜感激!
对于该模型,调整网格查看 select
参数的两个值:
> getModelInfo("gam", regex = FALSE)[[1]]$grid
function(x, y, len = NULL, search = "grid") {
if(search == "grid") {
out <- expand.grid(select = c(TRUE, FALSE), method = "GCV.Cp")
} else {
out <- data.frame(select = sample(c(TRUE, FALSE), size = len, replace = TRUE),
method = sample(c("GCV.Cp", "ML"), size = len, replace = TRUE))
}
out[!duplicated(out),]
}
您应该使用 tuneGrid = data.frame(select = FALSE, method = "GCV.Cp")
之类的东西来仅评估单个模型(如错误消息所述)。