r - glmnet 变量重要性 | `vip` 与 `varImp`

标签 r glm glmnet

关闭。这个问题需要details or clarity .它目前不接受答案。












想改进这个问题?通过 editing this post 添加详细信息并澄清问题.

1年前关闭。




Improve this question




我使用 glmnet 拟合了 Lasso Logistic 回归模型

X = data.matrix(mtcars %>% dplyr::select(-vs))
y = mtcars$vs
CV_lasso = cv.glmnet(X, y, alpha = 1, family = "binomial", type.measure = "class")
我试图确定变量的重要性,并遇到了两种产生截然不同结果的方法
vip(CV_lasso$glmnet.fit)
varImp(CV_lasso$glmnet.fit, lambda = CV_lasso$lambda.min) 
有人能告诉我这些方法有什么区别,哪一种更好吗?从逻辑套索模型中确定变量重要性的最佳方法是什么?

最佳答案

似乎是因为他们对 lambda 使用了不同的值。 .在 varImp ,您指定哪个 lambda使用。但是,当您调用 vip ,然后在源代码中,执行以下代码:

imp <- if (inherits(object, what = "vi")) {
    object
  } else {
    vi(object = object, ...)  # compute variable importance scores
  }
在哪里 vi(object = object, ...)被调用。在 vi 的源代码中函数,在某些时候这个小标题被定义:
tib <- switch(method,
    "model" = vi_model(object, ...),
    "firm" = vi_firm(object, feature_names = feature_names, var_fun = var_fun,
                     ice = ice, ...),
    "permute" = vi_permute(object, feature_names = feature_names, ...),
    vi_shap(object, feature_names = feature_names, ...)
  )
问题出现在 "model" 的定义中。 .尝试运行时 vi_model .在此函数中,此代码用于确定要使用的 lambda:
 # Extract coefficients
  s <- list(...)$s
  if (is.null(s)) {
    s <- min(object$lambda)
  }
由于您还没有定义s , 然后它被设置为你的 lambdas 中的最小值。这是 lambda 的最后一个值,即 0.0001119218。这不等于 varImp 中使用的 lambda。 ,您指定使用最佳 lambda,在本例中为 0.1586463。
您可以通过运行获得相同的系数:
c1 = vip::vi_model(CV_lasso$glmnet.fit, s = CV_lasso$lambda.min)
c2 = caret::varImp(CV_lasso$glmnet.fit, lambda = CV_lasso$lambda.min) 
然后如果你坚持使用 vip::vip要获得绘图,您可以在 c1 上调用此函数:
vip::vip(c1)

关于r - glmnet 变量重要性 | `vip` 与 `varImp`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64628970/

相关文章:

递归拆分列表元素

r - 泊松回归的预测

r - 具有给定权重向量的ggplot平滑线glm模型

r - 当权重存在时,glmnet 如何标准化变量?

r - 如何修复 "Error in storage.mode(y) <- "双“: invalid to change the storage mode of a factor"in lasso?

r - 无法运行 glmnet() R 包 : "could not find function "lengths""

r - 如何计算移动平均线交叉后的天数?

R 创建函数添加水年列

r - 在 R 中将每月数据转换为每日数据

R - 在 data.table 中使用 glm