我正在使用Weka API的某种hello world示例。我从数据库创建实例时发现了一个问题。 情况: 我有一个包含两个表trainset(id,value,classValue)和testset(id,value,classValue)的数据库。
每个表包含10行一些示例数据,应该100%正确分类。 trainset的第一行是(1,5,“low”),testset的第一行是(1,15,“high”)。
当Weka创建 Instances 对象时,它似乎也会自动创建一个类Attribute对象。
train = query.retrieveInstances();
train.setClassIndex(train.numAttributes() - 1);
第一组的class属性是
@attribute classValue {low,high}
......以及第二次
@attribute classValue {high,low}
当我进行评估时,它会显示
Incorrectly Classified Instances 10 100 %
由混合的classValue属性引起。
有什么方法可以告诉我们类属性应该是什么样子,还是我能以某种方式改变映射? 我已经尝试过了
FastVector fvClassVal = new FastVector(2);
fvClassVal.addElement("low");
fvClassVal.addElement("high");
Attribute classAttribute = new Attribute("classValue", fvClassVal);
test.setClass(classAttribute);
但这似乎不起作用,它仍然想知道classIndex并覆盖前一个属性。
答案 0 :(得分:0)
之前我已经问过并回答question。您需要创建一个正确的Arff标头并在查询数据库之前使用它。
答案 1 :(得分:0)
感谢您的提示。现在似乎没有优雅的解决方案。如果您可以假设您的测试数据将包含训练数据所包含的每个类,您可以修改查询:
SELECT value,classValue FROM trainset ORDER BY classValue
这是一个代码修改较少的解决方案,但性能下降:/