【问题标题】:R - how to use rpart?R - 如何使用 rpart?
【发布时间】:2014-06-16 23:45:07
【问题描述】:

我无法使用 rpart 获得太多信息。

我有一个数据框:

a = structure(list(V1 = c(2, 3, 4, 2, 3, 2, 3, 3, 5, 3), V2 = c(15, 
26, 94, 15, 26, 33, 33, 33, 5, 15), V3 = structure(c(1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("f", "t"), class = "factor")), .Names = c("V1", 
"V2", "V3"), row.names = c(NA, -10L), class = "data.frame")

> a
   V1 V2 V3
1   2 15  f
2   3 26  f
3   4 94  f
4   2 15  f
5   3 26  f
6   2 33  f
7   3 33  f
8   3 33  t
9   5  5  t
10  3 15  t

> rpart(V3 ~ ., data=a)
n= 10 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

1) root 10 3 f (0.7000000 0.3000000) *

为什么 rpart 没有提供更多信息,例如 (V1 == 2) 的三种情况都导致 response = "f"(第 1、4、6 行)?

本质上,我想知道:

  • rpart 在给我上面的输出之前运行了哪些测试?
  • rpart 是否包含测试 (V2 == 2) -> 响应统计信息,如果没有,我如何使其包含这样的测试和结果?

我已阅读rpart vignette,但没有找到答案。

【问题讨论】:

    标签: r


    【解决方案1】:

    如果您以?rpart 开头并按照Value 下的信息,您将转到?rpart.object,它会告诉您:

    frame 数据框,树中的每个节点都有一行。这 框架的 row.names 包含跟随 a 的(唯一)节点号 按节点深度索引的二进制排序。 frame 的列包括 var、a 因子给出在每个拆分中使用的变量的名称 节点(叶子节点用级别“”表示),n,个数 到达节点的观测值,wt,案例权重的总和 到达节点的观察,dev,节点的偏差,yval, 节点处响应的拟合值,并拆分为两列 每个节点的左右分割标签矩阵。也包含在 框架是复杂度,这个分割的复杂度参数 将崩溃,ncompete,记录的竞争对手分裂的数量,以及 nsurrogate,记录的代理分割数。

    可能存在的额外响应信息在 yval2 中,其中 包含节点处的事件数(泊松树),或矩阵 包含拟合的类,每个节点的类计数,类 概率和“节点概率”(分类树)。

    其中一个整数向量的长度与数量相同 根节点中的观察值,包含帧的行数 对应每个观测值落入的叶子节点。

    调用生成对象的调用的图像,但带有 参数全部命名并包含实际公式作为 公式论证。要重新评估调用,请说 update(tree)。

    terms 类 c("terms", "formula") 的对象(参见 terms.object) 总结公式。被各种方法使用,但通常不是 与用户直接相关。

    splits 描述拆分的数字矩阵:仅在存在时才存在 是任何。行标签是拆分变量的名称,列 是计数,观察的数量(没有缺失并且是 正权重)由拆分向左或向右发送(用于竞争对手 splits 这是向左或向右发送的号码 此拆分已被使用,对于代理拆分,它是缺少的数字 使用此代理决定的主要拆分变量), ncat,变量的类别或级别数(+/-1 表示 连续变量),改进,这是偏差的改进 由这种分裂给出,或者,对于代理人来说, 与主要和索引,数字分割点的代理。这 最后一列 adj 给出了代理拆分的调整后一致性。 对于一个因子,索引列包含 csplit 的行号 矩阵。对于连续变量,ncat 的符号决定了是否 子集 x cutpoint 被发送到左边。

    csplit 一个整数矩阵。 (仅当至少有一个时才出现 拆分变量是一个因子或有序因子。)有一行 每个这样的拆分,列数是最大的 因素的水平。哪一行由索引列给出 分割矩阵。如果该因子的水平下降,则列记录 1 向左,如果向右,则为 3,如果该级别不是,则为 2 存在于树的此节点(或未为因子定义)。

    method 字符串:用于生长树的方法。之一 “class”、“exp”、“poisson”、“anova”或“user”(如果拆分函数 已提供)。

    cptable 一个基于最优剪枝的信息矩阵 复杂度参数。

    variable.importance 一个命名的数值向量,给出了重要性 每个变量。 (仅在有任何裂痕时出现。)当由 summary.rpart 这些被重新调整为 100。

    numresp 整数个响应; a 的级别数 因子响应。

    **parms, 控制**l 提供的参数的记录,默认值 填写。

    函数所用方法的摘要、打印和文本函数。

    为每个变量排序一个命名的逻辑向量记录,如果它是 一个有序的因子。

    na.action(如果相关)由 model.frame 返回的信息 对从 na.action 参数派生的 NA 进行特殊处理。

    【讨论】:

      【解决方案2】:

      您的问题的简短答案可能是这样的:

      rpart(V3 ~ V1 + V2,data = a,control = rpart.control(minsplit = 5))
      

      因此,您可能需要花一些时间阅读文档,特别强调rpart.control。但更广泛地说,请注意 rpart 仍然没有“测试”基于标准 V2 == 2 的拆分,仅仅是因为该变量是连续的。对连续变量的所有拆分都是简单的二元不等式拆分。只有因子会根据选择的水平子集进行拆分。

      您链接到的小插图包含一个广泛的讨论(并引用了进一步讨论的引文),该讨论确切地说明了该函数通过什么过程来选择它所做的拆分,所以我不确定如何回应您声称您已阅读它的说法但没有找到答案。

      【讨论】:

      • 谢谢。有没有办法获取 rpart 测试的列表?
      • @tucson 不。这主要是因为它测试的是(基本上)一切。对于连续变量,将评估所有可能的分割点。对于分类变量,它使用的技巧可证明等同于检查所有可能的组合(在 0-1 结果或回归结果的情况下;对于多变量结果,您只能单独检查每个拆分)。 Elements of Statistical Learning(PDF 在线免费)是一个很好的参考。
      • @joran:如果可能的话,你能看看我关于 rpart 的问题吗? stackoverflow.com/questions/65679523/… 谢谢!
      猜你喜欢
      • 2020-08-18
      • 2016-03-07
      • 2015-08-29
      • 2018-09-25
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2019-08-28
      相关资源
      最近更新 更多