weka inputmappedclassifier mappedinstance 未为给定的标称属性定义值
weka inputmappedclassifier mappedinstance Value not defined for given nominal attribute
我在 weka 中使用 InputMappedClassifer 将所有缺失的属性值替换为缺失值(“?”),但出于某种原因,我仍然得到 Value not defined for given nominal attribute 异常,我的代码如下:
Instance mappedInstance = inputMappedClassifier.constructMappedInstance(testData.instance(index));
clsLabel = inputMappedClassifier.classifyInstance(mappedInstance);
mappedInstance.setClassValue(clsLabel);
String key = mappedInstance.stringValue(mappedInstance.numAttributes() - 1);
注意加载inputmappedclassifier的方法是这样的:
public static InputMappedClassifier loadInputMappedClassifier(SerializedClassifier serializedClassifier, String modelName) throws Exception {
InputMappedClassifier inputMappedClassifier = new InputMappedClassifier();
inputMappedClassifier.setClassifier(serializedClassifier);
try {
inputMappedClassifier.setModelPath("src/main/resources/" + modelName + ".model");
} catch (Exception e) {
e.printStackTrace();
}
inputMappedClassifier.setModelHeader((Instances) SerializationHelper.readAll("src/main/resources/" + modelName + ".model")[1]);
inputMappedClassifier.setDebug(true);
return inputMappedClassifier;
}
异常情况如下:
java.lang.IllegalArgumentException: Value not defined for given nominal attribute!
at weka.core.AbstractInstance.setValue(AbstractInstance.java:507)
at classifiers.Verbs.loadTestInstance(Verbs.java:122)
at realizer.TestRealizer.main(TestRealizer.java:119)
我使用 java 代码创建了一个测试实例,我想使用 inputmappedclassifier 对其进行分类,但测试实例可能包含训练数据集的标称属性值中不存在的实例值,因此它将引发该异常。如果我做对了所有这些。
例如名义属性。
@attribute LemmaLast {a,o,n,e,l,y,d,s,r,t,z,u,c,b,f,p,m,é,ú,i,k,j,x,v,g,á,ó,w,.,í,h,7,q,4,+,3,0,5,9,6,2,1,!,à,ç,8}
表示词条中的最后一个字符。
测试实例的最后一个字符可以是“|”这在标称值属性中没有出现,因此 inputmappedclassifier 应该自动填充那个值? (缺失值)
如果你想替换所有缺失的属性值,那么你应该使用Remove Missing Values Fiter:
public Instances removeMissingValues(Instances data) throws Exception {
ReplaceMissingValues replaceMissingValues = new ReplaceMissingValues();
replaceMissingValues.setInputFormat(data);
return Filter.useFilter(data, replaceMissingValues);
}
但如果您需要更改某些值的名称,您可以使用重命名标称值过滤器
我认为您没有正确指出您的问题。请在此处添加您的异常日志和数据的示例部分。
--编辑
可能您在标称属性没有此值的地方放置了一个具有该值的新实例。
在 weka 中创建标称实例时,您必须指定标称值。
例如:(红、蓝、白)
但是当您尝试使用 value=black 对实例进行分类时,会引发此异常。
我在 weka 中使用 InputMappedClassifer 将所有缺失的属性值替换为缺失值(“?”),但出于某种原因,我仍然得到 Value not defined for given nominal attribute 异常,我的代码如下:
Instance mappedInstance = inputMappedClassifier.constructMappedInstance(testData.instance(index));
clsLabel = inputMappedClassifier.classifyInstance(mappedInstance);
mappedInstance.setClassValue(clsLabel);
String key = mappedInstance.stringValue(mappedInstance.numAttributes() - 1);
注意加载inputmappedclassifier的方法是这样的:
public static InputMappedClassifier loadInputMappedClassifier(SerializedClassifier serializedClassifier, String modelName) throws Exception {
InputMappedClassifier inputMappedClassifier = new InputMappedClassifier();
inputMappedClassifier.setClassifier(serializedClassifier);
try {
inputMappedClassifier.setModelPath("src/main/resources/" + modelName + ".model");
} catch (Exception e) {
e.printStackTrace();
}
inputMappedClassifier.setModelHeader((Instances) SerializationHelper.readAll("src/main/resources/" + modelName + ".model")[1]);
inputMappedClassifier.setDebug(true);
return inputMappedClassifier;
}
异常情况如下:
java.lang.IllegalArgumentException: Value not defined for given nominal attribute!
at weka.core.AbstractInstance.setValue(AbstractInstance.java:507)
at classifiers.Verbs.loadTestInstance(Verbs.java:122)
at realizer.TestRealizer.main(TestRealizer.java:119)
我使用 java 代码创建了一个测试实例,我想使用 inputmappedclassifier 对其进行分类,但测试实例可能包含训练数据集的标称属性值中不存在的实例值,因此它将引发该异常。如果我做对了所有这些。
例如名义属性。
@attribute LemmaLast {a,o,n,e,l,y,d,s,r,t,z,u,c,b,f,p,m,é,ú,i,k,j,x,v,g,á,ó,w,.,í,h,7,q,4,+,3,0,5,9,6,2,1,!,à,ç,8}
表示词条中的最后一个字符。 测试实例的最后一个字符可以是“|”这在标称值属性中没有出现,因此 inputmappedclassifier 应该自动填充那个值? (缺失值)
如果你想替换所有缺失的属性值,那么你应该使用Remove Missing Values Fiter:
public Instances removeMissingValues(Instances data) throws Exception {
ReplaceMissingValues replaceMissingValues = new ReplaceMissingValues();
replaceMissingValues.setInputFormat(data);
return Filter.useFilter(data, replaceMissingValues);
}
但如果您需要更改某些值的名称,您可以使用重命名标称值过滤器
我认为您没有正确指出您的问题。请在此处添加您的异常日志和数据的示例部分。
--编辑
可能您在标称属性没有此值的地方放置了一个具有该值的新实例。 在 weka 中创建标称实例时,您必须指定标称值。 例如:(红、蓝、白) 但是当您尝试使用 value=black 对实例进行分类时,会引发此异常。