我有一个90个台站的数据集,有各种不同的协变量,我想用逐步的多元回归来预测。因此,我想使用蒙特卡洛交叉验证来评估我的线性模型的性能,通过多次分成测试和训练测试。我如何在R中实现MCCV来测试我的模型的某些迭代?我找到了包WilcoxCV,它为我提供了每次迭代的观察号。我还找到了CMA包,到目前为止对我没有多大帮助。我检查了所有关于MCCV的线程,但没有找到答案。
发布于 2015-11-10 13:46:29
您可以使用caret
包。MCCV在这个包中被称为'LGOCV‘(即离开集团的简历)。它随机选择训练集和测试集之间的分裂。
下面是一个示例,使用训练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'
或类似的方法来支持。
特性选择包装器的列表可以在这里找到:Wrapper.html
编辑
alpha
和lambda
参数在expand.grid
函数中是glmnet
特定的参数。如果您使用另一个模型,它将有一组不同的参数来进行优化。
lambda
是正则化的数量,即对β值的惩罚量。较大的值将提供“更简单”的模型,不太容易过度适应,而较小的值--更复杂的模型--如果没有足够的数据,往往会过度匹配。我提供的lambda值只是一个例子。提供您感兴趣的网格。但是一般来说,为lambda
提供一个指数递减序列是很好的。
alpha
是L1和L2正则化之间的混合参数。alpha=1
是L1,alpha=0
是L2正则化。我只为这个参数在网格中提供了一个值。当然可以提供几个,例如alpha=c(0,0.5,1)
,它将测试L1、L2和两者的混合。
expand.grid
创建了一个潜在参数值的网格,我们希望通过它来运行MCCV过程。本质上,MCCV过程将评估网格中每个不同值的性能,并为您选择最佳值。
您可以在这里阅读更多关于glmnet、插入符号和参数优化的内容:
https://stackoverflow.com/questions/33631082
复制相似问题