r - 如何从迭代交叉验证计算 lambda.1se?
问题描述
我有以下代码来选择lambda
基于迭代交叉验证后产生的最低均方误差 (MSE) 的值。
library(glmnet)
set.seed(3)
IV1 <- data.frame(IV1 = rnorm(100))
IV2 <- data.frame(IV2 = rnorm(100))
IV3 <- data.frame(IV3 = rnorm(100))
IV4 <- data.frame(IV4 = rnorm(100))
IV5 <- data.frame(IV5 = rnorm(100))
DV <- data.frame(DV = rnorm(100))
data <- data.frame(IV1,IV2,IV3,IV4,IV5,DV)
x <- model.matrix(DV~.-IV5 , data)[ , -1]
y <- data$DV
AB <- glmnet(x=x, y=y, alpha=1)
plot(AB,xvar="lambda")
lambdas <- NULL
for (i in 1:100){
fit <- cv.glmnet(x, y)
errors <- data.frame(fit$lambda, fit$cvm)
lambdas <- rbind(lambdas, errors)
}
lambdas <- aggregate(lambdas[ , 2], list(lambdas$fit.lambda), mean)
bestindex <- which(lambdas[2]== min(lambdas[2]))
bestlambda <- lambdas[bestindex,1]
我将如何修改它以选择lambda.1se
(即 MSE 在最小 MSE 的一个标准误差内的最大 λ)?
编辑:
这个怎么样
lambdas <- NULL #initialize
n.fits <- 100
for (i in 1:n.fits) {
{
fit <- cv.glmnet(x,y)
errors = data.frame(fit$lambda,fit$cvm)
lambdas <- rbind(lambdas,errors)
r2[i]<-max(1-fit$cvm/var(y))
}
# take mean cvm for each lambda
lambdas <- aggregate(lambdas[, 2], list(lambdas$fit.lambda), mean)
lambdas<-as.data.frame(lambdas)
# find subset with mse within 1 se of mean
onese<-std.error(lambdas[2])
min<-min(lambdas[2])
low<-min-onese
high<-min+onese
lambdas<-subset(lambdas, x>low)
lambdas<-subset(lambdas, x<high)
#choose highest lambda among those
bestindex = which(lambdas[1]==max(lambdas[1]))
bestlambda = lambdas[bestindex,1]
解决方案
如果您决定使用cv.glmnet
,以下可能是您正在寻找的。(ps我还清理了您的模拟代码;请注意,我也没有使用显然与 不同的AB
对象)glmnet
cv.glmnet
library(glmnet)
## Simulate data:
set.seed(3)
x <- data.frame(
IV1 = rnorm(100),
IV2 = rnorm(100),
IV3 = rnorm(100),
IV4 = rnorm(100),
IV5 = rnorm(100)
)
x <- as.matrix(x)
y <- rnorm(100) #target or response
## Iteratively fit models
lambdas <- NULL #initialize
n.fits <- 100
for (i in 1:n.fits) {
fit <- cv.glmnet(x, y, family="gaussian")
df <- data.frame(fit$lambda.1se, mean(fit$cvm) ) #can use median for CVM also
lambdas <- rbind(lambdas, df)
}
## Select best lambda:
bestindex <- which.min(lambdas[ , 2]) #the way you had it was way too complicated
bestlambda <- lambdas[bestindex, 1]
bestlambda
推荐阅读
- javascript - 如何将鼠标限制为全屏电子应用程序?
- python - 如何将实时温度测量值附加到数据框中?
- c# - 无法在 asp.net core 中更新会话数据的值
- c++ - 使用 fork() 检查命令是否在没有系统功能的情况下成功执行
- assembly - 初始化全局变量并在 MIPS 中显示
- flutter - 使颤动的网络图像小部件可点击
- javascript - 如果用户隐藏字段,如何将隐藏的输入值更改为默认值?
- python - 超过时间限制。怎么了?
- django - Django CreateView 忽略 get_success_url
- hive - Hive 中多个字段的相同联接