Beispiel #1
0
 /// <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;
 }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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();
            }
        }
Beispiel #4
0
        /// <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);
        }