Weka setClassIndex和数据库

时间:2013-02-06 14:22:36

标签: java database weka

我正在使用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并覆盖前一个属性。

2 个答案:

答案 0 :(得分:0)

之前我已经问过并回答question。您需要创建一个正确的Arff标头并在查询数据库之前使用它。

答案 1 :(得分:0)

感谢您的提示。现在似乎没有优雅的解决方案。如果您可以假设您的测试数据将包含训练数据所包含的每个类,您可以修改查询:

SELECT value,classValue FROM trainset ORDER BY classValue

这是一个代码修改较少的解决方案,但性能下降:/