Changeset 132 for trunk


Ignore:
Timestamp:
06/28/16 12:01:39 (8 years ago)
Author:
sherbold
Message:
  • rather intrusive and large change to correctly evaluate AUCEC in case metrics are modified. The effort is now stored directly with a software version and it is the duty of the loader to specify the review effort for each instance. This required changes to the execution strategiey, data loading, and evaluation process.
Location:
trunk/CrossPare/src/de/ugoe/cs/cpdp
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/AbstractWekaEvaluation.java

    r118 r132  
    9292                      Instances traindata, 
    9393                      List<ITrainer> trainers, 
     94                      List<Double> efforts,  
    9495                      boolean writeHeader, 
    9596                      List<IResultStorage> storages) 
     
    150151                eval.numFalsePositives(1) / (eval.numFalsePositives(1) + eval.numTrueNegatives(1)); 
    151152            double gmeasure = 2 * eval.recall(1) * (1.0 - pf) / (eval.recall(1) + (1.0 - pf)); 
    152             double aucec = calculateReviewEffort(testdata, classifier); 
     153            double aucec = calculateReviewEffort(testdata, classifier, efforts); 
    153154            double succHe = eval.recall(1) >= 0.7 && eval.precision(1) >= 0.5 ? 1.0 : 0.0; 
    154155            double succZi = eval.recall(1) >= 0.7 && eval.precision(1) >= 0.7 ? 1.0 : 0.0; 
     
    208209        output.flush(); 
    209210    } 
    210  
     211     
     212    private double calculateReviewEffort(Instances testdata, Classifier classifier, List<Double> efforts) { 
     213        if( efforts==null ) { 
     214            return 0; 
     215        } 
     216         
     217        final List<Integer> bugPredicted = new ArrayList<>(); 
     218        final List<Integer> nobugPredicted = new ArrayList<>(); 
     219        double totalLoc = 0.0d; 
     220        int totalBugs = 0; 
     221        for (int i = 0; i < testdata.numInstances(); i++) { 
     222            try { 
     223                if (Double.compare(classifier.classifyInstance(testdata.instance(i)), 0.0d) == 0) { 
     224                    nobugPredicted.add(i); 
     225                } 
     226                else { 
     227                    bugPredicted.add(i); 
     228                } 
     229            } 
     230            catch (Exception e) { 
     231                throw new RuntimeException( 
     232                                           "unexpected error during the evaluation of the review effort", 
     233                                           e); 
     234            } 
     235            if (Double.compare(testdata.instance(i).classValue(), 1.0d) == 0) { 
     236                totalBugs++; 
     237            } 
     238            totalLoc += efforts.get(i); 
     239        } 
     240 
     241        final List<Double> reviewLoc = new ArrayList<>(testdata.numInstances()); 
     242        final List<Double> bugsFound = new ArrayList<>(testdata.numInstances()); 
     243 
     244        double currentBugsFound = 0; 
     245 
     246        while (!bugPredicted.isEmpty()) { 
     247            double minLoc = Double.MAX_VALUE; 
     248            int minIndex = -1; 
     249            for (int i = 0; i < bugPredicted.size(); i++) { 
     250                double currentLoc = efforts.get(bugPredicted.get(i)); 
     251                if (currentLoc < minLoc) { 
     252                    minIndex = i; 
     253                    minLoc = currentLoc; 
     254                } 
     255            } 
     256            if (minIndex != -1) { 
     257                reviewLoc.add(minLoc / totalLoc); 
     258 
     259                currentBugsFound += testdata.instance(bugPredicted.get(minIndex)).classValue(); 
     260                bugsFound.add(currentBugsFound); 
     261 
     262                bugPredicted.remove(minIndex); 
     263            } 
     264            else { 
     265                throw new RuntimeException("Shouldn't happen!"); 
     266            } 
     267        } 
     268 
     269        while (!nobugPredicted.isEmpty()) { 
     270            double minLoc = Double.MAX_VALUE; 
     271            int minIndex = -1; 
     272            for (int i = 0; i < nobugPredicted.size(); i++) { 
     273                double currentLoc = efforts.get(nobugPredicted.get(i)); 
     274                if (currentLoc < minLoc) { 
     275                    minIndex = i; 
     276                    minLoc = currentLoc; 
     277                } 
     278            } 
     279            if (minIndex != -1) { 
     280                reviewLoc.add(minLoc / totalLoc); 
     281 
     282                currentBugsFound += testdata.instance(nobugPredicted.get(minIndex)).classValue(); 
     283                bugsFound.add(currentBugsFound); 
     284                nobugPredicted.remove(minIndex); 
     285            } 
     286            else { 
     287                throw new RuntimeException("Shouldn't happen!"); 
     288            } 
     289        } 
     290 
     291        double auc = 0.0; 
     292        for (int i = 0; i < bugsFound.size(); i++) { 
     293            auc += reviewLoc.get(i) * bugsFound.get(i) / totalBugs; 
     294        } 
     295 
     296        return auc; 
     297    } 
     298 
     299    @SuppressWarnings("unused") 
     300    @Deprecated 
    211301    private double calculateReviewEffort(Instances testdata, Classifier classifier) { 
    212302 
  • trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/IEvaluationStrategy.java

    r86 r132  
    4646               Instances traindata, 
    4747               List<ITrainer> trainers, 
     48               List<Double> efforts, 
    4849               boolean writeHeader, 
    4950               List<IResultStorage> storages); 
  • trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/AbstractCrossProjectExperiment.java

    r123 r132  
    178178                // Setup testdata and training data 
    179179                Instances testdata = testVersion.getInstances(); 
     180                List<Double> efforts = testVersion.getEfforts(); 
    180181                SetUniqueList<Instances> traindataSet = 
    181182                    SetUniqueList.setUniqueList(new LinkedList<Instances>()); 
     
    311312                            config.getExperimentName() + ".csv"); 
    312313                    } 
    313                     evaluator.apply(testdata, traindata, allTrainers, writeHeader, 
     314                    evaluator.apply(testdata, traindata, allTrainers, efforts, writeHeader, 
    314315                                    config.getResultStorages()); 
    315316                    writeHeader = false; 
  • trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/ClassifierCreationExperiment.java

    r86 r132  
    101101            Instances testdata = testVersion.getInstances(); 
    102102            Instances traindata = new Instances(testdata); 
     103            List<Double> efforts = testVersion.getEfforts(); 
    103104 
    104105            // Give the dataset a new name 
     
    168169                        config.getExperimentName() + ".csv"); 
    169170                } 
    170                 evaluator.apply(testdata, traindata, allTrainers, writeHeader, config.getResultStorages()); 
     171                evaluator.apply(testdata, traindata, allTrainers, efforts, writeHeader, config.getResultStorages()); 
    171172                writeHeader = false; 
    172173            } 
  • trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/CrossValidationExperiment.java

    r122 r132  
    166166                // Setup testdata and training data 
    167167                Instances testdata = testVersion.getInstances(); 
     168                List<Double> efforts = testVersion.getEfforts(); 
    168169                 
    169170                for (ITrainingStrategy trainer : config.getTrainers()) { 
     
    205206                            config.getExperimentName() + ".csv"); 
    206207                    } 
    207                     evaluator.apply(testdata, testdata, allTrainers, writeHeader, 
     208                    evaluator.apply(testdata, testdata, allTrainers, efforts, writeHeader, 
    208209                                    config.getResultStorages()); 
    209210                    writeHeader = false; 
  • trunk/CrossPare/src/de/ugoe/cs/cpdp/loader/AbstractFolderLoader.java

    r86 r132  
    1616 
    1717import java.io.File; 
     18import java.util.ArrayList; 
    1819import java.util.LinkedList; 
    1920import java.util.List; 
    2021 
     22import weka.core.Attribute; 
    2123import weka.core.Instances; 
    2224 
     
    6668                            Instances data = instancesLoader.load(versionFile); 
    6769                            String versionName = data.relationName(); 
    68                             versions.add(new SoftwareVersion(projectName, versionName, data)); 
     70                            List<Double> efforts = getEfforts(data);  
     71                            versions.add(new SoftwareVersion(projectName, versionName, data, efforts)); 
    6972                        } 
    7073                    } 
     
    7376        } 
    7477        return versions; 
     78    } 
     79     
     80    private List<Double> getEfforts(Instances data) { 
     81        // attribute in the JURECZKO data and default 
     82        Attribute effortAtt = data.attribute("loc"); 
     83        if (effortAtt == null) { 
     84            // attribute in the NASA/SOFTMINE/MDP data 
     85            effortAtt = data.attribute("LOC_EXECUTABLE"); 
     86        } 
     87        if (effortAtt == null) { 
     88            // attribute in the AEEEM data 
     89            effortAtt = data.attribute("numberOfLinesOfCode"); 
     90        } 
     91        if (effortAtt == null) { 
     92            // attribute in the RELINK data 
     93            effortAtt = data.attribute("CountLineCodeExe"); 
     94        } 
     95        if( effortAtt == null ) { 
     96            return null; 
     97        } 
     98        List<Double> efforts = new ArrayList<>(data.size()); 
     99        for( int i=0; i<data.size(); i++ ) { 
     100            efforts.add(data.get(i).value(effortAtt)); 
     101        } 
     102        return efforts; 
    75103    } 
    76104 
  • trunk/CrossPare/src/de/ugoe/cs/cpdp/loader/DecentFolderLoader.java

    r86 r132  
    104104            String versionName = versionFile.getName(); 
    105105            Instances data = instancesLoader.load(versionFile); 
    106             versions.add(new SoftwareVersion(projectName, versionName, data)); 
     106            versions.add(new SoftwareVersion(projectName, versionName, data, null)); 
    107107        } 
    108108    } 
  • trunk/CrossPare/src/de/ugoe/cs/cpdp/versions/SoftwareVersion.java

    r86 r132  
    1414 
    1515package de.ugoe.cs.cpdp.versions; 
     16 
     17import java.util.List; 
    1618 
    1719import weka.core.Instances; 
     
    3840     */ 
    3941    private final Instances instances; 
     42     
     43    /** 
     44     * Review effort per instance.  
     45     */ 
     46    private final List<Double> efforts; 
    4047 
    4148    /** 
     
    4956     *            data of the version 
    5057     */ 
    51     public SoftwareVersion(String project, String version, Instances instances) { 
     58    public SoftwareVersion(String project, String version, Instances instances, List<Double> efforts) { 
    5259        this.project = project; 
    5360        this.version = version; 
    5461        this.instances = instances; 
     62        this.efforts = efforts; 
    5563    } 
    56  
     64     
    5765    /** 
    5866     * returns the project name 
     
    8189        return new Instances(instances); 
    8290    } 
     91     
     92    /** 
     93     * <p> 
     94     * returns the review effort of the version 
     95     * </p> 
     96     * 
     97     * @return 
     98     */ 
     99    public List<Double> getEfforts() { 
     100        return efforts; 
     101    } 
    83102 
    84103    /** 
Note: See TracChangeset for help on using the changeset viewer.