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

glmnet variable importance | `vip` vs `varImp`

我使用 glmnet

拟合了套索逻辑回归模型
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 函数的源代码中,在某些时候定义了这个 tibble:

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。

你可以通过运行ning得到相同的系数:

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)