I need to build filtered classifier in weka multiple times on different training instances in one go. I have post the sample code to make my point clear
import weka.classifiers.meta.FilteredClassifier;
import weka.classifiers.trees.J48;
import weka.filters.unsupervised.attribute.Remove;
...
Instances train = ... // from somewhere
Instances test = ... // from somewhere
// filter
Remove rm = new Remove();
rm.setAttributeIndices("1"); // remove 1st attribute
// classifier
J48 j48 = new J48();
j48.setUnpruned(true); // using an unpruned J48
// meta-classifier
FilteredClassifier fc = new FilteredClassifier();
fc.setFilter(rm);
fc.setClassifier(j48);
// train and make predictions
fc.buildClassifier(train);
for (int i = 0; i < test.numInstances(); i++) {
double pred = fc.classifyInstance(test.instance(i));
System.out.print("ID: " + test.instance(i).value(0));
System.out.print(", actual: " + test.classAttribute().value((int) test.instance(i).classValue()));
System.out.println(", predicted: " + test.classAttribute().value((int) pred));
}
Inside the for loop after printing data to console, i need to rebuild FilteredClassifier (fc) again on another training data set. I am currently trying to do it but have no success as if i use same instance of FilteredClassifier (fc) or create a new instance of FilteredClassifier, Weka raises a NullPointerException.
How can i do what i want to do ? Do i need to use any wait() or notify() operations if FilteredClassifier creates a thread in order to suspend its operation in case i am using another Instance of FilteredClassifier ?
Here is pintStack of exception raised by JVM
java.lang.NullPointerException
at java.util.Hashtable.hash(Unknown Source)
at java.util.Hashtable.get(Unknown Source)
at weka.core.Attribute.addStringValue(Attribute.java:868)
at weka.core.StringLocator.copyStringValues(StringLocator.java:148)
at weka.core.StringLocator.copyStringValues(StringLocator.java:93)
at weka.filters.Filter.copyValues(Filter.java:364)
at weka.filters.Filter.bufferInput(Filter.java:301)
at weka.filters.unsupervised.attribute.StringToWordVector.input(StringToWordVector.java:697)
at weka.filters.Filter.useFilter(Filter.java:661)
at weka.classifiers.meta.FilteredClassifier.buildClassifier(FilteredClassifier.java:390)
i appreciate any sort of help ...