在R中实现线性回归的蒙特卡罗交叉验证

时间:2015-11-10 13:25:45

标签: r cross-validation montecarlo

我有一个包含各种不同协变量的90个站点的数据集,我希望通过逐步前向多元回归来进行预测。因此,我想使用蒙特卡罗交叉验证通过多次分解为测试和训练测试来估计我的线性模型的性能。 如何在R中实现MCCV以测试我的模型进行某些迭代?我找到了包WilcoxCV,它给出了每次迭代的观察数。我还发现CMA包到目前为止对我没什么帮助。 我查看了有关MCCV的所有主题但没有找到答案。

1 个答案:

答案 0 :(得分:3)

您可以使用caret包。 MCCV被称为LGOCV'在这个包中(即Leave Group Out 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

修改

alpha函数中的

lambdaexpand.grid个参数是glmnet个特定参数。如果你使用另一个模型,它将有一组不同的参数来优化。

lambda是正则化的数量,即对β值的惩罚量。较大的值会使&#34;更简单&#34;模型,不易过度拟合,较小的值更复杂的模型,如果没有足够的数据可能会过度拟合。我提供的lambda值只是一个例子。提供您感兴趣的网格。但总的来说,为lambda提供指数递减的序列是很好的。

alpha是L1和L2正则化之间的混合参数。 alpha=1是L1,alpha=0是L2正则化。我只在网格中为此参数提供了一个值。当然可以提供几个,例如测试L1,L2和两者的均匀混合的alpha=c(0,0.5,1)

expand.grid创建一个我们想要运行MCCV过程的潜在参数值网格。基本上,MCCV程序将评估网格中每个不同值的性能,并为您选择最佳值。

您可以在此处阅读有关glmnet,插入符号和参数调整的更多信息: