ctree()的终端节点如何提取拆分规则

Posted

技术标签:

【中文标题】ctree()的终端节点如何提取拆分规则【英文标题】:How to extract the splitting rules for the terminal nodes of ctree() 【发布时间】:2015-07-12 00:55:00 【问题描述】:

我有一个数据集,其中包含 6 个类别变量,级别从 5 到 28 不等。我从 ctree()(派对包)获得了一个输出,有 17 个终端节点。我已经按照@Galled 从ctree() - How to get the list of splitting conditions for each terminal node? 的输入得到了我想要的输出。

但是,我在运行代码后收到以下错误:

Error in data.frame(ResulTable, Means, Counts) : 
  arguments imply differing number of rows: 17, 2

我已经尝试添加这些额外的行:

ResulTable <- rbind(ResulTable, cbind(Node = Node, Path = Path2))

ResulTable$Node <- rownames(ResulTable)

melt(ResulTable)

但到目前为止没有成功。关于哪里出错的任何指针?

【问题讨论】:

【参考方案1】:

我建议使用ctree() 的新partykit 实现而不是旧的party 包,然后您可以使用函数.list.rules.party()。这还没有正式导出,但可以用来提取所需的信息。

library("partykit")
airq <- subset(airquality, !is.na(Ozone))
ct <- ctree(Ozone ~ ., data = airq)
partykit:::.list.rules.party(ct)
##                                      3                                      5 
##             "Temp <= 82 & Wind <= 6.9" "Temp <= 82 & Wind > 6.9 & Temp <= 77" 
##                                      6                                      8 
##  "Temp <= 82 & Wind > 6.9 & Temp > 77"             "Temp > 82 & Wind <= 10.3" 
##                                      9 
##              "Temp > 82 & Wind > 10.3" 

【讨论】:

感谢您的及时回复。使用上面的代码,我得到了这个错误: UseMethod("nodeids") 中的错误:没有适用于 'nodeids' 的方法应用于类“c('BinaryTree', 'BinaryTreePartition')”的对象 那么你已经用party::ctree而不是partykit::ctree来安装你的树。确保不要同时加载两个包。这势必会导致混乱...... 使用partykit 包(使用默认控制参数)运行ctree 与使用party 包运行ctree 相比要快得多。我有一个包含 100K 行和 6 列的数据集。我在 32 位 64 GB 机器上运行 R 版本 3.1.3。对此有何意见? 旧的 party 实现在将数据集中的 p 值与数十万个观察值进行比较时可能会遇到数值问题。新的 partykit 实现使用 log-p-values 代替,它在数值上更稳定。对于您的数据,这似乎会导致与partykit 持续更长时间的拆分差异。我建议不要只使用默认值,而是将 mincriterionminbucketmaxdepth 限制为更适合您的数据的值。

以上是关于ctree()的终端节点如何提取拆分规则的主要内容,如果未能解决你的问题,请参考以下文章

ctree() - 如何获取每个终端节点的拆分条件列表?

获取 R 中 rpart/ctree 包的每一行预测数据集的决策树规则/路径模式

如何获取所有终端节点 - r 中的权重和响应预测“ctree”

如何为 ctree(打包方)的终端节点添加标签?

ctree 图的终端节点中的缩放图

ctree 在 R 中的派对包中绘制决策树,终端节点出现一些奇怪的数字 - 问题?