全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
53947 18
2014-08-06
本人菜鸟一只,最近用rpart在做分类工作。遇到如下问题,请各位大神救命~~
我有一些数据样本简单一点如下:
文本

对样本进行决策树分类,并利用分类的结果对新的样本进行预测,代码如下:
train=read.table("~/b.txt",T)
test=read.table("~.c.txt",T)
>model=rpart(RES~SEX+EDU+AGE,train,method="class")
>TestResult=predict(model,test,type="class")
对于生成的决策树model 进行画图:
plot(model,uniform=TRUE,main="test")text(model,use.n=TRUE,fancy=T,col="blue")结果如图所示: 决策树 这个决策树显示的图形总是不全,每个分支节点的内容都看不懂,并且R里怎样将生成的决策树以规则的形式保存或查看? 如:if age>25 &edu=d then *****.  R编程基本不会,所以代码问题请各位大神狠狠批斗,多谢~多谢~~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-8-6 23:30:33
画决策树图,还是用rpart.plot程序包好看:
复制代码
rpart.jpg

至于输出成规则,用rattle程序包里面的asRules函数:
复制代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-8-7 11:34:53
Aharach 发表于 2014-8-6 23:30
画决策树图,还是用rpart.plot程序包好看:

至于输出成规则,用rattle程序包里面的asRules函数:
多谢高手,不过能简单解释下规则的含义么??
Rule number: 23 [Kyphosis=present cover=7 (9%) prob=0.57]  
Start>=8.5

   Start< 14.5

   Age>=55

   Age< 111

颜色标注的地方含义不太理解。多谢多谢~~

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-11-13 18:59:56

library("rpart")
library("rpart.plot")
ct <- rpart.control(xval=10
                    ,minsplit=10
                    ,minbucket = 10
                    ,cp=0.01
                    ,maxdepth=10
)  

## is_bank_card_null  which(colnames(data_input)=="is_bank_card_null")=2
fitFP <- rpart(is_black ~ ., data = data_input,control=ct
               ,method="class")
rpart.plot(fitFP,type=2,extra=2)

#table(data_input$is_black)   
#table(data_input[,c(1,2)])

var.imp=fitFP$variable.importance
#fitFP$frame
#fitFP$splits

