001    package jcolibri.test.test15;
002    
003    import jcolibri.cbrcore.Attribute;
004    import jcolibri.evaluation.Evaluator;
005    import jcolibri.evaluation.evaluators.SameSplitEvaluator;
006    import jcolibri.extensions.maintenance_evaluation.DetailedEvaluationReport;
007    import jcolibri.extensions.maintenance_evaluation.evaluators.MaintenanceHoldOutEvaluator;
008    import jcolibri.extensions.maintenance_evaluation.evaluators.MaintenanceSameSplitEvaluator;
009    import jcolibri.method.maintenance.algorithms.BBNRNoiseReduction;
010    import jcolibri.method.retrieve.NNretrieval.similarity.global.Average;
011    import jcolibri.method.retrieve.NNretrieval.similarity.local.Interval;
012    import jcolibri.method.reuse.classification.KNNClassificationConfig;
013    import jcolibri.method.reuse.classification.SimilarityWeightedVotingMethod;
014    
015    /**
016     * This example shows how to evaluate a dataset at the same time 
017     * with respect to its accuracy before and after maintenance. The dataset
018     * is split, and it is evaluated. Then it is edited by a maintenance algorithm,
019     * and reevaluated. The results are stored to file.
020     * 
021     * It uses a CBR application (a StandardCBRApplication implementation) 
022     * that must store its results in the DetailedEvaluationReport.
023     * 
024     * @author Lisa Cummins
025     * @version 1.0
026     * 
027     */
028    public class Test15 
029    {
030            /**
031             * Runs the example to compute accuracy before and after a case-base maintenance
032             * algorithm is run on the dataset. 
033             * @param args
034             */
035            public static void main(String[] args) 
036            {       // Configure KNN
037                    KNNClassificationConfig irisSimConfig = new KNNClassificationConfig();
038                    
039                    irisSimConfig.setDescriptionSimFunction(new Average());
040                    irisSimConfig.addMapping(new Attribute("sepalLength",IrisDescription.class), new Interval(3.6));
041                    irisSimConfig.addMapping(new Attribute("sepalWidth",IrisDescription.class), new Interval(2.4));
042                    irisSimConfig.addMapping(new Attribute("petalLength",IrisDescription.class), new Interval(5.9));
043                    irisSimConfig.addMapping(new Attribute("petalWidth", IrisDescription.class), new Interval(2.4));
044                    irisSimConfig.setClassificationMethod(new SimilarityWeightedVotingMethod());
045                    irisSimConfig.setK(3);
046                    
047                    //SwingProgressBar shows the progress
048                    jcolibri.util.ProgressController.clear();
049                    jcolibri.util.ProgressController.register(new jcolibri.test.main.SwingProgressBar(), MaintenanceSameSplitEvaluator.class);
050    
051                    int splitPercent = 30;
052                    
053                    // Example of the Same-Split Hold-Out evaluation
054                    SameSplitEvaluator split = new SameSplitEvaluator();
055                    split.init(new IrisEvaluableApp());
056                    split.generateSplit(splitPercent, "split.txt");
057    
058                    //Run the evaluation on the original dataset
059                    MaintenanceSameSplitEvaluator eval = new MaintenanceSameSplitEvaluator();
060                    eval.init(new IrisEvaluableApp());
061                    eval.HoldOutfromFile("split.txt");
062                    Double avgCost = ((DetailedEvaluationReport)(Evaluator.getEvaluationReport())).
063                            getAverageOfQueryDataSeries(IrisEvaluableApp.DATA_SERIES_NAME);
064                    Double percentAccuracy = (1.0 - avgCost) * 100;
065                    Evaluator.getEvaluationReport().putOtherData(IrisEvaluableApp.DATA_SERIES_NAME + 
066                            " Accuracy", "" + percentAccuracy + "%");
067                    
068                    // Maintain CB and re-run evaluation
069                    eval = new MaintenanceSameSplitEvaluator();
070                    eval.init(new IrisMaintainedEvaluableApp(irisSimConfig), new BBNRNoiseReduction(), irisSimConfig);
071                    eval.HoldOutfromFile("split.txt");
072                    avgCost = ((DetailedEvaluationReport)(Evaluator.getEvaluationReport())).
073                            getAverageOfQueryDataSeries(IrisMaintainedEvaluableApp.DATA_SERIES_NAME);
074                    percentAccuracy = (1.0 - avgCost) * 100;
075                    Evaluator.getEvaluationReport().putOtherData(IrisMaintainedEvaluableApp.DATA_SERIES_NAME + 
076                            " Accuracy", "" + percentAccuracy + "%");
077                    double avgPercentReduced = ((DetailedEvaluationReport)(Evaluator.getEvaluationReport())).
078                            getAverageOfDataSeries(MaintenanceHoldOutEvaluator.PERCENT_REDUCED);
079                    Evaluator.getEvaluationReport().putOtherData(IrisMaintainedEvaluableApp.DATA_SERIES_NAME + 
080                            " CB Reduction", "" + avgPercentReduced + "%");
081                    ((DetailedEvaluationReport)(Evaluator.getEvaluationReport())).
082                            removeDataSeries(MaintenanceHoldOutEvaluator.PERCENT_REDUCED);
083                    
084                    //Print the results to screen and to file
085                    System.out.println(Evaluator.getEvaluationReport());
086                    ((DetailedEvaluationReport)(Evaluator.getEvaluationReport())).printDetailedEvaluationReport(
087                            "results.txt");
088            }
089    }