【问题标题】:Write a loop for penalized models为惩罚模型编写循环
【发布时间】:2019-06-11 23:34:03
【问题描述】:

我在 R 中使用 glmnet 包为大学的一门学科工作。我开始使用 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()

【问题讨论】:

    标签: r


    【解决方案1】:

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

    首先

    在您的代码中没有xtestytest

    所以我是随机做的

    第二

    listx 必须是存储结果的结果,而不是迭代!!

    我将for语句中的listx更改为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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      相关资源
      最近更新 更多