[英]glmnet - variable importance?
我正在使用 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
這是在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, stringsAsFactors = TRUE)
} else out <- data.frame(Overall = beta[,1])
out <- abs(out[rownames(out) != "(Intercept)",,drop = FALSE])
out
}
最后,調用適合您的函數。
varImp(cvfit, lambda = cvfit$lambda.min)
在比較系數的大小之前,您應該通過將每個系數乘以相應預測變量的標准差來對它們進行歸一化。 這個答案有更多的細節和有用的鏈接: https : //stats.stackexchange.com/a/211396/34615
使用 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)
注意:正如其他海報所評論的那樣……要獲得類似比較,您需要在建模步驟之前對數字變量進行縮放/z 評分……否則可以將大系數值分配給一個非常小的變量scale ie range(0,1) 當放置在具有非常大比例的變量的模型中時,即 range(-10000,10000) 這將意味着您對系數值的比較不是相對的,因此在大多數情況下毫無意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.