从 rpart 包中的决策规则中提取信息

Posted

技术标签:

【中文标题】从 rpart 包中的决策规则中提取信息【英文标题】:Extracting Information from the Decision Rules in rpart package 【发布时间】:2016-07-23 22:06:44 【问题描述】:

我需要从决策树的规则中提取信息。我在 R 中使用 rpart 包。我使用包中的演示数据来解释我的要求:

data(stagec)
fit<- rpart(formula = pgstat ~ age + eet + g2 + grade + gleason + ploidy, data = stagec, method = "class", control=rpart.control(cp=0.05))
fit

印花合身展示

n= 146 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

 1) root 146 54 0 (0.6301370 0.3698630)  
   2) grade< 2.5 61  9 0 (0.8524590 0.1475410) *
   3) grade>=2.5 85 40 1 (0.4705882 0.5294118)  
     6) g2< 13.2 40 17 0 (0.5750000 0.4250000)  
      12) ploidy=diploid,tetraploid 31 11 0 (0.6451613 0.3548387) *
      13) ploidy=aneuploid 9  3 1 (0.3333333 0.6666667) *
     7) g2>=13.2 45 17 1 (0.3777778 0.6222222)  
      14) g2>=17.91 22  8 0 (0.6363636 0.3636364) *
      15) g2< 17.91 23  3 1 (0.1304348 0.8695652) *

例如我想为第 12 个节点获取如下信息

如果等级>=2.5 且 g2

谢谢

【问题讨论】:

也许你可以使用list.rules.rpart()作为基础:library(rpart);fit &lt;- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis);list.rules.rpart(fit) 【参考方案1】:

rpart.plot 包版本 3.0(2018 年 7 月)有一个功能 rpart.rules 用于为树生成一组规则。例如

library(rpart.plot)
data(stagec)
fit <- rpart(formula = pgstat ~ ., data = stagec, method = "class", control=rpart.control(cp=0.05))
rpart.rules(fit)

给予

pgstat                                                                   
  0.15 when grade <  3                                                   
  0.35 when grade >= 3 & g2 <  13       & ploidy is diploid or tetraploid
  0.36 when grade >= 3 & g2 >=       18                                  
  0.67 when grade >= 3 & g2 <  13       & ploidy is             aneuploid
  0.87 when grade >= 3 & g2 is 13 to 18 

rpart.rules(fit, roundint=FALSE, clip.facs=TRUE)

给予

pgstat                                                           
  0.15 when grade <  2.5                                         
  0.35 when grade >= 2.5 & g2 <  13       & diploid or tetraploid
  0.36 when grade >= 2.5 & g2 >=       18                        
  0.67 when grade >= 2.5 & g2 <  13       & aneuploid
  0.87 when grade >= 2.5 & g2 is 13 to 18                        

有关更多示例,请参阅第 4 章 rpart.plot vignette.

【讨论】:

我不断收到以下错误:Error in rpart.rules(fit) : could not find function "rpart.rules"。你知道为什么吗? 我的适合是有效的(至少从我绘制它和添加文本覆盖的能力来看) 当我重新启动我的 R 会话时,加载 rpart 并检查包含的方法,rpart.rules 未列出。 请注意rpart.rulesrpart.plot 包的一部分(不是rpart 包),因此请确保在调用rpart.rules 之前使用library(rpart.plot)。还要确保您使用的是 rpart.plot 包版本 3.0.0 或更高版本。 @StephenMilborrow:如果你有时间,可以看看我的问题吗? ***.com/questions/65679523/… (注意:我使用的计算机没有互联网接入或 USB 端口,我只有 R 和一些预装的库。我有“rpart”但我无法安装“rpart.plot”库。因此,我正在寻找一种仅使用 rpart、base R、party 和 partykit 来获取决策规则的方法。我在同一个 *** 页面上咨询了你下面的答案,它有效 - 但我无法获得完整的规则。谢谢你所有的帮助【参考方案2】:

您可以使用partykit 包中的list.rules.party() 函数和一些字符串格式。这是使用您的代码的示例。

data(stagec)
fit <- rpart(
  formula = pgstat ~ age + eet + g2 + grade + gleason + ploidy,
  data = stagec,
  method = "class",
  control = rpart.control(cp = 0.05)
)

party_obj <- as.party.rpart(fit, data = TRUE)
decisions <- partykit:::.list.rules.party(party_obj)
cat(paste(decisions, collapse = "\n"))

如您所见,您以相同的方式构建树模型。然后将模型转换为派对对象并使用list.rules.party() 函数提取决策字符串。稍微格式化一下,你就得到了

grade < 2.5
grade >= 2.5 & g2 < 13.2 & ploidy %in% c("diploid", "tetraploid")
grade >= 2.5 & g2 < 13.2 & ploidy %in% c("aneuploid")
grade >= 2.5 & g2 >= 13.2 & g2 >= 17.91
grade >= 2.5 & g2 >= 13.2 & g2 < 17.91

结果。

【讨论】:

很好的答案!我刚刚对我的数据进行了尝试,它奏效了。我只是有一个问题:当我尝试我的代码时(在这里:***.com/questions/65679523/…).... "cat(paste(decisions, collapse = "\n"))" 这一行不会告诉我响应的类别该行将导致的变量。如果您有时间,可以看看吗?谢谢!

以上是关于从 rpart 包中的决策规则中提取信息的主要内容,如果未能解决你的问题,请参考以下文章

从python中的xgboost中提取决策规则

R:从函数中获取规则

从 GradientBoostingClassifier 中提取决策规则

如何从 scikit-learn 决策树中提取决策规则?

如何从 scikit-learn 决策树中提取决策规则?

如何从 scikit-learn 决策树中提取决策规则?