我希望能够在逻辑回归模型中计算 glmnet“lambda.max”值。lambda_max 值代表所有系数为零的最小值。
根据 glmnet 包 vignette,“没有给出 lambda.max,但很容易从输入 x 和 y 计算出来”。不幸的是,我不知道如何计算这个参数。
我希望能够在逻辑回归模型中计算 glmnet“lambda.max”值。lambda_max 值代表所有系数为零的最小值。
根据 glmnet 包 vignette,“没有给出 lambda.max,但很容易从输入 x 和 y 计算出来”。不幸的是,我不知道如何计算这个参数。
没有选择参数的 lambda 的最小值可以通过下式计算
看我的例子:
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,您还可以更改尝试的值lambda(glmnet如果说您想在“lambda_max”上归位),例如:
mod <- glmnet(X, y, "binomial", lambda = seq(0.149, 0.151, by = 0.0001))