Доступ к важности каждого элемента в случайном лесу в R

#r #random-forest

#r #случайный лес

Вопрос:

У меня есть модель прогнозирования, использующая случайный лес с переходящим окном. На каждой итерации я сохраняю importance модель rf в список (скажем, list1). В конце этот список (list1) включает в себя множество списков (list2) длиной 1. В каждом из этих списков (list2) у меня есть importance одна итерация. Я хочу получить доступ к %IncMSE каждому элементу в этом списке (list2). Например, я хочу достичь lag1.mat1 %IncMSE , который равен 26.01262.

введите описание изображения здесь

Проблема в том, что список (list2) имеет длину один, поэтому я не могу получить доступ к самому значению.

введите описание изображения здесь

Есть ли какой-либо способ, которым я могу это сделать?

Ответ №1:

Я предполагаю, что ваши данные выглядят следующим образом:

 library(randomForest)
lst = lapply(1:2,function(i){
list(randomForest(mpg~.,data=mtcars,importance=TRUE)$importance)
})

 str(lst)
List of 2
 $ :List of 1
  ..$ : num [1:10, 1:2] 6.921 9.651 7.495 0.984 9.178 ...
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr [1:10] "cyl" "disp" "hp" "drat" ...
  .. .. ..$ : chr [1:2] "%IncMSE" "IncNodePurity"
 $ :List of 1
  ..$ : num [1:10, 1:2] 7.138 10.257 7.422 0.631 10.027 ...
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr [1:10] "cyl" "disp" "hp" "drat" ...
  .. .. ..$ : chr [1:2] "%IncMSE" "IncNodePurity"

head(lst[[1]][[1]])
      %IncMSE IncNodePurity
cyl  6.9211021     170.12901
disp 9.6509747     248.54840
hp   7.4951588     206.99009
drat 0.9839875      64.95373
wt   9.1778411     246.08167
qsec 0.7464294      43.20173
  

Если вы хотите только cyl:

 sapply(lst,function(x)x[[1]]["cyl","%IncMSE"])
  

Если вам нужно все:

 lapply(lst,function(x)x[[1]][,"%IncMSE"])
  

Комментарии:

1. Я опубликовал свой код для лучшего определения того, как я создаю список. Дело в том, что с sapply , я получаю ошибку incorrect number of dimensions .

2. Я даже пытался добавить h5 <- lapply(1, function(x){randomForest(y ~., data= a, mtry=5, ntree=1000, importance=TRUE)$importance}) в сам цикл, но он возвращает пустой список.

3. хорошо, скорее всего, у вас есть еще один уровень в списке. См. обновлено.. опубликованный вами код немного сложен для чтения…

Ответ №2:

Было бы полезно просмотреть хотя бы части вашего кода, но в основном вы можете получить к ним доступ, выполнив следующее: предполагая, что вы вырастили это дерево:

 RF = purrr::accumulate( .init = update(rf_mod, ntree=1),
                          rep(1,100), randomForest::grow )
imp = purrr::map( RF, ~importance(.x)[,"%IncMSE"] )
  

Оттуда вы получаете тот, который вам нужен в списке. Для более краткого ответа опубликуйте свой код.