如何在weka中复制数据集的类值?

时间:2015-02-08 00:27:13

标签: java machine-learning weka

我有两个Instances数据集:data是原始数据集,stumpyInsts是我尝试将类值复制到的数据集。这是我的代码:

FastVector attributes = new FastVector();
ArrayList<Instance> instances = new ArrayList<Instance>();
for(int i = 0; i <= 100; i++){
    Attribute newAttr = new Attribute("Stump" + i, i);
    attributes.addElement(newAttr);
}
//make new instances
Instances stumpyInsts = new Instances("Stumps", attributes, data.numInstances());

stumpyInsts.setClassIndex(stumpyInsts.numAttributes() - 1);
Enumeration instEnum = stumpyInsts.enumerateInstances();
Enumeration somethingElseLOL = data.enumerateInstances();
while (instEnum.hasMoreElements()) {
    Instance instance = (Instance) instEnum.nextElement();
    Instance other = (Instance) somethingElseLOL.nextElement();
    String s = other.stringValue(other.classIndex());
    instance.setValue(instance.classIndex(), s);
}

当我尝试设置值时,我会继续这样做:

`java.lang.IllegalArgumentException: Attribute neither nominal nor string!
at weka.core.Instance.setValue(Instance.java:687)`

有谁知道为什么会这样?如果在将实例添加到数据集之前尝试setClassValue,或者如果我使用这些值创建新字符串,我也会收到错误。对我而言,它确实没有意义,因为stringValue显然正在返回一个字符串。

1 个答案:

答案 0 :(得分:1)

错误

java.lang.IllegalArgumentException: Attribute neither nominal nor string!
  at weka.core.Instance.setValue(Instance.java:687)

不是stringValue,而是instance的class属性。当你这样做

stumpyInsts.setClassIndex(stumpyInsts.numAttributes() - 1);

你告诉stumpyInsts它的类是什么索引,但不应该是名义或字符串属性。根据{{​​3}},您必须执行类似

的操作
FastVector classAttr = new FastVector();
classAttr .addElement(new Attribute("class", (FastVector) null));

创建具有字符串或名义值的(类)属性。