#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"] )
Оттуда вы получаете тот, который вам нужен в списке. Для более краткого ответа опубликуйте свой код.