【问题标题】:Plot ctree using rpart.plot functionality使用 rpart.plot 功能绘制 ctree
【发布时间】:2018-06-27 13:54:54
【问题描述】:

一直在尝试使用rpart.plot 包从partykit 库中绘制ctree。原因是当树很深时,默认的绘图方法很糟糕。就我而言,我的max_depth = 5

我真的很喜欢rpart.plot 的输出,因为它可以让深树在视觉上显示得更好。输出如何寻找一个简单的例子:

rpart

library(partykit)
library(rpart)
library(rpart.plot)

df_test <- cu.summary[complete.cases(cu.summary),]

multi.class.model <- rpart(Reliability~., data = df_test)

rpart.plot(multi.class.model)

我想使用 ctree 从partykit 模型中得到这个输出

multi.class.model <- ctree(Reliability~., data = df_test)

rpart.plot(multi.class.model)
>Error: the object passed to prp is not an rpart object

有什么方法可以将 ctree 对象强制为 rpart 以便运行?

【问题讨论】:

    标签: r rpart party


    【解决方案1】:

    据我所知,用于可视化 rpart 树的所有其他软件包实际上都是 rpart 特定的,而不是基于用于表示树/递归分区的不可知 party 类。此外,我们还没有尝试为party 对象实现as.rpart() 方法,因为rpart 类确实不适合此。

    但您可以尝试调整 partykit 可视化,这些可视化可通过面板功能对树的几乎所有方面进行自定义。可能有用的一件事是计算一个simpleparty 对象,该对象在每个节点的$info 中具有各种简单的摘要信息。这可以在node_terminal() 面板功能中用于在树形显示中打印信息。考虑以下简单示例,用于预测德国社会经济小组中的三种学校类型之一。为了达到所需的深度,我基本上关闭了显着性测试:

    library("partykit")
    data("GSOEP9402", package = "AER")
    ct <- ctree(school ~ ., data = GSOEP9402, maxdepth = 5, alpha = 0.5)
    

    足够大的设备上的默认plot(ct) 为您提供:

    将树转换为simpleparty 时,默认情况下会获得文本摘要:

    st <- as.simpleparty(ct)
    plot(st)
    

    这仍然有重叠的标签,因此我们可以设置一个小的便利函数,从每个节点的$info 中提取有趣的位,并将它们放入一个较长的字符向量中,并且条目宽度较小:

    myfun <- function(i) c(
      as.character(i$prediction),
      paste("n =", i$n),
      format(round(i$distribution/i$n, digits = 3), nsmall = 3)
    )
    plot(st, tp_args = list(FUN = myfun), ep_args = list(justmin = 20))
    

    除了终端面板函数 (tp_args) 的参数之外,我还调整了边缘面板函数 (ep_args) 的参数,以避免边缘出现一些过度绘图。

    当然,您也可以更改整个面板功能并滚动您自己的...

    【讨论】:

    • 感谢 @achim-zeileis,感谢您抽出宝贵时间提供帮助。我会玩弄这个功能。项目的官方 git repo 是什么,那么如果我将一些配色方案集成到决策节点并留下 Ill pull request 功能
    • 我建议你从node_terminal 开始(注意,这有grapcon_generator 类)并创建你自己的node_prp_like(或类似的东西)。该软件包不在 GitHub 上,而是在 R-Forge(旧式 svn)上:R-Forge.R-project.org/projects/partykit 请通过电子邮件发送建议,然后我们将从那里获取。如果您还有其他问题,请随时在此处、在 R-Forge 上提问,如果您觉得它对于公共论坛来说过于具体,请直接通过电子邮件提问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2021-08-26
    • 1970-01-01
    • 2021-04-23
    • 2016-02-08
    • 1970-01-01
    • 2020-04-03
    相关资源
    最近更新 更多