glmnet变量重要性| vip与varImp

问题描述

我使用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,vi_shap(object,...)
  )

"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)