【问题标题】:Get decision tree rule/path pattern for every row of predicted dataset for rpart/ctree package in R获取 R 中 rpart/ctree 包的每一行预测数据集的决策树规则/路径模式
【发布时间】: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")

【问题讨论】:

    标签: r decision-tree rpart


    【解决方案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 中做到这一点的人。
    • 这个功能很棒。谢谢。
    猜你喜欢
    • 2015-06-16
    • 2018-08-26
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2015-06-28
    • 2021-12-16
    • 2021-05-30
    • 2016-07-24
    相关资源
    最近更新 更多