WEKA - Классификация новых данных из Java - IDF Transform - PullRequest
2 голосов
/ 30 августа 2011

Мы пытаемся реализовать классификатор WEKA из Java-программы. Пока все хорошо, все работает хорошо, однако при построении классификатора из обучающего набора в Weka GUI мы использовали преобразование 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 ...

1 Ответ

1 голос
/ 01 сентября 2011

Для этого вам нужно использовать 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

HTH

...