我想检查到达rpart决策树中某个节点的所有观察结果。例如,在下面的代码中:
fit <- rpart(Kyphosis ~ Age + Start, data = kyphosis)
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) *
我希望看到节点(5)中的所有观察结果(即:33个观测值,其中Start〉=8.5 & Start〈14.5)。2显然我可以手动得到它们。3但是我希望有一些函数,比如“get_node_date”。4对于它,我可以运行get_node_date(5)-并得到相关的观测值。
你对如何着手做这件事有什么建议吗?
5条答案
按热度按时间bfhwhh0e1#
似乎没有这样的函数可以从特定节点提取观测值,我将按如下方式求解:首先确定您感兴趣的节点使用的规则。您可以使用
path.rpart
。然后,您可以依次应用这些规则来提取观察结果。该方法作为函数:
对于节点5,您可以得到:
5sxhfpxr2#
partykit
包也提供了一个现成的解决方案,你只需要把rpart
对象转换成party
类,以便使用它的统一接口来处理树,然后你就可以使用data_party()
函数了。使用问题中的
fit
并加载library("partykit")
后,您可以首先将rpart
树强制转换为party
:对于以您想要的方式提取数据,只有两个小麻烦:(1)原始拟合中的
model.frame()
始终在强制中被删除,需要手动重新附加。(2)节点使用了不同的编号方案。您现在需要节点4(而不是5)。另一种途径是从节点4开始对子树进行子集化,然后从中获取数据:
data_party(pfit4)
给出的结果与上面的data4
相同,pfit4$data
给出的数据中没有(fitted)
节点和预测的(response)
。eeq64g8w3#
还有另一种方式,这通过找到任何特定节点的所有终端节点并返回调用中使用的数据子集来工作。
2nbm6dog4#
rpart中训练观测的终端节点分配可以从
$where
获得:作为函数:
不过,这只对训练观测有效,对新观测无效,对内部节点也无效。
42fyovps5#
rpart返回包含所需信息的rpart.object元素: