Weka java库:如何获取分类实例的字符串表示?

时间:2012-05-21 12:00:43

标签: machine-learning data-mining weka neural-network

目前我正在开展一个将搜索查询分为以下八种类型的项目:{运动员,演员,艺术家,政治家,地理位置,设施,质量保证,定义}。经过一些工作后,当我用分层10倍交叉验证评估分类器时,我设法使用多层感知器分类器为我的300个样本查询集合正确分类了78%的实例,我认为这是相当不错的。

使用weka java库我将整个内容实现为java代码,因此我可以编写一个程序,将查询动态地提供给分类器并检索它的查询类型。我成功地实现了整个分类器训练部分。下一步是使用classifyInstance()或distributionForInstance()来确定查询所分类的类。

classifyInstance()但是只返回一个我不知道的double值,以获取实际的查询类型。 weka wikispaces告诉我,我可以使用

unlabeled.classAttribute().value((int) clsLabel);

在调用classifyInstance()以获取类的String表示之后,这似乎总是在我的情况下返回空字符串。

使用distributionForInstance()我能够成功检索一个数字,其中包含8个介于0和1之间的双精度值(这很好,因为我将其归类为8种查询类型)。但是,这个数组的顺序是什么?结果数组中的第一个元素是我的训练文件中出现的第一个类吗?或者在此结果数组中是否存在其他预定义元素顺序(例如,按字母顺序排列)? weka documentation没有提供任何相关信息。

我希望有人能够帮助我!

1 个答案:

答案 0 :(得分:2)

在内部,Weka将所有值都视为双倍。创建Attribute时,会向其传递一个字符串数组,其中列出了可能的名义值。分类返回的双精度是原始数组中所选属性的索引。所以如果你的代码看起来像这样:

String[] attributeValues = {"a", "b", "c"};
Attribute a = new Attribute("attributeName", attributeValues);

classifyInstance()返回2,然后它选择的课程为attributeValues[2]c

使用distributionForInstance()方法,两个数组的索引匹配,因此attributeValues[0]是返回的数组的第一个元素的字符串名称。

更新(因为downvote) 如果您让weka自己创建Instances对象(例如,如果您正在从arff文件中读取),则上述方法将不起作用。鉴于你的问题,情况似乎并非如此,但如果是,那么请发布代码,以便我们可以看到正在发生的事情。