您可以使用caret 包。 MCCV 在此包中称为“LGOCV”(即离开组 CV)。它随机选择训练集和测试集之间的分割。
这是一个使用 L1 正则化回归模型训练的示例(您应该研究正则化而不是逐步的 btw),使用 MCCV 验证惩罚 lambda 参数的选择:
library(caret)
library(glmnet)
n <- 1000 # nbr of observations
m <- 20 # nbr of features
# Generate example data
x <- matrix(rnorm(m*n),n,m)
colnames(x) <- paste0("var",1:m)
y <- rnorm(n)
dat <- as.data.frame(cbind(y,x))
# Set up training settings object
trControl <- trainControl(method = "LGOCV", # Leave Group Out CV (MCCV)
number = 10) # Number of folds/iterations
# Set up grid of parameters to test
params = expand.grid(alpha=c(0,0.5,1), # L1 & L2 mixing parameter
lambda=2^seq(1,-10, by=-0.3)) # regularization parameter
# Run training over tuneGrid and select best model
glmnet.obj <- train(y ~ ., # model formula (. means all features)
data = dat, # data.frame containing training set
method = "glmnet", # model to use
trControl = trControl, # set training settings
tuneGrid = params) # set grid of params to test over
# Plot performance for different params
plot(glmnet.obj, xTrans=log, xlab="log(lambda)")
# Plot regularization paths for the best model
plot(glmnet.obj$finalModel, xvar="lambda", label=T)
您可以使用 glmnet 来训练线性模型。如果您想使用逐步插入符号也支持使用例如method = 'glmStepAIC' 或类似的。
可以在此处找到功能选择包装器的列表:http://topepo.github.io/caret/Feature_Selection_Wrapper.html
编辑
expand.grid 函数中的alpha 和lambda 参数是glmnet 特定参数。如果您使用其他模型,它将有一组不同的参数进行优化。
lambda 是正则化量,即对 beta 值的惩罚量。较大的值将给出“更简单”的模型,不太容易过度拟合,而较小的值将给出更复杂的模型,如果没有足够的数据可用,则往往会过度拟合。我提供的 lambda 值只是一个示例。提供您感兴趣的网格。但总的来说,为lambda 提供一个指数递减序列是很好的。
alpha是L1和L2正则化的混合参数。 alpha=1 是 L1,alpha=0 是 L2 正则化。我只在网格中为这个参数提供了一个值。当然可以提供几个,例如alpha=c(0,0.5,1),它将测试 L1、L2 以及两者的均匀混合。
expand.grid 创建一个潜在参数值网格,我们希望在其上运行 MCCV 程序。本质上,MCCV 过程会评估网格中每个不同值的性能,并为您选择最佳值。
您可以在此处阅读有关 glmnet、插入符号和参数调整的更多信息: