glmnet - 计算最大 lambda 值

机器算法验证 网络
2022-04-12 13:12:20

我希望能够在逻辑回归模型中计算 glmnet“lambda.max”值。lambda_max 值代表所有系数为零的最小值。

根据 glmnet 包 vignette,“没有给出 lambda.max,但很容易从输入 x 和 y 计算出来”。不幸的是,我不知道如何计算这个参数。

2个回答

没有选择参数的 lambda 的最小值可以通过下式计算

maxj1αni=1n[YiY¯(1Y¯)]Xij

看我的例子:

n <- 500
p <- 3
b <- c(-5,3,2,0)

X <- cbind(rep(1,n),scale(matrix(rnorm(p*n),nrow=n)))
Y <- rbinom(n,1,prob = exp(X%*%b)/(1 + exp(X%*%b)))

alpha <- .5

max( abs(t(Y - mean(Y)*(1-mean(Y))) %*% X ) )/ ( alpha * n) # largest lambda value
glmnet(x=X,y=Y,family="binomial",alpha = alpha,standardize=FALSE)$lambda[1] # largest lambda value

这来自本文的坐标下降算法:Friedman、Jerome、Trevor Hastie 和 Rob Tibshirani。“通过坐标下降的广义线性模型的正则化路径。” 统计软件学报33.1(2010):1。

这是一个例子:

library(glmnet)

n <- 500L

x1 <- rnorm(n, 2.0, 0.5)
x2 <- rnorm(n, -1.0, 2)
y <- factor(rbinom(n, 1L, plogis(-0.6 + 1.0 * x1 - 0.8 * x2)))

X <- matrix(c(x1, x2), ncol = 2)

mod <- glmnet(X, y, "binomial")

现在您可以通过以下方式查看自由度和相应的 lambda:

> print(mod)

Call:  glmnet(x = X, y = y, family = "binomial") 

      Df       %Dev   Lambda
 [1,]  0 -1.026e-14 0.149300
 [2,]  1  3.314e-02 0.136000
 [3,]  1  6.073e-02 0.123900
...

所以在这种情况下,当 lambda 为 0.149300(或更高)时,系数都为 0。确认:

> coef(mod, s = 0.149300)
3 x 1 sparse Matrix of class "dgCMatrix"
                   1
(Intercept) 1.688296
V1          .       
V2          .     

> coef(mod, s = 0.136000)
3 x 1 sparse Matrix of class "dgCMatrix"
                      1
(Intercept)  1.64233062
V1           .         
V2          -0.04946726

请注意,自由度和 lambda 的向量也可以通过mod$df和访问mod$lambda,您还可以更改尝试的值lambdaglmnet如果说您想在“lambda_max”上归位),例如:

mod <- glmnet(X, y, "binomial", lambda = seq(0.149, 0.151, by = 0.0001))