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

How do you copy a dataset's class values in weka?

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

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 显然返回了一个字符串。

错误

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 它的 class 是什么索引,但不是那个应该是标称或字符串属性。根据 this answer 你必须做类似

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

创建具有字符串或标称值的 (class) 属性。