我有两个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
显然正在返回一个字符串。
答案 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));
创建具有字符串或名义值的(类)属性。