【问题标题】:How do I generate a Decision Tree plot and a Variable Importance plot in Random Forest using R?如何使用 R 在随机森林中生成决策树图和变量重要性图?
【发布时间】:2019-01-30 15:58:08
【问题描述】:

我是数据科学的新手,我正在使用随机森林算法进行机器学习分析以执行分类。我的数据集中的目标变量称为 Attrition (Yes/No)。

我对如何在 Random Fores` 中生成这两个图有点困惑:

(1) Feature Importance Plot

(2) Decision Tree Plot

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

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

更新:从这 2 个帖子看来,它们似乎无法完成,或者我在这里遗漏了什么? Why is Random Forest with a single tree much better than a Decision Tree classifier?

How would you interpret an ensemble tree model?

【问题讨论】:

  • 为了绘制(伪)树结构,查看这个问题的答案:stats.stackexchange.com/questions/41443/…
  • 决策树图在 RF 中没有意义,因为(顾名思义)有多个树,每个树都略有(或很多)不同。所以你不能制作一个单一的情节,除非你以某种方式平均所有这些树(不是很有用)。重要性图可以做,看这里的第一个答案。
  • OP 可能希望能够打印森林中的任何决策树,这可以通过 getTree 函数完成
  • @RLave 我对您的链接所指的答案感到困惑。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案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')
    

    决策树图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的类的比例)在该节点处。

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

    【讨论】:

      猜你喜欢
      • 2014-06-14
      • 2020-06-06
      • 2021-02-20
      • 2016-06-24
      • 2017-08-29
      • 1970-01-01
      • 2017-12-20
      • 2017-03-15
      • 2021-03-24
      相关资源
      最近更新 更多