0

我制作了一个分类器,将搜索查询分类为以下类别之一:{艺术家、演员、政治家、运动员、设施、地理、定义、质量保证}。我有两个 csv 文件:一个用于训练分类器(包含 300 个查询),另一个用于测试分类器(目前包含大约 200 个查询)。当我使用训练集和测试集通过 weka 知识流训练/评估分类器时,大多数类都达到了相当不错的准确性。Weka知识流训练/测试场景设置:

Weka 训练/测试设置

训练后,我将知识流中的 MultiLayer Perceptron 分类器保存到 classifier.model 中,我在 java 代码中使用它来对查询进行分类。

当我在 java 代码中反序列化此模型并使用它来分类知识流中测试集 CSV 文件的所有查询(使用反序列化分类器上的 distributionForInstance() 方法)时,它将所有“地理”查询分类为“设施”查询和所有“QA”查询作为“定义”查询。这让我有点吃惊,因为 ClassifierPerformanceEvaluator 向我展示了一个混淆矩阵,其中“Geo”和“QA”查询得分非常好,并且测试查询相同(使用了相同的 CSV 文件)。使用 distributionForInstance() 方法的所有其他查询分类似乎工作正常,因此显示了查看知识流中的混淆矩阵时可以预期的行为。

我能想到的一件事如下: testing-CSV 文件在其他属性中包含许多全大写形式的标称值属性。当我在 java 代码中打印出分类之前实例的所有属性的值时,这些值似乎被转换为小写字母(似乎 DataSource.getDataSet() 方法的行为是这样的)。难道这些属性的大小写是我的测试CSV文件的某些实例被分类不同的原因吗?我在 Weka 规范中读到,标称值属性区分大小写。不过,我在 java 文件中将这些值更改为大写,因为 weka 然后抛出一个异常,即这些值不是为名义属性预定义的。

4

1 回答 1

1

Weka 可能在知识流中使用与您的 weka 代码中相同的类来解释 csv。这就是为什么它Instances无需调整即可工作(生成匹配的数据集 - 对象 - )并且在您更改内容时失败:项目不再匹配。这就是说 weka 会一致地处理输入字符串的大小写,并且不需要您更改它。

检查您是否正在查看知识流输出中的Error on Test Data值而不是Error on Training Data值,因为鉴于您使用这些精确示例构建模型,第二个值将人为地高。您的分类器可能在两个地方都执行相同的操作,但您正在查看不同的统计数据。

于 2012-05-25T17:13:57.180 回答