Changeset 8146:fc928d00cfd1 in orange


Ignore:
Timestamp:
08/04/11 11:11:44 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
4734014add0005cbc55aa05d154264d318157f39
Message:

TestLearners widget splits the scoring for each classifier (so if one fails the rest are still computed - fixes #591).
Added split_by_classifiers function to scoring module.

Location:
orange
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • orange/Orange/evaluation/scoring.py

    r8042 r8146  
    471471    for te in res.results: 
    472472        ress[te.iterationNumber].results.append(te) 
    473     return ress     
     473    return ress 
     474 
     475def split_by_classifiers(res): 
     476    """ Splites an instance of :obj:`ExperimentResults` into a list of 
     477    :obj:`ExperimentResults`, one for each classifier.  
     478    """ 
     479    split_res = [] 
     480    for i in range(len(res.classifierNames)): 
     481        r = Orange.evaluation.testing.ExperimentResults(res.numberOfIterations, 
     482                    [res.classifierNames[i]], res.classValues, 
     483                    weights=res.weights, baseClass=res.baseClass, 
     484                    classifiers=[res.classifiers[i]] if res.classifiers else []) 
     485        r.results = [] 
     486        for te in res.results: 
     487            r.results.append(Orange.evaluation.testing.TestedExample(te.iterationNumber, 
     488                                te.actualClass, n=1, weight=te.weight)) 
     489            r.results[-1].classes = [te.classes[i]] 
     490            r.results[-1].probabilities = [te.probabilities[i]] 
     491        split_res.append(r) 
     492    return split_res 
    474493 
    475494 
  • orange/OrangeWidgets/Evaluate/OWTestLearners.py

    r8042 r8146  
    3636        self.show = show 
    3737        self.cmBased = cmBased 
     38         
     39def dispatch(score_desc, res, cm): 
     40    """ Dispatch the call to orngStat method. 
     41    """ 
     42    return eval("orngStat." + score_desc.f) 
     43 
    3844 
    3945class OWTestLearners(OWWidget): 
     
    321327            res = orngTest.learnAndTestOnTestData(learners, self.data, self.testdata, storeExamples = True, callback=pb.advance) 
    322328            pb.finish() 
     329             
    323330        if self.isclassification(): 
    324331            cm = orngStat.computeConfusionMatrices(res, classIndex = self.targetClass) 
     332        else: 
     333            cm = None 
    325334 
    326335        if self.preprocessor: # Unwrap learners  
     
    335344        self.error(range(len(self.stat))) 
    336345        scores = [] 
     346         
     347         
     348         
    337349        for i, s in enumerate(self.stat): 
    338             try: 
    339                 scores.append(eval("orngStat." + s.f)) 
    340             except Exception, ex: 
    341                 self.error(i, "An error occurred while evaluating orngStat." + s.f + "on %s due to %s" % \ 
    342                            (" ".join([l.name for l in learners]), ex.message)) 
    343                 scores.append([None] * len(self.learners)) 
     350            if s.cmBased: 
     351                try: 
     352#                    scores.append(eval("orngStat." + s.f)) 
     353                    scores.append(dispatch(s, res, cm)) 
     354                except Exception, ex: 
     355                    self.error(i, "An error occurred while evaluating orngStat." + s.f + "on %s due to %s" % \ 
     356                               (" ".join([l.name for l in learners]), ex.message)) 
     357                    scores.append([None] * len(self.learners)) 
     358            else: 
     359                scores_one = [] 
     360                for res_one in orngStat.split_by_classifiers(res): 
     361                    try: 
     362#                        scores_one.append(eval("orngStat." + s.f)[0]) 
     363                        scores_one.extend(dispatch(s, res_one, cm)) 
     364                    except Exception, ex: 
     365                        self.error(i, "An error occurred while evaluating orngStat." + s.f + "on %s due to %s" % \ 
     366                                   (res.classifierNames[0], ex.message)) 
     367                        scores_one.append(None) 
     368                scores.append(scores_one) 
    344369                 
    345         for (i, l) in enumerate(learners): 
     370        for i, l in enumerate(learners): 
    346371            self.learners[l.id].scores = [s[i] if s else None for s in scores] 
    347372             
Note: See TracChangeset for help on using the changeset viewer.