Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R partykit计算子街的分类概率_R_Traversal_Decision Tree_Party - Fatal编程技术网

R partykit计算子街的分类概率

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 &

我已经训练了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 <- 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