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
持续更长时间的拆分差异。我建议不要只使用默认值,而是将 mincriterion
、minbucket
或 maxdepth
限制为更适合您的数据的值。以上是关于ctree()的终端节点如何提取拆分规则的主要内容,如果未能解决你的问题,请参考以下文章
获取 R 中 rpart/ctree 包的每一行预测数据集的决策树规则/路径模式