【问题标题】:Accessing individual results from decision tree function JRip (RWeka library)从决策树函数 JRip(RWeka 库)访问单个结果
【发布时间】:2014-05-06 07:20:30
【问题描述】:

我正在使用库(RWeka)并在数据集上运行 JRip 函数。有谁知道以编程方式访问规则结果集的方法,以便我可以单独访问每个规则?

这里是一个示例,仅用于说明目的:

> library(datasets)
> head(npk)
block N P K yield
1     1 0 1 1  49.5
2     1 1 1 0  62.8
3     1 0 0 0  46.8
4     1 1 0 1  57.0
5     2 1 0 0  59.8
6     2 1 1 1  58.5
> tree_rip <- JRip(block ~ ., data = npk)
> tree_rip
JRIP rules:
===========

(yield <= 48.8) => block=4 (5.0/2.0)
(yield <= 52) => block=5 (4.0/1.0)
=> block=3 (15.0/11.0)

Number of Rules : 3

我想以数据框/表格的方式访问结果。最接近的是通过以下方式检索单个 blob 字符串:

> tree_rip$classifier
[1] "Java-Object{JRIP rules:\n===========\n\n(yield <= 48.8) => block=4 (5.0/2.0)\n(yield <= 52) => block=5 (4.0/1.0)\n => block=3 (15.0/11.0)\n\nNumber of Rules : 3\n}"

我需要一些可以让我分别获得每个结果的东西,就像我调用tree_rip 时打印的那样,所以我不仅可以获得找到的规则的长度,还可以逐个访问它们。

至少是这样的(但理想情况下,为每一行分别访问每个结果变量):

[1] (yield <= 48.8) => block=4 (5.0/2.0)
[2] (yield <= 52) => block=5 (4.0/1.0)
...

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    这对我来说非常困难,因为我不是 R 与 Java 集成的用户。无论如何,在查看这些结果以了解 REPL 如何产生您所看到的结果之后:

    str(tree_rip)
    # omitting about 15 lines of output
    # - attr(*, "class")= chr [1:3] "JRip" "Weka_rules" "Weka_classifier"
    
    getAnywhere(print.JRIP)
    # no object named ‘print.JRIP’ was found
    getAnywhere(print.Weka_rules)
    # no object named ‘print.Weka_rules’ was found
    help(pack="RWeka")
    getAnywhere(print.Weka_classifier)
    # this did succeed ... so I though `.jcall` should also succeed
    
    .jcall(tree_rip$classifier, "S", "toString")
     #    Error: could not find function ".jcall"
     RWeka:::.jcall(tree_rip$classifier, "S", "toString")
     #    Error in get(name, envir = asNamespace(pkg), inherits = FALSE) : 
     #      object '.jcall' not found
    

    ...我发现需要加载 pkg:rJava 才能访问.jcall function。显然,这是支持库未加载但仅附加的情况之一。 (类似于假设 [不正确地] grid.text 应该在仅加载 pkg:lattice 时可用。)所以这为您提供了所需的字符串集:

    library(rJava)
    as.matrix(scan(text=.jcall(tree_rip$classifier, "S", "toString") ,sep="\n", what="") )[
                                                                           -c(1:2, 6), ,drop=FALSE]
    #------------
         [,1]                                  
    [1,] "(yield <= 48.8) => block=4 (5.0/2.0)"
    [2,] "(yield <= 52) => block=5 (4.0/1.0)"  
    [3,] " => block=3 (15.0/11.0)" 
    

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 2019-05-27
      • 2020-12-11
      • 1970-01-01
      • 2023-03-30
      • 2016-01-02
      • 2019-10-20
      • 2015-09-04
      • 2019-02-01
      相关资源
      最近更新 更多