summaryFP=summary(fitFP)
## ----------------------------------------------------------##
##   决策树结果, 链路输出                                    ##
## ----------------------------------------------------------##
library(stringr)
char_2_vec=function(char){  
  char=str_trim(char)   ##去除收尾的空格   
  #char = "4)  a> =12 b>   23  c<= 3  d<   98  nothing"
  
  ##将">    " 转化为">"
  char_1=str_replace_all(char, c("> "), ">")  
  i=0
  while(!(char== char_1)) {
    char_1=str_replace_all(char, c("> "), ">")
    char_2=str_replace_all(char_1, c("> "), ">")
    char=char_2
    i=i+1
    #cat('i: Step ',i,'\n')  
  }
  ##将">=    " 转化为">="
  char_1=str_replace_all(char, c(">= "), ">=")  
  i=0
  while(!(char== char_1)) {
    char_1=str_replace_all(char, c(">= "), ">=")
    char_2=str_replace_all(char_1, c(">= "), ">=")
    char=char_2
    i=i+1
    #cat('i: Step ',i,'\n')  
  }  
  ##将"<   " 转化为"<"
  char_1=str_replace_all(char, c("< "), "<")  
  i=0
  while(!(char== char_1)) {
    char_1=str_replace_all(char, c("< "), "<")
    char_2=str_replace_all(char_1, c("< "), "<")
    char=char_2
    i=i+1
    #cat('i: Step ',i,'\n')  
  }
  ##将"<=   " 转化为"<="
  char_1=str_replace_all(char, c("<= "), "<=")  
  i=0
  while(!(char== char_1)) {
    char_1=str_replace_all(char, c("<= "), "<=")
    char_2=str_replace_all(char_1, c("<= "), "<=")
    char=char_2
    i=i+1
    #cat('i: Step ',i,'\n')  
  }
  ##将"=   " 转化为"="
  char_1=str_replace_all(char, c("= "), "=")  
  i=0
  while(!(char== char_1)) {
    char_1=str_replace_all(char, c("= "), "=")
    char_2=str_replace_all(char_1, c("= "), "=")
    char=char_2
    i=i+1
    #cat('i: Step ',i,'\n')  
  }  
  ## 删除括号"()", 以及多余的空格
  char=str_replace_all(char, "[()]", "")  
  charArray=str_split(char, " ")  #这里得到的是列表
  idx_blk=which(charArray[[1]]=="")
  if(length(idx_blk)>=1){
    vec=charArray[[1]][-idx_blk]
  }else{
    vec=charArray[[1]]
  }   
  
  return(vec)
}
Tree_2_csv=function(summaryTree){
  input=capture.output(summaryFP)   ##转化为字符串   
  input1=str_trim(input)[-c(1:5)]   ##去除首尾的空格, 且删除前5行定义字段!
  
  NAMES=c("node", "split", "n", "loss",
                        "yval", "yprob_0", "yprob_1","is_leaf")
  n_row=length(input1)
  n_col=length(NAMES)
  CSV=matrix(rep(NA, n_row*n_col), ncol=n_col)  
  colnames(CSV)= NAMES
  
  for(i in 1:n_row){   
    char=input1[i]   
    vec=char_2_vec(char)   
    CSV[i, 1:length(vec)] = vec   
  }  
  
  return(as.data.frame(CSV))
}
CSV_2_CHAIN=function(CSV){
  
  leaf_info=list()
  CHAIN=list()  
  node=as.numeric(as.vector(CSV$node)) ## 转为数值型
  
  leaf_idx=which(CSV$is_leaf=="*")
  leaf_node=CSV$node[leaf_idx]  
  leaf_node=as.numeric(as.vector(leaf_node)) ## 转为数值型
  
  for(i in 1:length(leaf_node)){
   
    chain.num=c()
    leaf.num = leaf_node[i]
    #得到 chain.num 链路
    while(leaf.num >= 1 ){
      chain.num=c(chain.num, leaf.num)
      leaf.num=as.integer(leaf.num/2)      
    }   
    #根据 chain.num 得到行序号 chain.ord
    chain.ord=c()
    for(j in 1:length(chain.num)){
      chain.ord=c(chain.ord, which(node==chain.num[j]) )
    }
    #顺排, 第一个就是叶节点的下标,输出叶节点信息
    leaf.ord = chain.ord[1]
    leaf_info[[i]]=c(   
     as.numeric(as.character(CSV$node[leaf.ord]))  #叶节点的位置
    ,as.numeric(as.character(CSV$yval[leaf.ord]))  #叶节点的判定
    ,as.numeric(as.character(CSV$n[leaf.ord]))     #叶节点的点总数
    ,as.numeric(as.character(CSV$n[leaf.ord]))-
     as.numeric(as.character(CSV$loss[leaf.ord]))  #叶节点的判定所对应的点数
    )
    #逆排rev, 并且输出链路
    CHAIN[[i]]=as.character( CSV$split[rev(chain.ord)] )     
  }  
  return(list(leaf_node=leaf_node
              ,leaf_info=leaf_info
              ,CHAIN=CHAIN
              )
         )
}

CSV=Tree_2_csv(summaryFP)  ##测试
RESULT = CSV_2_CHAIN(CSV)    ##测试
  
  
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-11-13 19:31:08




## ----------------------------------------------------------##
##   决策树                                                  ##
## ----------------------------------------------------------##
library("rpart")
library("rpart.plot")
ct <- rpart.control(xval=10
                    ,minsplit=10
                    ,minbucket = 10
                    ,cp=0.01
                    ,maxdepth=10
)  

## is_bank_card_null  which(colnames(data_input)=="is_bank_card_null")=2
fitFP <- rpart(is_black ~ ., data = data_input,control=ct
               ,method="class")
rpart.plot(fitFP,type=2,extra=2)

#table(data_input$is_black)   
#table(data_input[,c(1,2)])

var.imp=fitFP$variable.importance
#fitFP$frame
#fitFP$splits

