请选择 进入手机版 | 继续访问电脑版
楼主: wangwei0601
52304 18

[问答] R语言对生成的决策树进行plot画图显示并将决策树以规则形式导出 [推广有奖]

  • 2关注
  • 0粉丝

初中生

14%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
89 点
帖子
4
精华
0
在线时间
20 小时
注册时间
2014-5-21
最后登录
2016-9-18

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
本人菜鸟一只,最近用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编程基本不会,所以代码问题请各位大神狠狠批斗,多谢~多谢~~
二维码

扫码加我 拉你入群

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

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

关键词:plot 决策树 R语言 Uniform predict method train 样本

Aharach 发表于 2014-8-6 23:30:33 |显示全部楼层 |坛友微信交流群
画决策树图,还是用rpart.plot程序包好看:
  1. >library(rpart.plot)
  2. >library(rattle)
  3. >library(rpart)
  4. > fit <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis)
  5. > fancyRpartPlot(fit)
复制代码
rpart.jpg


至于输出成规则,用rattle程序包里面的asRules函数:
  1. > library(rattle)
  2. > fit <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis)
  3. > asRules(fit)

  4. Rule number: 3 [Kyphosis=present cover=19 (23%) prob=0.58]
  5.    Start< 8.5

  6. Rule number: 23 [Kyphosis=present cover=7 (9%) prob=0.57]
  7.    Start>=8.5
  8.    Start< 14.5
  9.    Age>=55
  10.    Age< 111

  11. Rule number: 22 [Kyphosis=absent cover=14 (17%) prob=0.14]
  12.    Start>=8.5
  13.    Start< 14.5
  14.    Age>=55
  15.    Age>=111

  16. Rule number: 10 [Kyphosis=absent cover=12 (15%) prob=0.00]
  17.    Start>=8.5
  18.    Start< 14.5
  19.    Age< 55

  20. Rule number: 4 [Kyphosis=absent cover=29 (36%) prob=0.00]
  21.    Start>=8.5
  22.    Start>=14.5
复制代码
已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
kookie76 + 1 + 1 + 1 精彩帖子
zorro999 + 1 + 1 精彩帖子
李会超 + 60 + 40 精彩帖子

总评分: 经验 + 60  论坛币 + 40  学术水平 + 2  热心指数 + 2  信用等级 + 1   查看全部评分

使用道具

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

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

使用道具

fridaywu 发表于 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)    ##测试
  
  

使用道具

fridaywu 发表于 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中.

使用道具

敢问楼上发的是什么?

使用道具

wuchm 发表于 2015-3-29 20:50:40 |显示全部楼层 |坛友微信交流群
Aharach 发表于 2014-8-6 23:30
画决策树图,还是用rpart.plot程序包好看:

至于输出成规则,用rattle程序包里面的asRules函数:
请教下楼上这位大神,R输出图形的数字是  ...e...  格式的,怎么改为常规格式呢?

使用道具

小才才 发表于 2015-5-26 10:58:46 |显示全部楼层 |坛友微信交流群
wangwei0601 发表于 2014-8-7 11:34
多谢高手,不过能简单解释下规则的含义么??
Rule number: 23 [Kyphosis=present cover=7 (9%) prob=0. ...
请问你标红的地方理解了吗?麻烦告诉一下,在线等,急

使用道具

ウ兴ウ 发表于 2015-11-19 13:59:38 |显示全部楼层 |坛友微信交流群
wangwei0601 发表于 2014-8-7 11:34
多谢高手,不过能简单解释下规则的含义么??
Rule number: 23 [Kyphosis=present cover=7 (9%) prob=0. ...
你可以查看总样本量=81.
Rule number: 23 [Kyphosis=present cover=7 (9%) prob=0.57]  
规则23共有7个样本,覆盖率为7/81=9%,输出为present,正确率为57%

使用道具

MrShining 发表于 2016-8-7 22:43:07 |显示全部楼层 |坛友微信交流群
Aharach 发表于 2014-8-6 23:30
画决策树图,还是用rpart.plot程序包好看:

至于输出成规则,用rattle程序包里面的asRules函数:
请问画的决策树图中,方块里的百分数上面的数字是什么意思?谢谢!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-18 17:14