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 对实例进行分类时,会引发此异常。