我正在使用R软件包glmnet在R中研究大学的一个学科。我开始使用R,并且在某些问题上需要帮助:
我需要做一些练习,其中我训练和测试了500次,有些模型(OLS,Ridge和LASSO)。之后,我需要为500个迭代中的每个迭代存储MSE。 在训练步骤中,我必须使用5倍交叉验证。
所以我对此有疑问,因为我不知道如何编写正确的代码。
我需要知道如何以5倍cv的方式配置cv.glmnet,以及如何编写循环以进行500次迭代并存储每个循环的MSE。
非常感谢,对不起我的英语!
#Generación de muestra de entrenamiento
ne <- 100
pe <- 100
listx<-list()
for(listx in 1:500) {
xtrain <- matrix (rnorm(ne*pe), ne, pe)
ytrain <- apply(xtrain[,1:pe], 1, sum) + rnorm(ne)
olsreg <- lm(ytrain~xtrain)
ridgereg <-cv.glmnet(xtrain, ytrain, type.measure = "mse", alpha=0, family="gaussian")
ridgeregpr <- predict(ridgereg, s=ridgereg$lambda.min, newx=xtest)
mseridge <-mean((ytest-ridgeregpr)^2)
lassoreg <-cv.glmnet(xtrain, ytrain, type.measure = "mse", alpha=1, family="gaussian")
lassoregpr <- predict(lassoreg, s=lassoreg$lambda.min, newx=xtest)
mselasso <-mean((ytest-lassoregpr)^2)
}
results <- data.frame()
答案 0 :(得分:0)
我试图运行您的代码,并找到了解决方案。
您的代码中没有xtest
和ytest
。
所以我随机做
listx
必须是存储您的结果的结果,而不是迭代!!
我将listx
语句中的for
更改为iter
我将结果分配到listx
列表中。
迭代之后,我使用rbindlist
使其成为data.frame
类。
在我的代码中,为了方便起见,我10
次而不是500
次迭代!
library(glmnet)
library(data.table)
#Generación de muestra de entrenamiento
ne <- 100
pe <- 100
listx<-list()
for(iter in 1:10) {
xtrain <- matrix (rnorm(ne*pe), ne, pe)
ytrain <- apply(xtrain[,1:pe], 1, sum) + rnorm(ne)
xtest <- matrix (rnorm((ne-50)*(pe)), ne-50)
ytest <- apply(xtest[,1:(pe-50)], 1, sum) + rnorm(ne-50)
olsreg <- lm(ytrain~xtrain)
ridgereg <-cv.glmnet(xtrain, ytrain, type.measure = "mse", alpha=0, family="gaussian")
ridgeregpr <- predict(ridgereg, s=ridgereg$lambda.min, newx=xtest)
mseridge <-mean((ytest-ridgeregpr)^2)
lassoreg <-cv.glmnet(xtrain, ytrain, type.measure = "mse", alpha=1, family="gaussian")
lassoregpr <- predict(lassoreg, s=lassoreg$lambda.min, newx=xtest)
mselasso <-mean((ytest-lassoregpr)^2)
listx[[iter]] = data.frame(mseridge = mseridge,
mselasso = mselasso)
}
results <- rbindlist(listx)
结果如下所示
> results
mseridge mselasso
1: 36.36702 42.04854
2: 44.73392 81.36519
3: 40.37621 75.39565
4: 42.75282 61.04850
5: 42.30007 55.44008
6: 55.58605 76.35885
7: 38.62277 36.18105
8: 36.77701 69.17898
9: 56.83311 75.61917
10: 33.56595 66.23441