将 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的主要内容,如果未能解决你的问题,请参考以下文章
在java代码中使用weka过滤器(RemoveType)的选项p