【问题标题】:R biglasso results don't match hdm or glmnetR biglasso 结果与 hdm 或 glmnet 不匹配
【发布时间】:2020-03-19 16:33:54
【问题描述】:

我一直在尝试使用 R 包“biglasso”来处理高维数据。但是,我得到的结果与我从“hdm”或“glmnet”获得的 LASSO 函数的结果不匹配。 biglasso 的文档也很差。

在下面的示例中,hdm 和 glmnet 的结果非常接近,但并不准确,这是预期的。但是,biglasso 不会删除“share”变量。我已经尝试了所有不同的屏幕设置,但没有任何区别。关于如何让 biglasso 与其他人更一致的任何想法?谢谢!

编辑:对于给定的 lambda 值,结果非常相似。但是每种方法似乎都选择了一个不同的 lambda.. 这对于 hdm 来说是有意义的,因为它旨在用于因果推理并且不关心样本外预测。 hdm 使用与 Belloni 等人不同的目标函数。 (2012),但我不确定为什么 cv.biglasso 和 cv.glmnet 会有这么大的不同。如果我在没有筛选规则的情况下运行 biglasso,他们应该最大化相同的目标函数,只是在 CV 折叠中使用随机差异,不是吗?

编辑 2:我编辑了下面的代码以包含 F. Privé 的代码以使 glmnet 使用类似于 biglasso 的算法,以及一些额外的代码以使 biglasso 模仿 glmnet。

##########
## PREP ##
##########

## Load required libraries
library(hdm)
library(biglasso)
library(glmnet)

## Read automobile dataset
data(BLP)
df <- BLP[[1]]

## Extract outcome
Y <- scale(df$mpg)

## Rescale variables
df$price <- scale(df$price)
df$mpd <- scale(df$mpd)
df$space <- scale(df$space)
df$hpwt <- scale(df$hpwt)
df$outshr <- scale(df$outshr)

## Limit to variables I want
df <- df[,names(df) %in% c("price","mpd","space","hpwt","share","outshr","air")]

## Convert to matrix
df.mat <- data.matrix(df)
df.bm <- as.big.matrix(df.mat)

#########
## HDM ##
#########

## Set seed for reproducibility
set.seed(1233)

## Run LASSO
fit.hdm <- rlasso(x=df.mat, y=Y, post=FALSE, intercept=TRUE)

## Check results
coef(fit.hdm)

############
## GLMNET ##
############

## Set seed for reproducibility
set.seed(1233)

## LASSO with 10-fold cross-validation
fit.glmnet <- cv.glmnet(df.mat, Y, alpha=1, family="gaussian")

## Check default results
coef(fit.glmnet)

## Try to mimic results of biglasso
coef(fit.glmnet, s = "lambda.min")

##############
## BIGLASSO ##
##############

## LASSO with 10-fold cross-validation
fit.bl <- cv.biglasso(df.bm, Y, penalty="lasso", eval.metric="default",
    family="gaussian", screen="None",
    seed=1233, nfolds=10)

## Check default results
coef(fit.bl) 

## Try to mimic results of glmnet
## Calculate threshold for CV error (minimum + 1 standard error)
thresh <- min(fit.bl$cve) + sd(fit.bl$cve)/sqrt(100)

## Identify highest lambda with CVE at or below threshold
max.lambda <- max(fit.bl$lambda[fit.bl$cve <= thresh])

## Check results for the given lambda
coef(fit.bl$fit)[,which(fit.bl$fit$lambda==max.lambda)]

【问题讨论】:

  • 只是它们的 lambda 值不同吗?我没有看到你在这里设置它。
  • 对于 biglasso 和 glmnet,他们不应该通过相同的交叉验证过程选择最佳 lambda 吗?据我了解,hdm 遵循稍微不同的 CV 程序,但应该很接近!
  • CV 可能是一个非常嘈杂的过程。与其测试这个,不如考虑测试基础拟合算法
  • 有意思,能多说点吗?如果没有 CV,biglasso 和 glmnet 会输出一个系数矩阵,默认情况下,每个 100 列用于不同的 lambda 值。 hdm 只报告结果。你建议我用这些做什么?
  • 我认为这些中的任何一个都不会在内部进行 cv。它们只是算法的一个实例。您必须将 lambda 设置为与 R 中的默认值不同的值。例如 cv.glmnet 为 glm 包执行 cv。然后你可以从那个过程中选择一个 lamda 并在每个包的套索上使用它。 stackoverflow.com/questions/29311323/…

标签: r machine-learning bigdata lasso-regression


【解决方案1】:

基本上有两种方法可以在CV之后选择“最佳” lambda:

  • 最小化 CV 误差的方法(默认为 {biglasso})

  • CV 误差低于最小值 + 1 标准误差(默认为 {glmnet})的最简约(最高 lambda)。

尝试coef(fit.glmnet, s = "lambda.min") 使用最小值。

另外,为确保可重复性,请尝试设置 CV 折叠而不是一些种子。 glmnet()中有参数foldidbiglasso()中有cv.ind

【讨论】:

  • 这很棒。我已经编辑了我的问题以包含一些代码以使 biglasso 结果模仿 glmnet
猜你喜欢
  • 2023-04-07
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多