Я пытаюсь внедрить проверку вложенности для моего 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 было бы неплохо, если бы все было более ясно, чтобы я знал, что происходит ...