将 Weka DecisionTree 从 Java API 导出到 XML 或 JSON

Posted

技术标签:

【中文标题】将 Weka DecisionTree 从 Java API 导出到 XML 或 JSON【英文标题】:Exporting Weka DecisionTree from Java API to XML or JSON 【发布时间】:2013-12-24 04:04:57 【问题描述】:

我的任务是通过添加决策树的导出以供离线组件使用(最好是 JSON 格式,但 XML 也可以工作)来增强 Java 中现有的 Weka 系统。

让我警告你,我对 Weka 很陌生 :)

还没有找到一种方法来直接访问 J48 的根树(似乎在课堂上是私有的)——你知道一种方法吗?如果不是,我发现的最接近的一种获取数据位的方法:使用 J48.toString() 将树转储为字符串,然后将其转换回树结构,然后将其转换为JSON 字符串 (YUK)。

似乎这个用例并不罕见,所以我想知道你们中是否有人已经解决了这个问题。 . .任何方向/建议表示赞赏。

谢谢!

【问题讨论】:

【参考方案1】:

ClassifierTree 中的graph() 方法在“点”文件中给出了决策树的Graphviz 表示。

如果我们取this example,那么代码

J48 g = (J48) models[0]; 
System.out.println(g.graph());

将返回:

digraph J48Tree 
N0 [label="outlook" ]
N0->N1 [label="= sunny"]
N1 [label="humidity" ]
N1->N2 [label="<= 75"]
N2 [label="yes (2.0)" shape=box style=filled ]
N1->N3 [label="> 75"]
N3 [label="no (3.0)" shape=box style=filled ]
N0->N4 [label="= overcast"]
N4 [label="yes (4.0)" shape=box style=filled ]
N0->N5 [label="= rainy"]
N5 [label="yes (4.0/1.0)" shape=box style=filled ]

对应这棵树:

回答您的问题

我还没有找到直接访问 J48 根树的方法 (在课堂上似乎是私人的)——你知道有一种方法可以得到 是吗?

您可以像下面一样扩展J48,并将您的分类器声明为MyJ48,而不是J48

class MyJ48 extends J48

    public ClassifierTree getGraph()
        return m_root;
    


这使得可以使用getGraph() 方法访问ClassifierTree。基于此,您可以模仿ClassifierTree 类的graph() 方法(参见here)来生成您的json

希望对你有帮助。

【讨论】:

我想这是我能得到的最接近我想要的答案。将研究您的建议,看看我是否可以以某种方式将图形输出解析为一个好的 JSON 公民。成功后将发布图表 -> json 解析逻辑。 不确定在继承 J48 之后如何“模仿 ClassifierTree 的 graph() 方法”。为了模仿它,我需要访问 ClassifierTree 的受保护变量,例如我无法从 MyJ48 类访问的 m_localModel。

以上是关于将 Weka DecisionTree 从 Java API 导出到 XML 或 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Weka:如何在 J48 决策树中实现代理拆分?

在java代码中使用weka过滤器(RemoveType)的选项p

如何使用 MATLAB 从 WEKA 检索类值

WEKA - 将实例分配给 kmeans.buildClusterer 时出错

将网页转换为 ARFF 文件以进行 Weka 分类

如何从 libSVM 中使用的数据集转换为 weka 中使用的格式数据(*.arff 或 *.csv)