微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

glmnet变量重要性| vip与varImp

如何解决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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。