如何使用R在随机森林中生成决策树图和变量重要性图?

时间:2018-08-24 07:55:52

标签: r machine-learning random-forest decision-tree feature-selection

我是数据科学的新手,我正在使用随机森林算法进行分类的机器学习分析。我在数据集中的目标变量称为“损耗(是/否)”。

对于如何在Random Fores中生成这2个图,我有些困惑:

(1) Feature Importance Plot

(2) Decision Tree Plot

我了解到,随机森林是数据集中几个决策树模型的集合。

假设我的训练数据集称为TrainDf,而我的测试数据集称为TestDf,那么如何在R中创建这两个图?

更新:从这两篇文章中,看来它们无法完成,还是我在这里遗漏了一些东西? Why is Random Forest with a single tree much better than a Decision Tree classifier?

How would you interpret an ensemble tree model?

2 个答案:

答案 0 :(得分:2)

要绘制变量的重要性,可以使用以下代码。

mtcars.rf <- randomForest(am ~ ., data=mtcars, ntree=1000, keep.forest=FALSE,
                      importance=TRUE)
varImpPlot(mtcars.rf)

答案 1 :(得分:2)

带有ggplot2

特征重要性图

library(randomForest)
library(ggplot2)
mtcars.rf <- randomForest(vs ~ ., data=mtcars)
imp <- cbind.data.frame(Feature=rownames(mtcars.rf$importance),mtcars.rf$importance)
g <- ggplot(imp, aes(x=reorder(Feature, -IncNodePurity), y=IncNodePurity))
g + geom_bar(stat = 'identity') + xlab('Feature')

enter image description here

决策树图,其中包含igraph(随机森林中的树)

tree <- randomForest::getTree(mtcars.rf, k=1, labelVar=TRUE) # get the 1st decision tree with k=1
tree$`split var` <- as.character(tree$`split var`)
tree$`split point` <- as.character(tree$`split point`)
tree[is.na(tree$`split var`),]$`split var` <- ''
tree[tree$`split point` == '0',]$`split point` <- ''

library(igraph)
gdf <- data.frame(from = rep(rownames(tree), 2),
                          to = c(tree$`left daughter`, tree$`right daughter`))
g <- graph_from_data_frame(gdf, directed=TRUE)
V(g)$label <- paste(tree$`split var`, '\r\n(', tree$`split point`, ',', round(tree$prediction,2), ')')
g <- delete_vertices(g, '0')
print(g, e=TRUE, v=TRUE)
plot(g, layout = layout.reingold.tilford(g, root=1), vertex.size=5, vertex.color='cyan')

从下图可以看出,决策树中每个节点的标签表示在该节点选择用于拆分的变量名称(拆分值,带有标签1的类的比例)。

enter image description here

同样,可以使用k=100randomForest::getTree()函数来获得第100棵树,如下所示:

enter image description here