【问题标题】:Getting back original names from rpart.object从 rpart.object 取回原始名称
【发布时间】:2015-06-10 03:37:09
【问题描述】:

我已经保存了使用 R 中的 rpart 包创建的模型。我正在尝试从这些保存的模型中检索一些信息;特别是来自 rpart.object。虽然文档 - rpart doc - 很有帮助,但仍有一些不清楚的地方:

  1. 如何找出哪些变量是分类变量,哪些是数值变量?目前,我所做的是参考 splits 矩阵中的“索引”列。我注意到仅对于数字变量,条目不是整数。有没有更清洁的方法来做到这一点?
  2. csplit 矩阵是指分类变量可以使用整数获取的各种值,即 R 将原始名称映射为整数。有没有办法访问这个映射?例如。如果我的原始变量,比如Country 可以取任何值France, Germany, Japan 等,csplit 矩阵让我知道某个拆分是基于Country == 1, 2。在这里,rpart 分别用1, 2 替换了对France, Germany 的引用。如何从模型文件中取回原始名称 - France, Germany, Japan?另外,我怎么知道名称和整数之间的映射是什么?

【问题讨论】:

    标签: r rpart


    【解决方案1】:

    通常是terms 组件具有此类信息。 See ?rpart::rpart.object.

    fit <- rpart::rpart(Kyphosis ~ Age + Number + Start, data = kyphosis)
    fit$terms  # notice that the attribute dataClasses has the information
    attr(fit$terms, "dataClasses")
    #------------
     Kyphosis       Age    Number     Start 
     "factor" "numeric" "numeric" "numeric" 
    

    该示例的结构中没有 csplit 节点,因为所有 hte 变量都不是因子。你可以很容易地制作一个:

    > fit <- rpart::rpart(Kyphosis ~ Age + factor(findInterval(Number,c(0,4,6,Inf))) + Start, data = kyphosis)
    > fit$csplit
         [,1] [,2] [,3]
    [1,]    1    1    3
    [2,]    1    1    3
    [3,]    3    1    3
    [4,]    1    3    3
    [5,]    3    1    3
    [6,]    3    3    1
    [7,]    3    1    3
    [8,]    1    1    3
    > attr(fit$terms, "dataClasses")
                                         Kyphosis 
                                         "factor" 
                                              Age 
                                        "numeric" 
    factor(findInterval(Number, c(0, 4, 6, Inf))) 
                                         "factor" 
                                            Start 
                                        "numeric" 
    

    整数只是因子变量的值,因此“映射”与从as.numeric() 到因子的levels() 相同。如果我试图构建 fit$csplit-matrix 的字符矩阵版本,它替换因子变量中的级别名称,这将是成功的一条途径:

    > kyphosis$Numlev <- factor(findInterval(kyphosis$Number, c(0, 4, 6, Inf)), labels=c("low","med","high"))
    > str(kyphosis)
    'data.frame':   81 obs. of  5 variables:
     $ Kyphosis: Factor w/ 2 levels "absent","present": 1 1 2 1 1 1 1 1 1 2 ...
     $ Age     : int  71 158 128 2 1 1 61 37 113 59 ...
     $ Number  : int  3 3 4 5 4 2 2 3 2 6 ...
     $ Start   : int  5 14 5 1 15 16 17 16 16 12 ...
     $ Numlev  : Factor w/ 3 levels "low","med","high": 1 1 2 2 2 1 1 1 1 3 ...
    > fit <- rpart::rpart(Kyphosis ~ Age +Numlev + Start, data = kyphosis)
    > Levels <- fit$csplit
    > Levels[] <- levels(kyphosis$Numlev)[Levels]
    > Levels
         [,1]   [,2]   [,3]  
    [1,] "low"  "low"  "high"
    [2,] "low"  "low"  "high"
    [3,] "high" "low"  "high"
    [4,] "low"  "high" "high"
    [5,] "high" "low"  "high"
    [6,] "high" "high" "low" 
    [7,] "high" "low"  "high"
    [8,] "low"  "low"  "high"
    

    回复评论:如果你只有模型,然后使用 str() 来查看它。我在我创建的示例中看到了一个“有序”叶子,其因子标签存储在名为“xlevels”的属性中:

    $ ordered            : Named logi [1:3] FALSE FALSE FALSE
      ..- attr(*, "names")= chr [1:3] "Age" "Numlev" "Start"
     - attr(*, "xlevels")=List of 1
      ..$ Numlev: chr [1:3] "low" "med" "high"
     - attr(*, "ylevels")= chr [1:2] "absent" "present"
     - attr(*, "class")= chr "rpart"
    

    【讨论】:

    • 谢谢! - 术语组件确实明确地给了我变量类型。有没有办法访问名称到整数映射?
    • 您需要帮助理解该短语的含义。
    • 向问题添加详细信息。
    • 再次感谢您的回复!要取回您正在使用的级别名称kyphosis$Numlev。但在这个阶段,我只能访问模型文件。我没有数据。
    • 如果您调用fit &lt;- rpart(..., model = TRUE),则训练数据的model.frame 存储在对象中(默认情况下不存储)。然后您可以通过fit$model 轻松访问它。如果它没有存储在对象中,但数据在您的 R 会话中仍然可用,那么您可以使用 library("partykit")model.frame(fit) 使用模型的 $terms 重新评估 $call
    猜你喜欢
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多