【问题标题】:R extract terminal node info from partykit decision treeR从partykit决策树中提取终端节点信息
【发布时间】:2017-11-06 16:15:10
【问题描述】:

我创建了一个 constparty 决策树(自定义拆分规则)并打印出树结果。结果如下所示:

Fitted party:
[1] root
|   [2] value.a < 1651: 0.067 (n = 1419, err = 88.6)
|   [3] value.a >= 1651: 0.571 (n = 7, err = 1.7)

我正在尝试提取终端节点信息 (yval:0.067 和 0.571; 每个节点上的n:1419和7; 和错误:88.6 和 1.7)并将它们放入一个列表中,同时具有相应的节点 ID(节点 ID 2 和 3),以便我以后可以使用这些信息。

我一直在研究partykit 函数,但找不到可以帮助我提取刚刚列出的那些信息的函数。

有人可以帮帮我吗?谢谢!

【问题讨论】:

    标签: r nodes extract decision-tree party


    【解决方案1】:

    与往常一样,有几种方法可以获取您正在寻找的信息。提取存储在特定node 中的info 的技术方法是使用nodeapply(object, ids, info_node),其中info_node 返回存储在相应节点中的信息列表。

    但是,constparty 对象的终端节点中没有存储任何内容。相反,拟合节点的响应的整个分布被存储并且可以通过fitted(object) 提取。这包含一个带有观察到的(response)(fitted) 节点和观察到的(weights)(如果有)的数据框。然后您可以轻松地使用tapply()aggregate() 或类似的东西来计算节点方式等。

    或者,您可以将constparty 对象转换为simpleparty 对象,该对象将打印信息存储在节点中并提取它。

    这两种策略的一个工作示例是cars 数据的简单回归树:

    library("partykit")
    data("cars", package = "datasets")
    ct <- ctree(dist ~ speed, data = cars)
    

    然后您可以通过

    轻松计算节点means
    with(fitted(ct), tapply(`(response)`, `(fitted)`, mean))
    ##        3        4        5 
    ## 18.20000 39.75000 65.26316 
    

    当然,您可以将mean 替换为您感兴趣的任何其他汇总统计信息。

    simplepartynodeapply() 可以通过以下方式获得:

    nodeapply(as.simpleparty(ct), ids = nodeids(ct, terminal = TRUE), info_node)
    ## $`3`
    ## $`3`$prediction
    ## [1] 18.2
    ## 
    ## $`3`$n
    ##  n 
    ## 15 
    ## 
    ## $`3`$error
    ## [1] 1176.4
    ## 
    ## $`3`$distribution
    ## NULL
    ## 
    ## $`3`$p.value
    ## NULL
    ## 
    ## 
    ## $`4`
    ## $`4`$prediction
    ## [1] 39.75
    ## ...
    

    【讨论】:

    • 非常感谢您的回答!你是 R 上的 DT 之王!我非常感谢你在这件事上给我的所有帮助,我希望我能继续向你学习!
    • @RichardLi 我不确定它是否适合贵族,但如果我们的软件对您有用,我很高兴! ;-)
    • 我可以问一个关于该主题的后续问题吗?我已经使用 nodeapply(info_node) 提取了信息,我想自动化这个过程,例如:创建一个函数来提取一系列节点的节点信息,但我没有在函数中这样做。提取需要符号“nodeinfo$nodeid$distribution”作为示例,但在函数内部,如果我将 j 定义为节点 id,函数无法识别 nodeinfo$j$ 分布的符号。你有解决方案吗?非常感谢!!
    • @RichardLi 我不确定到底是什么问题。请提供一个最小的可重现示例...可能在一个新问题中,以免使该线程超载。
    • 嗨:我刚刚发布了一个新问题,其中包含我的问题的详细信息。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2017-06-17
    • 2016-08-12
    • 2021-09-03
    • 2018-09-23
    • 2021-12-16
    • 2013-01-17
    • 2019-12-11
    • 2015-08-19
    相关资源
    最近更新 更多