glmnet变量重要性 | `vip`与`varImp`的比较

3

我使用 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) 

有人能告诉我这些方法的区别是什么,哪种更好?从逻辑Lasso模型中确定变量重要性的最佳方法是什么?

1个回答

3

看起来是因为他们在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, ...)
  )

问题出在“模型”的定义上。当尝试运行vi_model时,这段代码会找出要使用哪个lambda:

 # Extract coefficients
  s <- list(...)$s
  if (is.null(s)) {
    s <- min(object$lambda)
  }

由于您没有定义 s,所以它被设置为您的Lambda值中的最小值。 这是 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)

非常感谢。你介意帮我解决另外两个问题吗?(1) 这里的"importance"是什么意思?(2) 为什么varImp提供的重要性是绝对值,而vi_model保留了符号?这里有什么区别? - Mistakamikaze
1
@Mistakamikaze 你知道套索回归背后的理论吗?在这种情况下,你的套索回归给出了一个模型,其中vscylmpgdispqsec的函数。qseccyl的系数要比其他系数高得多,因此我猜它们可能对于你对vs的预测更重要。我对这两个函数都没有任何经验,所以我无法说为什么一个选择了绝对值,而另一个没有。我在文档中找不到任何相关信息。 - Qwethm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接