summaryFP=summary(fitFP)
## ----------------------------------------------------------##
##   决策树结果, 链路输出                                    ##
## ----------------------------------------------------------##
library(stringr)
char_2_vec=function(char){  
  char=str_trim(char)   ##去除收尾的空格   
  #char = "4)  a> =12 b>   23  c<= 3  d<   98  nothing"
  
  ##将">    " 转化为">"
  char_1=str_replace_all(char, c("> "), ">")  
  i=0
  while(!(char== char_1)) {
    char_1=str_replace_all(char, c("> "), ">")
    char_2=str_replace_all(char_1, c("> "), ">")
    char=char_2
    i=i+1
    #cat('i: Step ',i,'\n')  
  }
  ##将">=    " 转化为">="
  char_1=str_replace_all(char, c(">= "), ">=")  
  i=0
  while(!(char== char_1)) {
    char_1=str_replace_all(char, c(">= "), ">=")
    char_2=str_replace_all(char_1, c(">= "), ">=")
    char=char_2
    i=i+1
    #cat('i: Step ',i,'\n')  
  }  
  ##将"<   " 转化为"<"
  char_1=str_replace_all(char, c("< "), "<")  
  i=0
  while(!(char== char_1)) {
    char_1=str_replace_all(char, c("< "), "<")
    char_2=str_replace_all(char_1, c("< "), "<")
    char=char_2
    i=i+1
    #cat('i: Step ',i,'\n')  
  }
  ##将"<=   " 转化为"<="
  char_1=str_replace_all(char, c("<= "), "<=")  
  i=0
  while(!(char== char_1)) {
    char_1=str_replace_all(char, c("<= "), "<=")
    char_2=str_replace_all(char_1, c("<= "), "<=")
    char=char_2
    i=i+1
    #cat('i: Step ',i,'\n')  
  }
  ##将"=   " 转化为"="
  char_1=str_replace_all(char, c("= "), "=")  
  i=0
  while(!(char== char_1)) {
    char_1=str_replace_all(char, c("= "), "=")
    char_2=str_replace_all(char_1, c("= "), "=")
    char=char_2
    i=i+1
    #cat('i: Step ',i,'\n')  
  }  
  ## 删除括号"()", 以及多余的空格
  char=str_replace_all(char, "[()]", "")  
  charArray=str_split(char, " ")  #这里得到的是列表
  idx_blk=which(charArray[[1]]=="")
  if(length(idx_blk)>=1){
    vec=charArray[[1]][-idx_blk]
  }else{
    vec=charArray[[1]]
  }   
  
  return(vec)
}
Tree_2_csv=function(summaryTree){
  input=capture.output(summaryFP)   ##转化为字符串   
  input1=str_trim(input)[-c(1:5)]   ##去除首尾的空格, 且删除前5行定义字段!
  
  NAMES=c("node", "split", "n", "loss",
                        "yval", "yprob_0", "yprob_1","is_leaf")
  n_row=length(input1)
  n_col=length(NAMES)
  CSV=matrix(rep(NA, n_row*n_col), ncol=n_col)  
  colnames(CSV)= NAMES
  
  for(i in 1:n_row){   
    char=input1[i]   
    vec=char_2_vec(char)   
    CSV[i, 1:length(vec)] = vec   
  }  
  
  return(as.data.frame(CSV))
}
CSV_2_CHAIN=function(CSV){
  
  leaf_info=list()
  CHAIN=list()  
  node=as.numeric(as.vector(CSV$node)) ## 转为数值型
  
  leaf_idx=which(CSV$is_leaf=="*")
  leaf_node=CSV$node[leaf_idx]  
  leaf_node=as.numeric(as.vector(leaf_node)) ## 转为数值型
  
  for(i in 1:length(leaf_node)){
   
    chain.num=c()
    leaf.num = leaf_node[i]
    #得到 chain.num 链路
    while(leaf.num >= 1 ){
      chain.num=c(chain.num, leaf.num)
      leaf.num=as.integer(leaf.num/2)      
    }   
    #根据 chain.num 得到行序号 chain.ord
    chain.ord=c()
    for(j in 1:length(chain.num)){
      chain.ord=c(chain.ord, which(node==chain.num[j]) )
    }
    #顺排, 第一个就是叶节点的下标,输出叶节点信息
    leaf.ord = chain.ord[1]
    leaf_info[[i]]=c(   
     as.numeric(as.character(CSV$node[leaf.ord]))  #叶节点的位置
    ,as.numeric(as.character(CSV$yval[leaf.ord]))  #叶节点的判定
    ,as.numeric(as.character(CSV$n[leaf.ord]))     #叶节点的点总数
    ,as.numeric(as.character(CSV$n[leaf.ord]))-
     as.numeric(as.character(CSV$loss[leaf.ord]))  #叶节点的判定所对应的点数
    )
    #逆排rev, 并且输出链路
    CHAIN[[i]]=as.character( CSV$split[rev(chain.ord)] )     
  }  
  return(list(leaf_node=leaf_node
              ,leaf_info=leaf_info
              ,CHAIN=CHAIN
              )
         )
}

CSV=Tree_2_csv(summaryFP)  ##测试
RESULT = CSV_2_CHAIN(CSV)    ##测试
  
  


将决策树的结果输出,输出叶节点的链路,在RESULT这个list的CHAIN中.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-3-29 15:07:34
敢问楼上发的是什么?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群