首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在R中实现线性回归的蒙特卡罗交叉验证

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

Stack Overflow用户
提问于 2015-11-10 13:25:45
回答 1查看 2.3K关注 0票数 0

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

EN

回答 1

Stack Overflow用户

发布于 2015-11-10 13:46:29

您可以使用caret包。MCCV在这个包中被称为'LGOCV‘(即离开集团的简历)。它随机选择训练集和测试集之间的分裂。

下面是一个示例,使用训练L1正则化回归模型(您应该研究正则化而不是逐步btw),使用MCCV验证惩罚lambda参数的选择:

代码语言:javascript
运行
复制
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

编辑

alphalambda参数在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、插入符号和参数优化的内容:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33631082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档