/// <summary> /// Initialize an instance of the evaluator with a training set and a Weka classifier. /// </summary> /// <param name="trainingSetPath">The path of the ARFF file to be used as the training set.</param> /// <param name="classifier">The Weka classifer to be used during evaluation.</param> public WekaClassification(string trainingSetPath, Classifier classifier) { //Load Training Set from file OriginalDataset = new ConverterUtils.DataSource(trainingSetPath).getDataSet(); OriginalDataset.setClassIndex(OriginalDataset.numAttributes() - 1); //Assign classifier Classifier = classifier; }
public static double EvaluateClassifier(WekaClassifier wekaClassifier, string datasetPath) { //classifier.i Instances dataset = new ConverterUtils.DataSource(datasetPath).getDataSet(); dataset.setClassIndex(dataset.numAttributes() - 1); if (wekaClassifier.AttributesToRemove != null && wekaClassifier.AttributesToRemove.Length != 0) { dataset = GetReducedDataset(dataset, wekaClassifier.AttributesToRemove, null); } double quality = 0; //evaluate classifier performance Evaluation eval = new Evaluation(dataset); eval.evaluateModel(wekaClassifier.Classifier, dataset); //return result based on evaluation quality = eval.correct() / dataset.numInstances(); //TODO: I'm assuming that this is accuracy. If not please tell me, and I can modify it. return(quality); }
public static void ClassifyTest() { try { weka.core.Instances insts = new ConverterUtils.DataSource("weka").getDataSet(); insts.setClassIndex(insts.numAttributes() - 1); weka.classifiers.Classifier cl = new weka.classifiers.trees.J48(); Console.WriteLine("Performing " + percentSplit + "% split evaluation."); //randomize the order of the instances in the dataset. weka.filters.Filter myRandom = new weka.filters.unsupervised.instance.Randomize(); myRandom.setInputFormat(insts); insts = weka.filters.Filter.useFilter(insts, myRandom); int trainSize = insts.numInstances()*percentSplit/100; int testSize = insts.numInstances() - trainSize; weka.core.Instances train = new weka.core.Instances(insts, 0, trainSize); cl.buildClassifier(train); int numCorrect = 0; for (int i = trainSize; i < insts.numInstances(); i++) { weka.core.Instance currentInst = insts.instance(i); double predictedClass = cl.classifyInstance(currentInst); if (predictedClass == insts.instance(i).classValue()) numCorrect++; } Console.WriteLine(numCorrect + " out of " + testSize + " correct (" + (double) ((double) numCorrect/(double) testSize*100.0) + "%)"); } catch (java.lang.Exception ex) { ex.printStackTrace(); } }
/// <summary> /// Evaluates the quality of the classifier on a data set post reduction. /// </summary> /// <param name="attributesToRemove">The 0-based indices of the attributes to remove from the data set.</param> /// <param name="instancesToRemove">The 0-based indicies of the instances to remove from the data set.</param> /// <returns>Accuracy of the classifier post evaluation.</returns> public static Instances GetReducedDataset(Instances dataset, int[] attributesToRemove, int[] instancesToRemove) { #region Validation if (dataset == null) { throw new Exception("Class has not been properly initialized. Please reconstruct the class and try again."); } #endregion //build attributes filter string attributesFilterString = ""; if (attributesToRemove != null && attributesToRemove.Length > 0) { attributesFilterString = "-R "; for (int i = 0; i < attributesToRemove.Length; i++) { attributesFilterString += (attributesToRemove[i] + 1).ToString(); if (i < attributesToRemove.Length - 1) { attributesFilterString += ","; } } } //build instances filter string instancesFilterString = ""; if (instancesToRemove != null && instancesToRemove.Length > 0) { instancesFilterString = "-R "; for (int i = 0; i < instancesToRemove.Length; i++) { instancesFilterString += (instancesToRemove[i] + 1).ToString(); if (i < instancesToRemove.Length - 1) { instancesFilterString += ","; } } } //get reduced set Instances reducedDataset = new ConverterUtils.DataSource(dataset).getDataSet();//OriginalDataset; reducedDataset.setClassIndex(reducedDataset.numAttributes() - 1); if (!String.IsNullOrWhiteSpace(attributesFilterString)) { Remove attributesFilter = new Remove(); attributesFilter.setOptions(Utils.splitOptions(attributesFilterString)); attributesFilter.setInputFormat(reducedDataset); reducedDataset = Filter.useFilter(reducedDataset, attributesFilter); } if (!String.IsNullOrWhiteSpace(instancesFilterString)) { weka.filters.unsupervised.instance.RemoveRange instancesFilter = new weka.filters.unsupervised.instance.RemoveRange(); instancesFilter.setOptions(Utils.splitOptions(instancesFilterString)); instancesFilter.setInputFormat(reducedDataset); reducedDataset = Filter.useFilter(reducedDataset, instancesFilter); } return(reducedDataset); }