Перекрестная проверка (разделение набора данных) для elasti c net в ensr - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь внедрить проверку вложенности для моего elasti c net. Я хотел бы использовать пакет R ensr для elasti c net, внутренне он использует перекрестную проверку для нахождения гиперпараметров.

Вместо того, чтобы делать только одно начальное разделение в обучающих и тестовых данных, я хотел бы сделать несколько разделений (= перекрестная проверка), чтобы получить Надежная модель. Я новичок как в elasti c nets / ensr, так и в перекрестной проверке, но я старался учить себя и много читать.

С помощью одного урока (https://github.com/STATWORX/blog/blob/master/cross-validation/cv_from_scratch.R) и виньетки ensr я придумал этот код:

devtools::install_github("andrebleier/Xy")
library(tidyverse)
library(Xy)

#Simulate data
sim <- Xy(n = 1000,
          numvars = c(2,2),
          catvars = 0,
          cor = c(-0.5, 0.9),
          noisevars = 0)

sim_data <- as.data.frame(sim$data[ ,-1])

# Define k
k <- 5

#Partition the data
set.seed(12345)
datas <- mutate(sim_data,
                   my.folds = sample(1:k,
                                     size = nrow(sim_data),
                                     replace = TRUE))


cv.fun <- function(this.fold, data){

  train <- filter(data, my.folds != this.fold)
  test <- filter(data, my.folds == this.fold)
  x_train <- model.matrix(y ~., train[ ,-length(train)])[,-1] # matrix
  x_train_s <- scale(x_train, center=T, scale=T) # standardize
  y_train <- train$y # output
  y_train_s <- scale(y_train, center=T, scale=T) #standardize
  x_test <- model.matrix(y ~., test[ ,-length(test)])[,-1] # matrix
  x_test_s <- scale(x_test, center=T, scale=T) # standardize
  y_test <- test$y # output
  y_test_s <- scale(y_test, center=T, scale=T) #standardize

  elastic_model <-ensr(y = y_train_s, x = x_train_s, standardize = FALSE, family="gaussian") # fit model
  this.min.cvm <- summary(elastic_model)[cvm==min(cvm)]

  predictions <- elastic_model %>% predict(x_test_s) %>% as.vector()
  test.out <- data.frame(
    RMSE = RMSE(predictions, y_test_s),
    Rsquare = R2(predictions, y_test_s)
  )

  return(test.out)
}

#Iterate through each fold
cv.error <- sapply(seq_len(k),
                   FUN = cv.fun,
                   data =datas) %>%
  mean()

#Return the cross-validation error
cv.error

(Чтобы привести воспроизводимый пример с данными из учебника, с некоторыми изменениями, чтобы сделать его более сопоставимым с моим собственным набором данных).

Однако в функции, похоже, произошла ошибка (не удается найти объект x_train_s). Я думаю, что в целом может быть более элегантный способ сделать это, но я просто не знаю как ...

Я был бы так счастлив, если бы кто-нибудь мог предложить мне некоторые приспособления или код в целом! Что мне нужно, это как минимум вывод гиперпараметров (альфа, лямбда, а также cvm) для каждой из моделей (например, k = 5) и их производительность на тестовом наборе. Насколько я понял, я мог бы затем усреднить или что-то еще, чтобы найти окончательную модель ...

PS: Я также читал о пакете caret, но я думаю, что он не имеет реализации для ensr и, как я новичок ie было бы неплохо, если бы все было более ясно, чтобы я знал, что происходит ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...