R partykit计算子街的分类概率
我已经训练了partykit包ctree分类决策树,我需要计算子树的分类概率(不仅仅是叶节点)。 例如,如果一个子树由3个叶节点组成,概率如下: 叶1(120次观察):0.45 叶2(160次观察):0.49 叶3(190次观察):0.83 对于这个假设的子树,加权平均概率为 120*0.42+160*0.49+190*0.83/(120+160+190)=0.507 等等,我需要遍历ctree对象,递归地计算每个节点的所有加权概率 我有以下代码:R partykit计算子街的分类概率,r,traversal,decision-tree,party,R,Traversal,Decision Tree,Party,我已经训练了partykit包ctree分类决策树,我需要计算子树的分类概率(不仅仅是叶节点)。 例如,如果一个子树由3个叶节点组成,概率如下: 叶1(120次观察):0.45 叶2(160次观察):0.49 叶3(190次观察):0.83 对于这个假设的子树,加权平均概率为 120*0.42+160*0.49+190*0.83/(120+160+190)=0.507 等等,我需要遍历ctree对象,递归地计算每个节点的所有加权概率 我有以下代码: data(airquality) airq &
data(airquality)
airq <- subset(airquality, !is.na(Ozone))
airct <- ctree(Ozone ~ ., data = airq,
controls = ctree_control(maxsurrogate = 3))
traverse <- function(treenode){
if(treenode$terminal){
bas=paste("Current node is terminal node with",treenode$nodeID,'prediction',treenode$prediction)
print(bas)
return(0)
} else {
bas=paste("Current node",treenode$nodeID,"Split var. ID:",treenode$psplit$variableName,"split value:",treenode$psplit$splitpoint,'prediction',treenode$prediction)
print(bas)
}
traverse(treenode$left)
traverse(treenode$right)
}
数据(空气质量)
airq我不熟悉partykit
,但是这个简单的函数遍历ctree
并提取每个内部和终端节点的概率:
library(party)
set.seed(100)
dt <- ctree(factor(mpg > 20)~., data = mtcars,
control = ctree_control(minsplit=2, minbucket=1, mincriterion=0))
traverse <- function(node) {
if (node$terminal) {
return(node$prediction[2])
}
return(c(node$prediction[2],
traverse(node$left), traverse(node$right)))
}
最左边的值是由以下各项验证的总体值:
> mean(mtcars$mpg > 20)
[1] 0.4375
其余的值将按从左到右的顺序排列。您可以看到1和0按预期排列。此实现是否考虑了每个叶/终端节点的观察次数?是,内部节点概率是整个子树的概率。请注意,此解决方案适用于旧的方
实现,但不适用于新的方
实现。树的表示方式发生了显著的变化。@Achim Zeileis-您有没有参考partykit解决方案来计算子树概率?我不太清楚您到底想做什么,因为发布的代码包含一些错误。然而,我认为这个答案会帮助你做你想做的事情(或者问一个更精确的问题):
> traverse(dt@tree)
[1] 0.4375000 1.0000000 0.1428571 0.4285714 0.7500000 0.0000000 0.0000000
> mean(mtcars$mpg > 20)
[1] 0.4375