【问题标题】:default lambda sequence in glmnet for cross-validationglmnet 中用于交叉验证的默认 lambda 序列
【发布时间】:2023-03-03 17:54:02
【问题描述】:

有人知道 cv.glmnet(在 R 的 glmnet 中)或 LassoCV(scikit-learn)如何选择他们在交叉验证中使用的一系列正则化常数(lambdas)吗?非常感谢!

【问题讨论】:

  • (至少在 R glmnet 中)永远不要使用默认的 lambda 序列,这很危险。始终提供您自己的序列。
  • @smci 你能解释一下 glmnet 中的默认 lambda 序列以何种方式/为什么是危险的吗?谢谢。
  • @visitor:“不一定保证能找到最小化 CVE 的 lambda”。可能会,也可能不会。绘制偏差/log(lambda) 曲线以查看是否找到它。我一直得到的建议是定义你自己的 lambda 序列,如果不好就调整它。

标签: glmnet lasso-regression


【解决方案1】:

根据 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 值的解决方案,它会提前停止。不知道停止的规则是什么。

另见How does glmnet compute the maximal lambda value


Friedman, J.、Hastie, T. 和 Tibshirani, R. (2010)。通过坐标下降的广义线性模型的正则化路径。 统计软件杂志,33(1),1.

【讨论】:

  • 看来你规范化y 向量然后计算lambda_max。根据包装,y 只是居中而不是缩放???
  • 确实如此。但如果将sy &lt;- as.vector(scale(y, scale = mysd(y))) 行替换为sy &lt;- y,计算得出的lambdapath 和fitGLM$lambda 仍然相等。
  • 现在省略了y的标准化。
猜你喜欢
  • 2017-12-03
  • 2018-02-08
  • 2017-07-15
  • 2018-03-20
  • 2023-03-04
  • 2020-01-18
  • 2018-10-10
  • 1970-01-01
  • 2016-12-06
相关资源
最近更新 更多