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.
File:
1 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 
Note: See TracChangeset for help on using the changeset viewer.