如何计算落在树的每个节点中的观察值

Posted

技术标签:

【中文标题】如何计算落在树的每个节点中的观察值【英文标题】:How to count the observations falling in each node of a tree 【发布时间】:2012-11-21 07:53:53 【问题描述】:

我目前正在处理 MMST 包中的葡萄酒数据。我已将整个数据集拆分为训练和测试,并构建一棵树,如下代码:

library("rpart")
library("gbm")
library("randomForest")
library("MMST")

data(wine)
aux <- c(1:178)
train_indis <- sample(aux, 142, replace = FALSE)
test_indis <- setdiff(aux, train_indis)

train <- wine[train_indis,]
test <- wine[test_indis,]    #### divide the dataset into trainning and testing

model.control <- rpart.control(minsplit = 5, xval = 10, cp = 0)
fit_wine <- rpart(class ~ MalicAcid + Ash + AlcAsh + Mg + Phenols + Proa + Color + Hue + OD + Proline, data = train, method = "class", control = model.control)

windows()
plot(fit_wine,branch = 0.5, uniform = T, compress = T,  main = "Full Tree: without pruning")
text(fit_wine, use.n = T, all = T, cex = .6)

我可以得到这样的图像:

每个节点下的数字(例如 Grigolino 下的 0/1/48)是什么意思? 如果我想知道每个节点有多少训练和测试样本,我应该在代码中写什么?

【问题讨论】:

【参考方案1】:

数字表示该节点中每个类的成员数。因此,标签“0 / 1 / 48”告诉我们,类别 1(Barabera,我推断)有 0 个案例,类别 2(Barolo)只有一个示例,类别 3(Grignolino)有 48 个示例。

您可以使用summary(fit_wine)获取有关树和每个节点的详细信息。 有关详细信息,请参阅?summary.rpart

您还可以使用predict()(将调用predict.rpart())查看树如何对数据集进行分类。例如,predict(fit_wine, train, type="class")。或者把它包在一个表格里方便查看table(predict(fit_wine, train, type = "class"),train[,"class"])

如果您特别想知道观察落在哪个叶节点上,则此信息存储在fit_wine$where 中。对于数据集中的每个事例,fit_wine$where 包含fit_wine$frame 的行号,代表事例所在的叶节点。因此,我们可以通过以下方式获取每个案例的叶子信息:

trainingnodes <- rownames(fit_wine$frame)[fit_wine$where]

为了获取测试数据的叶子信息,我曾经运行predict()type="matrix" 并推断它。令人困惑的是,这会返回一个矩阵,该矩阵是通过连接预测的类、拟合树中该节点处的类计数以及类概率而产生的。所以对于这个例子:

testresults <- predict(fit_wine, test, type = "matrix")
testresults <- data.frame(testresults)
names(testresults) <- c("ClassGuess","NofClass1onNode", "NofClass2onNode",
     "NofClass3onNode", "PClass1", "PClass2", "PClass2")

由此,我们可以推断出不同的节点,例如,从unique(testresults[,2:4]) 但它并不优雅。

但是,Yuji has a clever hack for this at a previous question。他复制 rpart 对象并用节点替换类,因此运行 predict 返回节点而不是类:

nodes_wine <- fit_wine
nodes_wine$frame$yval = as.numeric(rownames(nodes_wine$frame))
testnodes <- predict(nodes_wine, test, type="vector")

我已经在此处包含了解决方案,但是人们 go should upvote him 。

【讨论】:

感谢您的回答,我尝试了'predict()'方法,结果是Barabera、Barolo和Grigolino等一系列类别,有没有办法查看它们最终落入哪个节点因为有几个节点代表同一个类别。 我这样运行:result.test_pred &lt;- predict(fit_wine, test, type = "class") test_pred它会返回一系列类别 是的,type="class" 更好,但对于我们想要的,type="matrix" 似乎更有帮助。

以上是关于如何计算落在树的每个节点中的观察值的主要内容,如果未能解决你的问题,请参考以下文章

2021-08-05:监控二叉树。给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象自身及其直接

在树的节点上构建等价类的好数据结构是啥?

二叉树的应用:求解四则运算

Java 求解监控二叉树

迭代时如何知道我在树的末尾?

迭代时如何知道我在树的末尾?