9

The glmnet package uses a range of LASSO tuning parameters lambda scaled from the maximal lambda_max under which no predictors are selected. I want to find out how glmnet computes this lambda_max value. For example, in a trivial dataset:

set.seed(1)
library("glmnet")
x <- matrix(rnorm(100*20),100,20)
y <- rnorm(100)
fitGLM <- glmnet(x,y)
max(fitGLM$lambda)
# 0.1975946

The package vignette (http://www.jstatsoft.org/v33/i01/paper) describes in section 2.5 that it computes this value as follows:

sx <- as.matrix(scale(x))
sy <- as.vector(scale(y))
max(abs(colSums(sx*sy)))/100
# 0.1865232

Which clearly is close but not the same value. So, what causes this difference? And in a related question, how could I compute lambda_max for a logistic regression?

4

5 回答 5

9

要获得相同的结果,您需要使用标准偏差n而不是n-1分母来标准化变量。

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)))
max(abs(colSums(sx*sy)))/100
## [1] 0.1758808
fitGLM <- glmnet(sx,sy)
max(fitGLM$lambda)
## [1] 0.1758808
于 2014-10-28T19:50:47.923 回答
5

逻辑回归的计算似乎lambda_max与线性回归类似,但权重基于类比例:

set.seed(1)
library("glmnet")
x <- matrix(rnorm(100*20),100,20)
y <- rnorm(100)

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)

y_bin <- factor(ifelse(y<0, -1, 1))
prop.table(table(y_bin)) 
# y_bin
#   -1    1 
# 0.62 0.38 
fitGLM_log <- glmnet(sx, y_bin, family = "binomial")
max(fitGLM_log$lambda)
# [1] 0.1214006
max(abs(colSums(sx*ifelse(y<0, -.38, .62))))/100
# [1] 0.1214006
于 2017-06-29T22:44:25.473 回答
3

对于第二个问题,请参阅 Friedman 等人的论文“Regularization paths for generalized linear models via coordinate descent”。特别是,参见方程(10),它是平衡时的平等。只需检查在什么条件下所有参数的分子 $S(\cdot,\cdot)$ 都为零。

于 2015-12-11T00:23:52.993 回答
1

抱歉,已经有一段时间了,但也许仍然有帮助:

您可以通过在完全正则化模型的优化参数值(例如,所有惩罚参数设置为零)。

不过,遗憾的是,我无法帮助解决价值观的差异。虽然我可以说我尝试使用比计算出的最大 lambda 高一点的最大 lambda 值(比如 5%),但所有选定参数受约束的模型肯定会成为估计模型数量的一部分。也许这就是 glmnet 正在做的事情。

编辑:抱歉,我将非正则化模型与完全惩罚模型混淆了。现在在上面编辑它。

于 2021-03-06T00:14:27.463 回答
0

根据help("glmnet")最大 lambda 值是“所有系数为零的最小值”:

sum(fitGLM$beta[, which.max(fitGLM$lambda)])
#[1] 0
sum(glmnet(x,y, lambda=max(fitGLM$lambda)*0.999)$beta)
#[1] -0.0001809804

乍一看,该值似乎是由调用的 Fortran 代码计算得出的elnet

于 2014-08-12T09:44:15.677 回答