2016-01-25 2 views
0

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

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

ответ

0

Если вы хотите заменить все недостающие значения атрибутов, то вы должны использовать Remove Отсутствующие значения Fiter:

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

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

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

--edit

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

+0

Это исключение происходит, когда номинальный атрибут не имеет определенного значения, которое вы пытаетесь передать в экземпляре. –

+0

да точно, и что я хочу сделать, это установить это значение, которое я хочу передать отсутствующему (?), Поскольку оно не определено, но inputmappedclassifer должно это сделать –

+0

Показать пример ваших данных. Так определите в этом номинальном атрибуте '?' value in loadInputMappedClassifier –

Смежные вопросы