我有两个关于交叉验证的问题。我试图为自己创建一个交叉验证代码,以提高我的直觉。特别是我找到了Lasso的最佳惩罚参数lambda。
以下是我的简历代码:
CV_lambda <- matrix(0, length(lambda_grid), 2)
colnames(CV_lambda) <- c("lambda", "CV-est")
#Loop for a vector of Lambda values
for(l in 1:length(lambda_grid)){
#Number of folds
nfolds <- 5
#Fold IDs
foldid <- sample(rep(seq(nfolds), length = N))
#Output Store
cv_out <- as.list(seq(nfolds))
mspe_out <- matrix(0, 1, nfolds)
#Cross-Validation
for(i in seq(nfolds)){
y_train <- y[!foldid == i,]
X_train <- X[!foldid == i,]
#Lasso is a self-written function, estimating a lasso-regression
cv_out[i] <- lasso(y_train, X_train, lambda=lambda_grid[l])
predict <- X[foldid == i,] %*% cv_out[[i]]
mspe_out[i] <- mean((y[foldid == i,] - predict)^2)
}
CV_lambda[l,] <- c(lambda_grid[l],mean(mspe_out))
}
lambda_opt <- CV_lambda[which.min(CV_lambda[,2]),1]
关于简历,我有两个问题。我坐在这里待了几个多小时才能找到两个问题的解决方案。如果你们中的一些人可以帮助我,我将非常感激。因为我是初学者,所以“守则”并不是很清晰。但是,我的问题如下:
为了一般的理解。 LASSO-Regression需要惩罚参数,这对结果有很大影响。目标是选择这个lambda,它减少均方预测误差。
1)在每个lambda序列中对样本的拆分是否应该相等,还是应该不同(如我的代码所示)。我有点怀疑这个。
2)由于我对代码非常不确定,我想将结果与glmnet进行比较。有办法吗? glmnet也随机抽样。然后比较是不可能的。有人知道如何用我的代码“重现”cv.glmnet结果来查找我的代码中的错误吗?