我制作了一个分类器,将搜索查询分类为以下类别之一:{艺术家、演员、政治家、运动员、设施、地理、定义、质量保证}。我有两个 csv 文件:一个用于训练分类器(包含 300 个查询),另一个用于测试分类器(目前包含大约 200 个查询)。当我使用训练集和测试集通过 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 然后抛出一个异常,即这些值不是为名义属性预定义的。