首页 文章

glmnet - 变量重要性?

提问于
浏览
4

我正在使用glmnet包来执行LASSO回归 . 有没有办法获得所选择的各个变量的重要性?我考虑对通过coef(...)命令获得的系数进行排序(即,从零开始的距离越大,变量就越重要) . 这是一种有效的方法吗?

谢谢你的帮助!

cvfit = cv.glmnet(x, y, family = "binomial")
coef(cvfit, s = "lambda.min")

## 21 x 1 sparse Matrix of class "dgCMatrix"
##                    1
## (Intercept)  0.14936
## V1           1.32975
## V2           .      
## V3           0.69096
## V4           .      
## V5          -0.83123
## V6           0.53670
## V7           0.02005
## V8           0.33194
## V9           .      
## V10          .      
## V11          0.16239
## V12          .      
## V13          .      
## V14         -1.07081
## V15          .      
## V16          .      
## V17          .      
## V18          .      
## V19          .      
## V20         -1.04341

3 回答

  • 5

    这是在 caret 包中完成的 .

    总而言之,您可以获取最终系数的绝对值并对它们进行排名 . 排名系数是您的变量重要性 .

    要查看源代码,您可以键入

    caret::getModelInfo("glmnet")$glmnet$varImp
    

    如果您不想使用 caret 包,则可以从包中运行以下行,它应该可以使用 .

    varImp <- function(object, lambda = NULL, ...) {
    
      ## skipping a few lines
    
      beta <- predict(object, s = lambda, type = "coef")
      if(is.list(beta)) {
        out <- do.call("cbind", lapply(beta, function(x) x[,1]))
        out <- as.data.frame(out)
      } else out <- data.frame(Overall = beta[,1])
      out <- abs(out[rownames(out) != "(Intercept)",,drop = FALSE])
      out
    }
    

    最后,用你的拟合来调用这个函数 .

    varImp(cvfit, lambda = cvfit$lambda.min)
    
  • 6

    在比较系数的大小之前,您应该通过将每个系数乘以相应预测变量的标准偏差来对它们进行标准化 . 这个答案有更多细节和有用的链接:https://stats.stackexchange.com/a/211396/34615

  • 1

    使用cv.glmnet对象的内容来创建系数的有序列表非常容易......

    coefList <- coef(cv.glmnet.MOD, s='lambda.1se')
    coefList <- data.frame(coefList@Dimnames[[1]][coefList@i+1],coefList@x)
    names(coefList) <- c('var','val')
    
    coefList %>%
      arrange(-abs(val)) %>%
      print(.,n=25)
    

    注意:正如其他海报所评论的......为了获得相似的比较,您需要在建模步骤之前对数值变量进行缩放/分数...否则可以将一个较大的系数值分配给一个非常小的变量比例即范围(0,1),当放置在具有非常大尺度的变量的模型中时,即范围(-10000,10000)这将意味着您的系数值的比较不是相对的,因此在大多数情况下都是无意义的 .

相关问题