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 }