package de.ugoe.cs.cpdp.training;
import java.util.Arrays;
import java.util.logging.Level;
import de.ugoe.cs.util.console.Console;
import weka.core.OptionHandler;
import weka.classifiers.Classifier;
import weka.classifiers.meta.CVParameterSelection;
/**
* WekaBaseTraining2
*
* Allows specification of the Weka classifier and its params in the XML experiment configuration.
*
* Important conventions of the XML format:
* Cross Validation params always come last and are prepended with -CVPARAM
* Example:
*/
public abstract class WekaBaseTraining implements IWekaCompatibleTrainer {
protected Classifier classifier = null;
protected String classifierClassName;
protected String classifierName;
protected String[] classifierParams;
@Override
public void setParameter(String parameters) {
String[] params = parameters.split(" ");
// first part of the params is the classifierName (e.g. SMORBF)
classifierName = params[0];
// the following parameters can be copied from weka!
// second param is classifierClassName (e.g. weka.classifiers.functions.SMO)
classifierClassName = params[1];
// rest are params to the specified classifier (e.g. -K weka.classifiers.functions.supportVector.RBFKernel)
classifierParams = Arrays.copyOfRange(params, 2, params.length);
classifier = setupClassifier();
}
@Override
public Classifier getClassifier() {
return classifier;
}
public Classifier setupClassifier() {
Classifier cl = null;
try{
@SuppressWarnings("rawtypes")
Class c = Class.forName(classifierClassName);
Classifier obj = (Classifier) c.newInstance();
// Filter out -CVPARAM, these are special because they do not belong to the Weka classifier class as parameters
String[] param = Arrays.copyOf(classifierParams, classifierParams.length);
String[] cvparam = {};
boolean cv = false;
for ( int i=0; i < classifierParams.length; i++ ) {
if(classifierParams[i].equals("-CVPARAM")) {
// rest of array are cvparam
cvparam = Arrays.copyOfRange(classifierParams, i+1, classifierParams.length);
// before this we have normal params
param = Arrays.copyOfRange(classifierParams, 0, i);
cv = true;
break;
}
}
// set classifier params
((OptionHandler)obj).setOptions(param);
cl = obj;
// we have cross val params
// cant check on cvparam.length here, it may not be initialized
if(cv) {
final CVParameterSelection ps = new CVParameterSelection();
ps.setClassifier(obj);
ps.setNumFolds(5);
//ps.addCVParameter("I 5 25 5");
for( int i=1 ; i