簡體   English   中英

如何在 R 中捕獲 Bootstrapped 模型中最重要的變量?

[英]How to capture the most important variables in Bootstrapped models in R?

我有幾個模型,我想比較它們對同一數據集的重要預測變量的選擇,Lasso 就是其中之一。 我使用的數據集包含人口普查數據和大約一千個變量,為了方便起見,這些變量已重命名為“x1”、“x2”等(原始名稱非常長)。 我想報告最重要的特性,然后用更短更簡潔的名稱重命名這些變量。

我試圖解決這個問題是通過提取每個迭代 model 中的頂級變量,將其放入列表中,然后在 X 次循環中找到頂級變量的平均值。 但是,我的問題是我仍然發現前 10 個最常用的預測變量存在可變性,因此我無法手動更改變量名稱,因為每次在代碼塊上運行都會產生不同的結果。 我懷疑這是因為我的分析中有太多變量,並且由於 CV 導致每次引導都會創建新模型。

為了一個簡單的例子,我使用了 mtcars 並將尋找前 3 個最常見的預測變量,因為這個數據集中只有 10 個變量。

library(glmnet)

data("mtcars") # Base R Dataset
df <- mtcars


topvar <- list()

for (i in 1:100) {
  
  # CV and Splitting
  
  ind <- sample(nrow(df), nrow(df), replace = TRUE)
  ind <- unique(ind)
  
  train <- df[ind, ]
  xtrain <- model.matrix(mpg~., train)[,-1]
  ytrain <- df[ind, 1]
  
  test <- df[-ind, ]
  xtest <- model.matrix(mpg~., test)[,-1]
  ytest <- df[-ind, 1]
  
  # Create Model per Loop
 
  model <- glmnet(xtrain, ytrain, alpha = 1, lambda = 0.2) 
                     
  # Store Coeffecients per loop
  
  coef_las <- coef(model, s = 0.2)[-1, ] # Remove intercept
  
  # Store all nonzero Coefficients
  
  topvar[[i]] <- coef_las[which(coef_las != 0)]
  
}

# Unlist 

varimp <- unlist(topvar)

# Count all predictors

novar <- table(names(varimp))

# Find the mean of all variables

meanvar <- tapply(varimp, names(varimp), mean)

# Return top 3 repeated Coefs

repvar <- novar[order(novar, decreasing = TRUE)][1:3]

# Return mean of repeated Coefs

repvar.mean <- meanvar[names(repvar)]

repvar

現在,如果您要重新運行上面的代碼塊,您會注意到前 3 個變量發生了變化,因此如果我必須重命名這些變量,如果它們不是常量並且每次運行都在變化,那將很難做到。 關於我如何處理這個問題有什么建議嗎?

您可以使用 function set.seed() 來確保您的樣本每次都會返回相同的樣本。 例如

set.seed(123)

當我將它添加到上面的代碼然后運行兩次時,兩次都返回以下內容:

  wt carb   hp 
  98   89   86

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM