【问题标题】:Extract split values from rpart object in R从 R 中的 rpart 对象中提取拆分值
【发布时间】:2019-10-06 03:57:35
【问题描述】:

我在 rpart 对象中找不到节点的拆分值(或其他数据)。我在 summary(sample_model) 中看到它,但不在列表或数据框中

一些样本数据

foo.df <- structure(list(type = c("fudai", "fudai", "fudai", "fudai", "fudai", 
                              "fudai", "fudai", "tozama", "fudai", "fudai", "tozama", "tozama", 
                              "fudai", "tozama", "fudai", "fudai", "tozama", "fudai", "fudai", 
                              "tozama", "fudai", "fudai", "fudai", "tozama", "fudai", "fudai", 
                              "tozama", "fudai", "fudai", "fudai", "fudai", "fudai", "tozama", 
                              "fudai", "fudai", "fudai", "fudai", "fudai", "fudai", "tozama", 
                              "tozama", "fudai", "tozama", "tozama", "tozama", "tozama", "fudai", 
                              "fudai", "tozama", "tozama"), distance = c(12.5366985071383, 
                                                                         272.697138147139, 40.4780423740381, 109.806349869662, 147.781805212839, 
                                                                         89.4280438527415, 49.1425850803745, 555.414271440522, 119.365138867582, 
                                                                         182.902536555383, 310.019126513348, 277.122207392514, 214.510428881317, 
                                                                         235.111617874157, 104.494518693549, 50.7561853895564, 343.308898045237, 
                                                                         151.796857505073, 36.0391449169937, 30.8214406651022, 343.294467363406, 
                                                                         135.841501028422, 154.798119311647, 317.739208576563, 3.33794280697559, 
                                                                         98.9182898110913, 422.915369767251, 194.957988642709, 87.6548263591412, 
                                                                         187.571370158631, 236.292608259126, 17.915709270268, 193.548578374405, 
                                                                         262.190146422316, 21.6219797945323, 121.199009527283, 261.670997612517, 
                                                                         202.2051991431, 125.418459536787, 275.964068539003, 190.112226847932, 
                                                                         20.1753302760961, 488.80323504215, 579.25515722891, 233.500797034697, 
                                                                         207.588349435329, 183.770003408524, 168.739293254246, 313.140075747773, 
                                                                         131.69228390613), age = c(1756, 1711, 1712, 1746, 1868, 1866, 
                                                                                                   1682, 1617, 1771, 1764, 1672, 1636, 1864, 1704, 1762, 1868, 1694, 
                                                                                                   1749, 1703, 1616, 1691, 1702, 1723, 1683, 1742, 1691, 1623, 1721, 
                                                                                                   1704, 1745, 1749, 1723, 1639, 1661, 1843, 1845, 1669, 1698, 1698, 
                                                                                                   1664, 1868, 1633, 1783, 1642, 1615, 1648, 1734, 1758, 1725, 1635
                                                                         )), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
                                                                                                                                     -50L))

还有一个基本模型

library("rpart")
sample_model <- rpart(formula = type ~ ., 
                  data = sample_data, 
                  method = "class",
                  control = rpart.control(xval = 50, minbucket = 5, cp = 0.05),
                  parms = list(split = "gini"))

rpart 文档说 sample_model$frame 中应该有一个名为“splits”的列,但它不存在。引用:“拆分,每个节点的左右拆分标签的两列矩阵”https://www.rdocumentation.org/packages/rpart/versions/4.1-15/topics/rpart.object

sample_model$framesample_model 中的那些列在哪里?但是,我在

中看到了我想要的数据
summary(sample_model)

发生了什么事?

【问题讨论】:

    标签: r decision-tree rpart


    【解决方案1】:

    我比现在看到了,但它似乎没有描述当前的结构。 $splits 项目是一个单独的列表元素:

      sample_model$splits
    
     #----------
    
             count ncat  improve     index adj
    distance    50   -1 9.134639  274.3306   0
    age         50    1 7.910588 1687.0000   0
    age         39    1 6.062937 1654.5000   0
    distance    39   -1 1.950142  188.8418   0
    

    要查看 sample_model 的完整结构,请执行以下操作:

    str(sample_model)
    

    我无法确认我对文档滞后代码的预感:

    news(grepl('splits', Text), 'rpart')     #--------------------
    

    4.1-0 版本的变化

    代理拆分现在仅在它们发送两个或多个非零权重案例时才被考虑。对于数字/有序变量,对非零权重的限制是新的:对于分类变量,这是一个新的限制。 不再返回仅通过在默认拆分上舍入误差来改进的代理拆分。在存在权重和缺失值的情况下,其中一些的拆分组件未正确返回。

    4.0-1 版本的变化

    另一个主要变化是不对称损失矩阵的错误,由用户查询提示。在 L=loss 不对称的情况下,改变的先验计算不正确——他们使用的是 L' 而不是 L。结果——树不一定会为给定的损失矩阵选择最佳分割。一旦选择,分裂被正确评估。打印出来的“改进”值当然也是错误的。有趣的是,对于我的小测试用例,在 L 非常不对称的情况下,树中的早期分裂没有改变——好的分裂看起来仍然很好。

    要获得规范的答案,您需要联系维护者:

     maintainer('rpart')
    

    【讨论】:

    • 我认为可能是这种情况,但在帮助中,拆分是在框架下记录,然后在拆分下再次记录。 sample_model$splits 也有 2 个节点的 4 行。除了更高的改进值之外,什么标记了实际节点(而不是竞争对手或代理)?
    • 我猜当拆分超出框架时文档可能尚未更新,但这只是猜测。
    • 所以要获得实际的拆分值,我可以使用 sample_model$splits[c(1,3),4] 但这似乎很奇怪。我可以在 rpart 中将 maxcompete 设置为零。我想我的核心问题是“如何捕获 print(sample_model) 的简单格式”
    • 你可以检查getAnywhere(print.rpart)返回的代码,看看你觉得哪些部分有用。
    • 谢谢!我期望只提取一些明显命名的参数,例如 lm()。但现在我开始看到用于计算摘要的基础值。
    猜你喜欢
    • 2015-06-28
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    相关资源
    最近更新 更多