Коэффициенты усреднения после повторного CV с помощью glmnet(Utils)

Я использовал glmnetUtils для запуска повторного CV более 11 значений альфа. Мои навыки кодирования ограничены, поэтому я выполнил N повторов отдельно, каждый раз исправляя сгибы:

alpha <- seq(.5, 1, .05)

set.seed(1)
folds1 <- sample(1:10, size = length(df$id[1:2300]), replace = TRUE)

set.seed(2)
folds2 <- sample(1:10, size = length(df$id[1:2300]), replace = TRUE)

# Run glmnet

enet.1 <- cva.glmnet(x, y,
                     foldid = folds1,
                     alpha = alpha,
                     family = "binomial")

enet.2 <- cva.glmnet(x, y,
                     foldid = folds2,
                     alpha = alpha,
                     family = "binomial")


# Determine optimal combination of alpha and lambda; extract lowest CV error and associated lambda at each alpha

extractGlmnetInfo <- function(object)
{
  # Find lambdas
  lambda.min <- object$lambda.min
  lambda.1se <- object$lambda.1se

  # Determine where lambdas fall in path
  which.min <- which(object$lambda == lambda.min)
  which.1se <- which(object$lambda == lambda.1se)

  # Create data frame with selected lambdas and corresponding error
  data.frame(lambda.min = lambda.min, cv.min = object$cvm[which.min],
             lambda.1se = lambda.1se, cv.1se = object$cvm[which.1se])
}

# Extract smallest CV error and lambda at each alpha for each iteration of 10-fold CV
# Calculate means (across iterations) of lowest CV error and associated lambdas for each alpha

enet.iter.1 <- ldply(enet.1$modlist, extractGlmnetInfo)
enet.iter.2 <- ldply(enet.2$modlist, extractGlmnetInfo)

enet.iter <- bind_rows(enet.iter.1, enet.iter.2)

enet.iter <- data.frame(cbind(alpha, enet.iter))

lambda.min <- aggregate(lambda.min ~ alpha, enet.iter, mean)
cv.min <- aggregate(cv.min ~ alpha, enet.iter, mean)
lambda.1se <- aggregate(lambda.1se ~ alpha, enet.iter, mean)
cv.1se <- aggregate(cv.1se ~ alpha, enet.iter, mean)

# Create data frame with means of CV error and lambda at each value of alpha

enet.means <- data.frame(lambda.min, cv.min$cv.min, lambda.1se, cv.1se$cv.1se)
enet.means$alpha.1 <- NULL
colnames(enet.means)[2] <- "lambda.min"
colnames(enet.means)[3] <- "cv.min"
colnames(enet.means)[4] <- "lambda.1se"
colnames(enet.means)[5] <- "cv.1se"

# Extract optimal values of alpha and lambda

enet.error.min <- min(enet.means$cv.min)
enet.lambda.min <- enet.means$lambda.min[which(enet.means$cv.min == min(enet.means$cv.min))]
enet.alpha.min <- enet.means$alpha[which(enet.means$cv.min == min(enet.means$cv.min))]

enet.error.1se <- min(enet.means$cv.1se)
enet.lambda.1se <- enet.means$lambda.1se[which(enet.means$cv.1se == min(enet.means$cv.1se))]
enet.alpha.1se <- enet.means$alpha[which(enet.means$cv.1se == min(enet.means$cv.1se))]

enet.optimal <- list(enet.error.min, enet.lambda.min, enet.alpha.min,
                     enet.error.1se, enet.lambda.1se, enet.alpha.1se)

names(enet.optimal) <- c("error.min", "lambda.min", "alpha.min", "error.1se", "lambda.1se", "alpha.1se")

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

Вопрос

Можно ли извлечь и усреднить коэффициенты, используя glmnet(Utils), или лучше приспособить новую модель, используя оптимальную комбинацию альфа и лямбда (и уникальные сгибы), и использовать коэффициенты, сгенерированные с помощью этой модели?

0 ответов

Другие вопросы по тегам