use*_*760 8 lasso-regression glmnet
有人知道cv.glmnet(在R的glmnet中)或LassoCV(scikit-learn)如何选择用于交叉验证的正则化常数(lambda)序列?非常感谢你!
根据Friedman,Hastie&Tibshirani(2010)的策略,选择最小值lambda_min = epsilon * lambda_max,并构造一个对数尺度上从lambda_max减小到lambda_min的K值的lambda序列。典型值为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
Run Code Online (Sandbox Code Playgroud)
请注意,尽管glmnet不会为所有100个(默认)lambda值计算解,但它会更早停止。不确定停止的规则是什么。
Friedman,J.,Hastie,T.和Tibshirani,R.(2010)。通过坐标下降的广义线性模型的正则化路径。统计软件杂志,33(1),1。