Неизмененные значения `lambda.min` для множественных регрессий ЛАССО в R

#r #lambda #regression #lasso-regression

#r #лямбда #регрессия #лассо-регрессия

Вопрос:

Я пытаюсь выполнить несколько регрессий ЛАССО в R, используя следующий код:

 library(readxl)
data <-read_excel("data.xlsx") # 20x20 matrix  
library(glmnet)
    library(coefplot)
    
    A <- as.matrix(data)
    results <- lapply(seq_len(ncol(A)), function(i) {
      list(
    fit_lasso = glmnet(A[, -i], A[, i], standardize = T, alpha = 1), 
    cvfit = cv.glmnet(A[, -i] , A[, i] , standardize = TRUE , type.measure = "mse" , nfolds = 10 , alpha = 1)
  )
})
coefficients <- lapply(results, function(x, fun) fun(coef(x$cvfit, s = "lambda.min")), function(x) x[x[, 1L] != 0L, 1L, drop = FALSE])
  

Мой вывод results приводит к a Large list (20 elements, 1MB) с 20 одинаковыми выводами ЛАССО, но для 20 переменных, а coefficients вывод — это только значимые переменные в каждом случае.

Я заметил, что для одного и того же набора данных результаты не всегда одинаковы — может быть, из-за изменения значений лямбды при каждом запуске? не уверен. Я хочу сделать так, чтобы мой код находил одни и те же lambda.min ‘ы и всегда давал одни и те же результаты при запуске набора данных. Я считаю, что set.seed () может управлять этим, но не может понять, как его включить.

Как я могу всегда заставлять его печатать одни и те же выходные данные для определенного набора данных?

Ответ №1:

Я получил его для получения одних и тех же lambda.min значений от запуска к запуску, просто поместив set.seed() перед списком. Затем вы устанавливаете начальное значение для случайных розыгрышей при выполнении перекрестной проверки.

 library(readxl)
data <-read_excel("data.xlsx") # 20x20 matrix  
library(glmnet)
    library(coefplot)
    
    A <- as.matrix(data)
 set.seed(54234)   
 results <- lapply(seq_len(ncol(A)), function(i) {
      list(
    fit_lasso = glmnet(A[, -i], A[, i], standardize = T, alpha = 1), 
    cvfit = cv.glmnet(A[, -i] , A[, i] , standardize = TRUE , type.measure = "mse" , nfolds = 10 , alpha = 1)
  )
})
coefficients <- lapply(results, function(x, fun) fun(coef(x$cvfit, s = "lambda.min")), function(x) x[x[, 1L] != 0L, 1L, drop = FALSE])
  

Комментарии:

1. может ли количество set.seed повлиять на эффективность результатов? Я имею в виду, есть ли оптимальное начальное значение?

2. Другое значение set.seed приведет к другому результату, но этот результат будет тем же, если вы снова запустите функцию. Результаты по своей сути являются переменными из-за случайности при перекрестной проверке.