Написать цикл для оштрафованных моделей - PullRequest
0 голосов
/ 12 июня 2019

Я работаю в R с пакетом glmnet для предмета в университете.Я начинаю использовать R и мне нужна помощь для решения некоторых проблем:

Мне нужно выполнить упражнение, где я тренируюсь и тестирую 500 раз, некоторые модели (OLS, Ridge и LASSO).После этого мне нужно хранить MSE для каждой из 500 итераций.На этапе обучения я должен использовать 5-кратную перекрестную проверку.

Так что у меня проблемы с этим, потому что я не могу понять, как написать правильный код.

Iмне нужно знать, как настроить cv.glmnet таким образом, чтобы я мог использовать 5-кратное cv, и как написать цикл для выполнения 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 голосов
/ 12 июня 2019

Я попытался запустить ваш код, и я нашел решение.

Первый

В вашем коде нет 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...