WEKA — Классификация новых данных из Java — преобразование IDF

Мы пытаемся реализовать классификатор WEKA изнутри программы Java. Пока все хорошо, все работает хорошо, однако при создании классификатора из обучающего набора в графическом интерфейсе Weka мы использовали IDF-преобразование StringToWordVector, чтобы повысить точность классификации.

Как внутри Java для новых экземпляров вычислить преобразование IDF для установки каждого значения токена в новом экземпляре перед передачей экземпляра классификатору?

Базовый код выглядит так:

Instances ins = vectorize(msg);
Instances unlabeled = new Instances(train,1);
Instance inst = new Instance(unlabeled.numAttributes());

String tmp = "";

for(int i=0; i < ins.numAttributes(); i++) {
    tmp = ins.attribute(i).name();
    if(unlabeled.attribute(tmp)!=null)
      inst.setValue(unlabeled.attribute(tmp), 1.0); //TODO: Need to figure out the IDF transformed value to put here NOT 1!!
}

unlabeled.add(inst);

unlabeled.setClassIndex(classIdx);

.....cl.distributionForInstance(unlabeled.instance(i));

Итак, как мне закодировать это, чтобы я поместил правильное значение в новый экземпляр, который я хочу классифицировать?

Просто для ясности строку inst.setValue(unlabeled.attribute(tmp), 1.0); нужно изменить с 1.0 на преобразованный номер IDF...


person NightWolf    schedule 30.08.2011    source источник


Ответы (1)


Для этого вам нужно использовать FilteredClassifier. Фрагмент кода:


    StringToWordVector  strWVector = new StringToWordVector();   
    filteredClassifier fcls = new FilteredClassifier();
    fcls.setFilter(strWVector);
    fcls.setClassifier(new SMO());
    fcls.buildClassifier(yourdata)
     //rest of your code 


Это намного проще, так как вы можете передать все экземпляры сразу. Обо всех остальных деталях позаботится FilteredClassifier. Код не тестировался, но он поможет вам начать работу.

Изменить. Вы также можете сделать это следующим образом. Это фрагмент кода из учебника weka. Подробнее см. http://weka.wikispaces.com/Use+WEKA+in+your+Java+code#Filter-Filtering%20on-the-fly Пакетный режим.


Instances train = ...   // from somewhere
 Instances test = ...    // from somewhere
 Standardize filter = new Standardize();
 filter.setInputFormat(train);  // initializing the filter once with training set
 Instances newTrain = Filter.useFilter(train, filter);  // configures the Filter based on train instances and returns filtered instances
 Instances newTest = Filter.useFilter(test, filter);    // create new test se

ХТН

person iinception    schedule 01.09.2011
comment
Спасибо за отзыв. Я не думаю, что это то, что я после. У нас есть уже существующий классификатор, который мы хотим загрузить, я пытался сделать это и использовать метод set FilteredClassifer, но он жалуется на то, что формат вывода не установлен. Я предполагаю, что в качестве входных данных нужны обучающие данные... Однако, похоже, нет интерфейса для этого с помощью StringToWordVector. - person NightWolf; 02.09.2011
comment
см. правки.. вместо применения фильтра к каждому экземпляру он применяет фильтр в пакетном режиме.. - person iinception; 03.09.2011