glmnet变量重要性| vip与varImp

时间:2020-11-01 05:31:30

标签: r glm glmnet

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

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

1 个答案:

答案 0 :(得分:2)

这似乎是因为它们对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,因此将其设置为您的最小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)