目前,我正在开展一个项目,将搜索查询分为以下八种类型:{运动员、 Actor 、艺术家、政治家、地理、设施、QA、定义}。经过一番工作后,当我使用分层 10 倍交叉验证评估分类器时,我使用多层感知器分类器成功为 300 个样本查询集正确分类的实例得分为 78%,我认为这相当不错。
使用 weka java 库,我将整个事情实现为 java 代码,因此我可以编写一个程序,动态地将查询提供给分类器并检索其查询类型。我成功地实现了整个分类器训练部分。下一步是使用classifyInstance() 或distributionForInstance() 来确定查询所属的类。
然而,classifyInstance() 只返回一个 double 值,我不知道如何从中获取实际的查询类型。 weka wikispaces告诉我我可以使用unlabeled.classAttribute().value((int) clsLabel);
在调用classifyInstance()来获取类的字符串表示形式之后,在我的情况下,这似乎总是返回空字符串。
使用 distributionForInstance(),我能够成功检索包含 0 到 1 之间的八个 double 值的数组(这很好,因为我将其分为八种查询类型)。然而,这个数组的顺序是怎样的呢?结果数组中的第一个元素是我的训练文件中出现的第一个类吗?或者此结果数组中是否还有其他预定义的元素顺序(例如按字母顺序)? weka documentation没有提供任何相关信息。
希望有人能帮助我!
最佳答案
在内部,Weka 将所有值作为 double 处理。创建属性
时,您向其传递一个列出可能标称值的字符串数组。分类返回的 double 值是原始数组中所选属性的索引。因此,如果您的代码如下所示:
String[] attributeValues = {"a", "b", "c"};
Attribute a = new Attribute("attributeName", attributeValues);
和 classifyInstance()
返回 2
,那么它选择的类将为 attributeValues[2]
或 c
>.
使用 distributionForInstance()
方法,两个数组的索引匹配,因此 attributeValues[0]
是返回的数组第一个元素的字符串名称。
更新(因为否决) 如果您让 weka 自己创建 Instances 对象(例如,如果您正在读取 arff 文件),则上述方法将不起作用。考虑到您的问题,情况似乎并非如此,但如果是,请发布代码,以便我们了解发生了什么。
关于machine-learning - Weka java库: how to get string representation of classified instance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10684852/