【问题标题】:Walk a CHAID tree R - need to sort by number of instances走一棵 CHAID 树 R - 需要按实例数排序
【发布时间】:2016-09-17 10:14:42
【问题描述】:

我有许多树,打印时它们有 7 页长。我不得不重新平衡数据,并且需要查看频率最高的分支,看看它们是否有意义 - 我需要确定不同集群的取消率。

鉴于数据太长,我需要拥有最大的分支,然后我可以验证这些,而不是手动遍历 210 个分支。我将有很多树,因此需要将其自动化以查看重要结果。

使用示例代码:

library(CHAID)
updatecars<-mtcars
updatecars$cyl<-as.factor(updatecars$cyl)
updatecars$vs<-as.factor(updatecars$vs)
updatecars$am<-as.factor(updatecars$am)
updatecars$gear<-as.factor(updatecars$gear)
plot(carsChaid)

carsChaid<-chaid(am~  cyl+vs+gear, data=updatecars)
carsChaid

当您打印此数据时,您会看到第一组的 n=15。我需要一个可以对这个值进行排序的表。

我需要的是一个决策树表,其中包含变量值和树中每个组内的数字。这与这个答案不完全相同Walk a tree 因为它没有给出内部的数字,但我认为它是方向。

有人可以帮忙吗,
谢谢,
詹姆斯

【问题讨论】:

    标签: r decision-tree interpretation


    【解决方案1】:

    当然有更好的方法可以做到这一点,但这很有效。显然愿意提出更正和改进的建议。

    我遇到的特别麻烦是创建所有组合的列表。当 expand.grid 超过 3 个因子时,它会停止工作。所以我不得不在它上面建立一个循环来创建完整的列表。

    All_canx_rates<-function(Var1,Var2,Var3,Var4,Var5,nametree){
      df1<-data.frame("CanxRate"=0,"Num_Canx"=0,"Num_Cust"=0)
      pars<-as.list(match.call()[-1])
      a<-eval(pars$nametree)[,as.character(pars$Var1)]
      b<-eval(pars$nametree)[,as.character(pars$Var2)]
      c<-eval(pars$nametree)[,as.character(pars$Var3)]
      d<-eval(pars$nametree)[,as.character(pars$Var4)]
      e<-eval(pars$nametree)[,as.character(pars$Var5)]
    
      allcombos<-expand.grid(levels(a),levels(b),levels(c))
      clean<- allcombos
      allcombos$Var4<-d[1]
    
      for (i in 2:length(levels(d))) {
        clean$Var4<-levels(d)[i]  
        allcombos<-rbind(allcombos,clean)
      }
    
      #define a forloop
      for (i in 1:nrow(allcombos)) {
        #define values
        f1<-allcombos[i,1]
        f2<-allcombos[i,2]
        f3<-allcombos[i,3]
        f4<-allcombos[i,4]
    
      y5<-nrow(nametree[(a %in% f1 & b %in% f2 & c %in% f3 & d %in% f4 & 
                           e =='1'),])
      y4<-nrow(nametree[(a %in% f1 & b %in% f2 & c %in% f3 & d %in% f4),])
      df2<-data.frame("CanxRate"=y5/y4,"Num_Canx"=y5,"Num_Cust"=y4)
      df1<-rbind(df1, df2)
    
      }
      #endforloop
      #make the dataframe available for global viewing
      df1<-df1[-1,]
      output<<-cbind(allcombos,df1)
      }
    

    【讨论】:

      【解决方案2】:

      您可以使用 data.tree 对派对对象进行进一步的操作,例如排序、遍历树、自定义绘图等。来自 github 的最新版本 v0.3.7 具有从派对类对象的转换:

      devtools::install_github("gluc/data.tree@v0.3.7")
      library(data.tree)
      tree <- as.Node(carsChaid)
      
      tree$fieldsAll
      

      最后一条命令显示了派对类的转换字段的名称:

      [1] "data"        "fitted"      "nodeinfo"    "partyinfo"   "split"       "splitlevels" "splitname"   "terms"       "splitLevel" 
      

      您可以按功能排序,例如每个节点上数据的行数:

      tree$Sort(attribute = function(node) nrow(node$data), decreasing = TRUE)
      
      print(tree, 
            "splitname",
            count = function(node) nrow(node$data), 
            "splitLevel")
      

      例如,打印如下:

        levelName splitname count splitLevel
      1     1          gear    32           
      2      ¦--3              17       4, 5
      3      °--2              15          3
      

      【讨论】:

        猜你喜欢
        • 2013-12-03
        • 2010-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-26
        • 1970-01-01
        相关资源
        最近更新 更多