获取 R 中 rpart/ctree 包的每一行预测数据集的决策树规则/路径模式

Posted

技术标签:

【中文标题】获取 R 中 rpart/ctree 包的每一行预测数据集的决策树规则/路径模式【英文标题】:Get decision tree rule/path pattern for every row of predicted dataset for rpart/ctree package in R 【发布时间】:2015-06-19 12:58:27 【问题描述】:

我使用rpartctree 在R 中构建了一个决策树模型。 我还使用构建的模型预测了一个新数据集,并获得了预测的概率和类别。

但是,我想在单个字符串中提取规则/路径,用于每个观察(在预测数据集中)遵循的。以表格格式存储这些数据,我可以自动解释预测,而无需打开 R。

这意味着我想获得关注。

ObsID   Probability   PredictedClass   PathFollowed 
    1          0.68             Safe   CarAge < 10 & Country = Germany & Type = Compact & Price < 12822.5
    2          0.76             Safe   CarAge < 10 & Country = Korea & Type = Compact & Price > 12822.5
    3          0.88           Unsafe   CarAge > 10 & Type = Van & Country = USA & Price > 15988

我正在寻找的代码类型是

library(rpart)
fit <- rpart(Reliability~.,data=car.test.frame)

这可能需要扩展到多行

predResults <- predict(fit, newdata = newcar, type= "GETPATTERNS")

【问题讨论】:

【参考方案1】:

partykit 包有一个函数.list.rules.party(),目前尚未导出,但可以用来做你想做的事。我们还没有导出它的主要原因是它的输出类型可能会在未来的版本中发生变化。

要获得您上面描述的预测,您可以执行以下操作:

pathpred <- function(object, ...)

  ## coerce to "party" object if necessary
  if(!inherits(object, "party")) object <- as.party(object)

  ## get standard predictions (response/prob) and collect in data frame
  rval <- data.frame(response = predict(object, type = "response", ...))
  rval$prob <- predict(object, type = "prob", ...)

  ## get rules for each node
  rls <- partykit:::.list.rules.party(object)

  ## get predicted node and select corresponding rule
  rval$rule <- rls[as.character(predict(object, type = "node", ...))]

  return(rval)

使用iris 数据和rpart() 的插图:

library("rpart")
library("partykit")
rp <- rpart(Species ~ ., data = iris)
rp_pred <- pathpred(rp)
rp_pred[c(1, 51, 101), ]
##       response prob.setosa prob.versicolor prob.virginica
## 1       setosa  1.00000000      0.00000000     0.00000000
## 51  versicolor  0.00000000      0.90740741     0.09259259
## 101  virginica  0.00000000      0.02173913     0.97826087
##                                           rule
## 1                          Petal.Length < 2.45
## 51   Petal.Length >= 2.45 & Petal.Width < 1.75
## 101 Petal.Length >= 2.45 & Petal.Width >= 1.75

(为简洁起见,此处仅显示每个物种的第一次观察。这对应于索引 1、51 和 101。)

还有ctree():

ct <- ctree(Species ~ ., data = iris)
ct_pred <- pathpred(ct)
ct_pred[c(1, 51, 101), ]
##       response prob.setosa prob.versicolor prob.virginica
## 1       setosa  1.00000000      0.00000000     0.00000000
## 51  versicolor  0.00000000      0.97826087     0.02173913
## 101  virginica  0.00000000      0.02173913     0.97826087
##                                                              rule
## 1                                             Petal.Length <= 1.9
## 51  Petal.Length > 1.9 & Petal.Width <= 1.7 & Petal.Length <= 4.8
## 101                        Petal.Length > 1.9 & Petal.Width > 1.7

【讨论】:

我正在尝试重现此示例以确保我理解所有内容。您能解释在 rp_pred[c(1, 51, 101), ] 中使用索引 1、51 和 101 的意义吗? 我无法显示 iris 数据集中所有 150 个观测值的路径。所以我只是选择了响应中每个物种的第一个观察结果。没有与此相关的更深层次的含义。将在我的答案中添加注释。 啊,谢谢!我想可能是这样,但我想确保我没有遗漏什么。 @Kyle。您是否设法在 Python 中实现了这一点?我试图在 Python 中做同样的事情,但是我找不到任何东西。我看到了你的问题 (datascience.stackexchange.com/questions/8440/…),并希望你可能是知道如何在 Python 中做到这一点的人。 这个功能很棒。谢谢。

以上是关于获取 R 中 rpart/ctree 包的每一行预测数据集的决策树规则/路径模式的主要内容,如果未能解决你的问题,请参考以下文章

获取R中矩阵每一行中K个最小或最大元素的索引

对于 R 数据框中的每一行

从r中矩阵的每一行中减去一个常数向量

R使用tmaptools为sf对象中的每一行创建边界框

R中具有数据框的每一行的最小值和最大值

如何将矩阵的每一行除以R中的向量元素