【问题标题】:export rpart rules to a data frame and link rules to train data将 rpart 规则导出到数据框并链接规则以训练数据
【发布时间】:2018-07-07 11:06:48
【问题描述】:

我已经用 rpart 训练了一些数据,并且对使用树终端节点标记每个观察结果感兴趣, 并链接到该终端节点对应的规则。

我以下面的代码为例:

library(rpart)
library(rattle)
fit <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis)
table(fit$where)
rattle::asRules(fit)

我可以通过 fit$where 标记每个观察结果, 标签是:

> table(fit$where)

 3  5  7  8  9 
29 12 14  7 19 

第一个问题:这些标签和rattle::asRules(fit)生成的标签不对应,分别是3,23,22,10,4 如何生成两者之间的映射表?

第二个问题:asRules 只是打印,而我想将规则放在表格中而不是标准输出中。

我的预期结果:在 fit$where 和 asRules 标签之间具有映射的数据框以及将规则文本作为字符串的另一列,例如:

 Rule number: 4 [Kyphosis=absent cover=29 (36%) prob=0.00]
   Start>=8.5
   Start>=14.5

如果我们可以在单独的列中将文本解析为 ID、统计信息和条件,那就更好了,但不是强制性的。

我找到了很多相关的问题和链接,但没有找到最终答案。

非常感谢, 卡玛谢

进度更新 29/01

如果我有规则 ID,我可以通过 path.rpart 分别提取每个规则:

>path.rpart(fit,node=22) 

 node number: 22 
   root
   Start>=8.5
   Start< 14.5
   Age>=55
   Age>=111

这让我将规则作为可以转换为字符串的列表。 但是 ID 抱怨的是“asRules”功能而不是“fit$where”...

使用“partykit”得到与“fit$where”相同的结果:

library("partykit")
> table(predict(as.party(fit), type = "node"))

 3  5  7  8  9 
29 12 14  7 19 

所以,我仍然无法在两者之间建立联系(asRules ID 和 fit$where ID), 我可能遗漏了一些基本的东西,或者有更直接的方法来完成这项任务。

你能帮忙吗?

【问题讨论】:

    标签: r decision-tree rpart


    【解决方案1】:

    可以通过使用找到每个fit$where对应的规则号(其实就是叶子节点号)

    > row.names(fit$frame)[fit$where]
     [1] "3"  "22" "3"  "3"  "4"  "4"  ...
    

    你可能会更接近你想要的输出

    > rattle::asRules(fit, TRUE)
    R  3 [23%,0.58] Start< 8.5
    R 23 [ 9%,0.57] Start>=8.5 Start< 14.5 Age>=55 Age< 111
    ...
    

    【讨论】:

      【解决方案2】:

      对于这个值,这毕竟是我用过的:

      [1] 用于 fit$where 和 asRules 之间的标签对齐我使用了@Graham Williams 的解决方案, 或者通过采用@VitoshKa 的函数来获得正确的标签:https://stackoverflow.com/a/30088268/8263160

      [2] 用于在数据框中创建格式良好的规则列表,我采用并修改了 Tomáš Greif 的 parse_tree 函数: https://www.r-bloggers.com/create-sql-rules-from-rpart-model/

      【讨论】:

        【解决方案3】:

        你的意思是这样的吗?

        library(rpart)
        library(rpart.utils)
        library(dplyr)
        
        #model
        fit <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis)
        
        #dataframe having leaf node's rule and subrule combination
        rule_df <- rpart.rules.table(fit) %>%
          filter(Leaf==TRUE) %>%
          group_by(Rule) %>%
          summarise(Subrules = paste(Subrule, collapse=","))
        
        #final dataframe
        df <- kyphosis %>%
          mutate(Rule = row.names(fit$frame)[fit$where]) %>%
          left_join(rule_df, by="Rule")
        head(df)
        
        #subrule table
        rpart.subrules.table(fit)
        

        输出为:

          Kyphosis Age Number Start Rule    Subrules
        1   absent  71      3     5    3          R1
        2   absent 158      3    14   22 L1,R2,R3,L4
        3  present 128      4     5    3          R1
        4   absent   2      5     1    3          R1
        5   absent   1      4    15    4       L1,L2
        6   absent   1      2    16    4       L1,L2
        

        子规则定义:

          Subrule Variable Value Less Greater
        1      L1    Start   8.5 <NA>     8.5
        2      L2    Start  14.5 <NA>    14.5
        3      L3      Age  <NA>   55    <NA>
        4      L4      Age   111 <NA>     111
        5      R1    Start  <NA>  8.5    <NA>
        6      R2    Start  <NA> 14.5    <NA>
        7      R3      Age    55 <NA>      55
        8      R4      Age  <NA>  111    <NA>
        

        【讨论】:

        • 伟大的投入,rpart.utils 包在这里提供了所需的价值(我以前不是家庭)
        【解决方案4】:

        可以通过这种方式获取规则(叶子)的数量:

        nrules &lt;- as.integer(rownames(fit$frame[fit$frame$var == "&lt;leaf&gt;",]))

        您也可以像这样迭代规则:

        rules &lt;- lapply(nrules, path.rpart, tree=fit, pretty=0, print.it=FALSE)

        另一种选择是使用包rpart.plot

        rules &lt;- rpart.plot::rpart.rules(model, cover=T, nn=T)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-23
          • 2013-07-22
          • 2018-01-10
          • 2016-03-02
          • 2013-01-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多