有人知道 cv.glmnet(在 R 的 glmnet 中)或 LassoCV(scikit-learn)如何选择他们在交叉验证中使用的一系列正则化常数(lambdas)吗?非常感谢!
问问题
7440 次
1 回答
11
根据 Friedman, Hastie & Tibshirani (2010) 的策略是选择一个最小值 lambda_min = epsilon * lambda_max,并在对数尺度上构造一个从 lambda_max 到 lambda_min 递减的 K 值序列。典型值为 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(z) sqrt(sum((z-mean(z))^2)/length(z))
sx <- scale(x, scale = apply(x, 2, mysd))
sx <- as.matrix(sx, ncol = 20, nrow = 100)
## Calculate lambda path (first get lambda_max):
lambda_max <- max(abs(colSums(sx*y)))/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, y)
fitGLM$lambda
请注意,glmnet 不会计算所有 100 个(默认)lambda 值的解决方案,它会提前停止。不知道停止的规则是什么。
Friedman, J.、Hastie, T. 和 Tibshirani, R. (2010)。通过坐标下降的广义线性模型的正则化路径。统计软件学报,33(1),1。
于 2017-07-26T13:59:34.643 回答