【问题标题】:Implementing Monte Carlo Cross Validation on linear regression in R在 R 中实现线性回归的蒙特卡洛交叉验证
【发布时间】:2015-11-10 13:25:45
【问题描述】:

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

【问题讨论】:

  • 不要使用逐步回归。它有many problems,还有better alternatives
  • 感谢@Roland 的建议。我会考虑的,但我对 MCCV 的问题还是一样。

标签: r cross-validation montecarlo


【解决方案1】:

您可以使用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 函数中的alphalambda 参数是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、插入符号和参数调整的更多信息:

【讨论】:

  • 感谢您的回答。你能解释一下最后一行“tuneGrid = expand.grid(alpha=1, lambda=10^(-1:-10)))”吗?什么是 alpha,什么是 lambda,它们有何不同。
  • 我已经用一些关于这意味着什么的信息更新了我的答案。
猜你喜欢
  • 2019-09-07
  • 2021-05-06
  • 2023-03-05
  • 2018-09-06
  • 2018-10-03
  • 2017-05-18
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多