последовательность лямбда по умолчанию в glmnet для перекрестной проверки

Кто-нибудь знает, как cv.glmnet (в glmnet R) или LassoCV (scikit-learn) выбирает последовательность констант регуляризации (лямбда-выражения), которые они используют при перекрестной проверке? Большое спасибо!


person user2575760    schedule 15.05.2014    source источник
comment
(По крайней мере, в R glmnet) Никогда не используйте лямбда-последовательность по умолчанию, это опасно. Всегда указывайте свою собственную последовательность.   -  person smci    schedule 02.07.2015
comment
@smci Можете ли вы объяснить, чем / почему лямбда-последовательность по умолчанию в glmnet опасна? Спасибо.   -  person visitor    schedule 21.02.2017
comment
@visitor: не обязательно гарантировано найти лямбду, минимизирующую CVE. Может, может нет. Постройте кривую отклонения/логарифма (лямбда), чтобы увидеть, нашли ли вы ее. Совет, который мне всегда давали, заключался в том, чтобы определить свою собственную лямбда-последовательность и настроить ее, если она не подходит.   -  person smci    schedule 21.02.2017


Ответы (1)


Согласно Friedman, Hastie & Tibshirani (2010), «стратегия состоит в том, чтобы выбрать минимальное значение lambda_min = epsilon * lambda_max и построить последовательность K значений lambda, уменьшающихся от lambda_max до lambda_min по логарифмической шкале. Типичные значения: эпсилон = 0,001 и K = 100».

В следующем примере генерируются данные, вычисляется лямбда-путь и сравнивается с glmnet:

## Load library and generate some data to illustrate:
library("glmnet")
set.seed(1)
n <- 100
x <- matrix(rnorm(n*20), n, 20)
y <- rnorm(n)

## Standardize variables: (need to use n instead of (n-1) as denominator)
mysd <- function(z) sqrt(sum((z-mean(z))^2)/length(z))
sx <- scale(x, scale = apply(x, 2, mysd))
sx <- as.matrix(sx, ncol = 20, nrow = 100)

## Calculate lambda path (first get lambda_max):
lambda_max <- max(abs(colSums(sx*y)))/n
epsilon <- .0001
K <- 100
lambdapath <- round(exp(seq(log(lambda_max), log(lambda_max*epsilon), 
                            length.out = K)), digits = 10)
lambdapath

## Compare with glmnet's lambda path:
fitGLM <- glmnet(sx, y)
fitGLM$lambda

Обратите внимание, что glmnet не вычисляет решения для всех 100 (по умолчанию) значений лямбда, а останавливается раньше. Не знаю, каковы правила остановки.

См. также Как glmnet вычисляет максимальное значение лямбда


Фридман Дж., Хасти Т. и Тибширани Р. (2010). Пути регуляризации для обобщенных линейных моделей через координатный спуск. Журнал статистического программного обеспечения, 33(1), 1.

person Marjolein Fokkema    schedule 26.07.2017
comment
Кажется, вы нормализуете вектор y, а затем вычисляете lambda_max. Согласно пакету, y только центрируется, а не масштабируется??? - person mert; 29.05.2018
comment
Конечно. Но если вы замените строку sy <- as.vector(scale(y, scale = mysd(y))) на sy <- y, вычисленные lambdapath и fitGLM$lambda все равно будут равны. - person Marjolein Fokkema; 29.05.2018
comment
Опущена нормализация y сейчас. - person Marjolein Fokkema; 04.05.2021