R:从函数中获取规则

Posted

技术标签:

【中文标题】R:从函数中获取规则【英文标题】:R: Obtaining Rules from a Function 【发布时间】:2021-04-17 03:26:15 【问题描述】:

我正在使用 R 编程语言。我使用“rpart”库并使用一些数据拟合决策树:

#from a previous question : https://***.com/questions/65678552/r-changing-plot-sizes 

    library(rpart)

   car.test.frame$Reliability = as.factor(car.test.frame$Reliability)
    
    z.auto <- rpart(Reliability ~ ., car.test.frame)
    plot(z.auto)
    text(z.auto, use.n=TRUE, xpd=TRUE, cex=.8)

这很好,但我正在寻找一种更简单的方法来总结这棵树的结果,以防树变得太大、复杂和混乱(并且无法可视化)。我在这里找到了另一个 *** 帖子,显示了如何获取规则列表:Extracting Information from the Decision Rules in rpart package

library(party)
library(partykit)

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

这将返回以下规则列表(每一行是对应于“z.auto”图的规则):

    Country %in% c("NA", "Germany", "Korea", "Mexico", "Sweden", "USA") & Weight >= 3167.5
Country %in% c("NA", "Germany", "Korea", "Mexico", "Sweden", "USA") & Weight < 3167.5
Country %in% c("NA", "Japan", "Japan/USA")> 

但是,从这个列表中,不可能知道哪个规则导致哪个“可靠性”值。目前,我是手动解释树,并手动将每个规则跟踪到结果,但是有没有办法在每一行添加“可靠性的相应值”?

例如有可能制作出这样的东西吗?

Country %in% c("NA", "Germany", "Korea", "Mexico", "Sweden", "USA") & Weight >= 3167.5 then reliability = 3,7,4,0

(注 1:我也不确定为什么这些国家/地区显示为“befgh”而不是其实际名称。

note2:我知道有一个库“rpart.plot”可以更简单地获取这些规则。但是,我使用的计算机没有 Internet 访问权限或 USB 端口,因此我无法下载 rpart.plot 库。我有 R 和一些预加载的包。我正在尝试使用 rpart、dplyr、purr、party、partykit、base R 中的函数等库来获取决策规则)

谢谢

【问题讨论】:

【参考方案1】:

这不是我的专业领域,但也许这个功能(来自https://www.togaware.com/datamining/survivor/Convert_Tree.html)会做你想做的事:

library(rpart)
car.test.frame$Reliability = as.factor(car.test.frame$Reliability)
z.auto <- rpart(Reliability ~ ., car.test.frame)
plot(z.auto, margin = 0.25)
text(z.auto, pretty = TRUE, cex = 0.8,
     splits = TRUE, use.n = TRUE, all = FALSE)

list.rules.rpart <- function(model)

  if (!inherits(model, "rpart")) stop("Not a legitimate rpart tree")
  #
  # Get some information.
  #
  frm     <- model$frame
  names   <- row.names(frm)
  ylevels <- attr(model, "ylevels")
  ds.size <- model$frame[1,]$n
  #
  # Print each leaf node as a rule.
  #
  for (i in 1:nrow(frm))
  
    if (frm[i,1] == "<leaf>")
    
      # The following [,5] is hardwired - needs work!
      cat("\n")
      cat(sprintf(" Rule number: %s ", names[i]))
      cat(sprintf("[yval=%s cover=%d (%.0f%%) prob=%0.2f]\n",
                  ylevels[frm[i,]$yval], frm[i,]$n,
                  round(100*frm[i,]$n/ds.size), frm[i,]$yval2[,5]))
      pth <- path.rpart(model, nodes=as.numeric(names[i]), print.it=FALSE)
      cat(sprintf("   %s\n", unlist(pth)[-1]), sep="")
    
  


list.rules.rpart(z.auto)
>Rule number: 4 [yval=3 cover=10 (20%) prob=0.00]
>   Country=Germany,Korea,Mexico,Sweden,USA
>   Weight>=3168
>
> Rule number: 5 [yval=2 cover=18 (37%) prob=4.00]
>   Country=Germany,Korea,Mexico,Sweden,USA
>   Weight< 3168
>
> Rule number: 3 [yval=5 cover=21 (43%) prob=2.00]
>   Country=Japan,Japan/USA

【讨论】:

谢谢!这是完美的,我一直在寻找这样的东西这么久!只是为了澄清:“规则编号:4”“4”真的没有任何意义吗? yval=3 ...“3”是指类变量? cover=10 (20%) ... 表示根据此规则分类的数据的百分比?我不确定“prob=0.00”是什么意思,你知道吗?非常感谢您的帮助!

以上是关于R:从函数中获取规则的主要内容,如果未能解决你的问题,请参考以下文章

如何从功能依赖中获取最小密钥?

如何在 R 中从参数中获取其名称的函数中创建变量?

如果对象存在于全局中,则R从函数中从全局环境中获取对象,但如果不存在则使用不同的默认值

R中使用先验函数的关联规则

使用 arules 的函数打包问题

如何从 R 调用 Excel UDF (*.XLL) 函数