glmnet中的默认lambda序列,用于交叉验证

时间:2014-05-15 18:31:23

标签: glmnet lasso

有人知道cv.glmnet(在R< glmnet中)或LassoCV(scikit-learn)如何选择一系列正则化常数(lambdas),它们在交叉验证中使用?非常感谢你!

1 个答案:

答案 0 :(得分:3)

根据弗里德曼的说法,Hastie& Tibshirani(2010)'策略是选择最小值lambda_min = epsilon * lambda_max,并在对数尺度上构建λ值的λ值序列,从lambda_max减小到lambda_min。典型值为epsilon = 0.001和K = 100.'

以下示例生成数据,计算lambda路径并将其与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(y) sqrt(sum((y-mean(y))^2)/length(y))
sx <- scale(x, scale = apply(x, 2, mysd))
sx <- as.matrix(sx, ncol = 20, nrow = 100)
sy <- as.vector(scale(y, scale = mysd(y)))

## Calculate lambda path (first get lambda_max):
lambda_max <- max(abs(colSums(sx*sy)))/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, sy)
fitGLM$lambda

请注意,glmnet不会计算所有100(默认)lambda值的解决方案,但它会提前停止。不确定停止的规则是什么。

另见How does glmnet compute the maximal lambda value

Friedman,J.,Hastie,T。,&amp; Tibshirani,R。(2010年)。通过坐标下降的广义线性模型的正则化路径。 统计软件期刊,33 (1),1。