weka inputmappedclassifier mappedinstance Значение не определено для данного номинального атрибута

Я использую InputMappedClassifer в weka, чтобы заменить все отсутствующие значения атрибутов отсутствующим значением ("?"), но по какой-то причине я все еще получаю значение, не определенное для данного номинального исключения атрибута, мой код выглядит следующим образом:

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 должен автоматически заполнить это значение символом ? (отсутствует значение)


person Ahmed AbuRa'ed    schedule 25.01.2016    source источник


Ответы (1)


Если вы хотите заменить все отсутствующие значения атрибутов, используйте Remove Missing Values ​​Fiter:

   public Instances removeMissingValues(Instances data) throws Exception {        
            ReplaceMissingValues replaceMissingValues = new ReplaceMissingValues();
            replaceMissingValues.setInputFormat(data);
            return Filter.useFilter(data, replaceMissingValues);
    }

но если вам нужно изменить имена некоторых значений, вы можете использовать Фильтр переименования номинальных значений

Я думаю, что вы не правильно указали свою проблему. Пожалуйста, добавьте сюда свой журнал исключений и примерную часть ваших данных.

--редактировать

Вероятно, вы помещаете новый экземпляр со значением, где номинальный атрибут не имеет этого значения. Когда вы создаете номинальный экземпляр в weka, вы должны указать номинальные значения. Например: (красный, синий, белый), но когда вы пытаетесь классифицировать экземпляр со значением = черный, возникает это исключение.

person bolec_kolec    schedule 26.01.2016
comment
Это исключение возникает, когда номинальный атрибут не имеет определенного значения, которое вы пытаетесь передать в экземпляре. - person bolec_kolec; 27.01.2016
comment
да точно, и что я хочу сделать, так это установить это значение, которое я хочу передать отсутствующему (?), поскольку оно не определено, но inputmappedclassifer должен это сделать - person Ahmed AbuRa'ed; 27.01.2016
comment
Покажите пример ваших данных. Итак, определите в этом именном атрибуте '?' значение в loadInputMappedClassifier - person bolec_kolec; 31.01.2016
comment
Я отредактировал вопрос, чтобы показать пример. Спасибо за вашу помощь и поддержку, я ценю это. - person Ahmed AbuRa'ed; 31.01.2016