2

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

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

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

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

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

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

我希望有人能帮助我!

4

1 回答 1

2

在内部,Weka 将所有值作为双精度值处理。当您创建 时Attribute,您向它传递一个字符串数组,其中列出了可能的标称值。分类返回的 double 是原始数组中所选属性的索引。因此,如果您的代码如下所示:

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

classifyInstance()返回2,那么它选择的类将是attributeValues[2]or c

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

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

于 2012-05-25T17:31:56.097 回答