为惩罚模型编写循环

时间:2019-06-11 23:34:03

标签: r

我正在使用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()

1 个答案:

答案 0 :(得分:0)

我试图运行您的代码,并找到了解决方案。

第一

您的代码中没有xtestytest

所以我随机做

第二

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