【发布时间】:2016-03-24 15:26:04
【问题描述】:
我试图在 R 中找到一种方法来计算随机森林或条件随机森林的单个树的变量重要性。
一个很好的起点是rpart:::importance 命令,它计算rpart 树的变量重要性度量:
> library(rpart)
> rp <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis)
> rpart:::importance(rp)
Start Age Number
8.198442 3.101801 1.521863
randomForest::getTree 命令是从randomForest 对象中提取树结构的标准工具,但它返回data.frame:
library(randomForest)
rf <- randomForest(Kyphosis ~ Age + Number + Start, data = kyphosis)
tree1 <- getTree(rf, k=1, labelVar=TRUE)
str(tree1)
'data.frame': 29 obs. of 6 variables:
$ left daughter : num 2 4 6 8 10 12 0 0 14 16 ...
$ right daughter: num 3 5 7 9 11 13 0 0 15 17 ...
$ split var : Factor w/ 3 levels "Age","Number",..: 2 3 1 2 3 3 NA NA 3 1 ...
$ split point : num 5.5 8.5 78 3.5 14.5 7.5 0 0 3.5 75 ...
$ status : num 1 1 1 1 1 1 -1 -1 1 1 ...
erce$ prediction : chr NA NA NA NA ...
一种解决方案是使用 as.rpart 命令将 tree1 强制转换为 rpart 对象。不幸的是,我不知道任何 R 包中有这个命令。
使用party 包我发现了一个类似的问题。 varimp 命令适用于 cforest 对象,而不适用于单个树。
library(party)
cf <- cforest(Kyphosis ~ Age + Number + Start, data = kyphosis)
ct <- party:::prettytree(cf@ensemble[[1]], names(cf@data@get("input")))
tree2 <- new("BinaryTree")
tree2@tree <- ct
tree2@data <- cf@data
tree2@responses <- cf@responses
tree2@weights <- cf@initweights
varimp(tree2)
Error in varimp(tree2) :
no slot of name "initweights" for this object of class "BinaryTree"
感谢任何帮助。
【问题讨论】:
-
我相信你必须手动编写一个函数。注意
tree1可能属于data.frame类,但它不是您的典型数据框。它为您提供树的分类规则 -
rpart:::importance和randomForest:::importance的代码很容易访问
标签: r tree random-forest party ensemble-learning