我制作了一个分类器,将搜索查询分类为以下类之一:{Artist,Actor,Politician,Athlete,Facility,Geo,Definition,QA}。我有两个csv文件:一个用于训练分类器(包含300个查询),另一个用于测试分类器(当前包含大约200个查询)。当我使用trainingset和testset来训练/评估具有weka知识流的分类器时,大多数类都达到了非常好的准确性。 Weka知识流程培训/测试情况的设置:
训练结束后,我将MultiLayer Perceptron分类器从知识流中保存到classifier.model中,我在java代码中使用它来对查询进行分类。
当我在java代码中反序列化此模型并使用它来对知识流中的测试集CSV文件的所有查询(使用反序列化分类器上的distributionForInstance()方法)进行分类时,它将所有“Geo”查询分类为'Facility'查询和所有'QA'查询作为'定义'查询。这让我感到很惊讶,因为ClassifierPerformanceEvaluator向我展示了一个混淆矩阵,其中'Geo'和'QA'查询得分非常好,测试查询相同(使用相同的CSV文件)。使用distributionForInstance()方法的所有其他查询分类似乎正常工作,因此显示了可以预期查看知识流中的混淆矩阵的行为。有没有人知道在java代码中的distributeForInstance()方法和知识流评估结果之间的分类差异可能是什么原因?
我能想到的一件事是: 测试-CSV文件包含所有资本套管中的许多名义价值属性。当我在java代码中分类之前打印出实例的所有属性的值时,这些值似乎被转换为较低的大写字母(似乎DataSource.getDataSet()方法的行为类似于此)。可能是这些属性的大小是导致我的测试-CSV文件的某些实例被分类的不同?我在Weka规范中读到标称值属性区分大小写。我在java文件中将这些值更改为大写,因为weka会抛出一个异常,即这些值不是为名义属性预定义的。
答案 0 :(得分:1)
Weka可能在知识流程中使用与您的weka代码中相同的类来解释csv。这就是为什么它可以工作(产生匹配的数据集 - Instances
对象)而不进行调整,并且当你改变东西时失败:这些项目不再匹配。这就是说weka一直在处理输入字符串的大小写,并且不需要你更改它。
检查您是否正在查看知识流输出中的Error on Test Data
值而不是Error on Training Data
值,因为假设您使用这些确切示例构建模型,第二个值将被人为地高。您的分类器可能在两个位置执行相同的操作,但您正在查看不同的统计信息。