machine-learning - Weka java库: how to get string representation of classified instance?

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

目前,我正在开展一个项目,将搜索查询分为以下八种类型:{运动员、 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/

相关文章:

weka - 关于Weka中的RandomTree

machine-learning - 神经网络学习悬停。时间延误?

nlp - TF-IDF 和余弦相似度的替代方案(比较不同格式的文档)

stream - 流数据的标准化方法

machine-learning - 为什么信息增益特征选择给出零分

machine-learning - 为什么weka中的多层感知器有阈值

r - 提取插入符号中 glmnet 模型最佳调整参数的系数

python - 医院等候时间的情绪分析

python-3.x - Tensorflow seq2seq回归模型

python - 存储文本挖掘数据