【问题标题】:Build/visualize a tree from rules根据规则构建/可视化树
【发布时间】:2016-05-14 20:45:44
【问题描述】:

我有描述树的 if/then 语句。例如:

node1: if VAR1 < X node = 2 else node = 3
node2: if VAR2 < Y node = 4 else node = 5
node3: terminal value = Z
...

不等式总是表示为小于“

忽略解析语句的工作,在 R 中构建/可视化树的最简单方法是什么?是否有一个对象/函数/包我可以按规则调用一次以迭代地构建树然后调用 plot()?

【问题讨论】:

  • 你看过派对包了吗?
  • 还没有……谢谢指点!
  • 我不认为如果没有一些规则的排序,你可以推导出唯一的树。
  • @DWin - 我不认为订购很重要。每行指定一个节点,如果不是终端节点,则指定其左右子节点。您可以想象将线条随机化,然后按照每个节点/连接出现在随机列表中的顺序绘制它。无论顺序如何,都会产生相同的树(尽管它看起来很丑)

标签: r


【解决方案1】:

从我之前给出的评论扩展,这是party 包中plot.BinaryTree 示例的顶部:

   set.seed(290875)

   airq <- subset(airquality, !is.na(Ozone))
   airct <- ctree(Ozone ~ ., data = airq)

   ### regression: boxplots in each node
   plot(airct, terminal_panel = node_boxplot, drop_terminal = TRUE)

它会根据上面的ctree 命令生成下图:

该软件包有两个相当不错的小插曲,应该可以帮助您入门。

【讨论】:

    【解决方案2】:

    我尝试深入研究 pkg:party 方法的代码,但无法非常有效地遵循依赖关系。我认为查看 rpart 包代码可能更容易。 (编辑:进一步的想法是查看 igraph 包。)

    require(rpart)
    fit <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosis)
    print(fit)
    #------------
    n= 81 
    
    node), split, n, loss, yval, (yprob)
          * denotes terminal node
    
     1) root 81 17 absent (0.79012346 0.20987654)  
       2) Start>=8.5 62  6 absent (0.90322581 0.09677419)  
         4) Start>=14.5 29  0 absent (1.00000000 0.00000000) *
         5) Start< 14.5 33  6 absent (0.81818182 0.18181818)  
          10) Age< 55 12  0 absent (1.00000000 0.00000000) *
          11) Age>=55 21  6 absent (0.71428571 0.28571429)  
            22) Age>=111 14  2 absent (0.85714286 0.14285714) *
            23) Age< 111 7  3 present (0.42857143 0.57142857) *
       3) Start< 8.5 19  8 present (0.42105263 0.57894737) *
    #---code resumes ------
    plot(fit)
    

    rpart:::plot.rpart   # will show the code  ... depends on rpart::rpconvert
    rpart::rpconvert
    

    【讨论】:

    • 谢谢!我有同样的想法来解构 rpart 的作用,但认为可能有更简单的方法。
    【解决方案3】:

    另一个选项是 data.tree 包。例如,您可以这样做:

    tree <- Node$new("node1")
    tree$AddChild("node2", edgeLabel = "VAR1 < X")
    tree$AddChild("node3", edgeLabel = "VAR1 >= X")
    
    print(tree, "edgeLabel")
    

    这将显示为:

      levelName  edgeLabel
    1 node1              
    2  ¦--node2   VAR1 < X
    3  °--node3  VAR1 >= X
    

    或绘图:

    SetEdgeStyle(tree, label = function(node) node$edgeLabel)
    plot(tree)
    

    每个节点都可以存储任何信息,因此解析也很简单,因为您可以在解析时将树用作路由器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2016-02-02
      • 1970-01-01
      • 2021-11-25
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多