Changeset 7687:ede4a15f71d2 in orange


Ignore:
Timestamp:
02/17/11 13:30:49 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
59551b64cd086ea5318141d8d3327140cc54f2e3
Message:
  • moved small tree learner construction in a helper function (used in ScoreFeature, OWRandomTree.py)
  • fixed Orange.statistics.distributions -> Orange.statistics.distribution
Location:
orange
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • orange/Orange/ensemble/forest.py

    r7664 r7687  
    44import Orange.feature.scoring 
    55import random 
     6 
     7def default_small_learner(measure=Orange.feature.scoring.Gini(), attributes=None, rand=None): 
     8    """ A helper function for constructing a small tree learner for use 
     9    in the RandomForestLearner. 
     10    :param measure: Feature scoring method for split construction 
     11    :type measure: :class:`Orange.feature.scoring.Measure` 
     12    param attributes: number of features used in a randomly drawn 
     13            subset when searching for best feature to split the node 
     14            in tree growing 
     15    :type attributes: int 
     16    :param rand: random generator used in feature subset selection in split constructor.  
     17            If None is passed, then Python's Random from random library is  
     18            used, with seed initialized to 0. 
     19    :type rand: function 
     20    """ 
     21    # tree learner assembled as suggested by Brieman (2001) 
     22    smallTreeLearner = Orange.classification.tree.TreeLearner( 
     23    storeNodeClassifier = 0, storeContingencies=0,  
     24    storeDistributions=1, minExamples=5).instance() 
     25     
     26    smallTreeLearner.split.discreteSplitConstructor.measure = measure 
     27    smallTreeLearner.split.continuousSplitConstructor.measure = measure 
     28     
     29    smallTreeLearner.split = SplitConstructor_AttributeSubset(\ 
     30            smallTreeLearner.split, attributes, rand) 
     31    return smallTreeLearner 
     32     
    633 
    734class RandomForestLearner(orange.Learner): 
     
    5683        self.attributes = attributes 
    5784        self.callback = callback 
     85         
    5886        if rand: 
    5987            self.rand = rand 
     
    78106        # If there is no learner we create our own 
    79107         
     108#        if not self.learner: 
     109#             
     110#            # tree learner assembled as suggested by Brieman (2001) 
     111#            smallTreeLearner = Orange.classification.tree.TreeLearner( 
     112#            storeNodeClassifier = 0, storeContingencies=0,  
     113#            storeDistributions=1, minExamples=5).instance() 
     114#             
     115#            # Use MSE on continuous class and Gini on discreete 
     116#            if instances.domain.class_var.var_type == Orange.data.variable.Continuous.Continuous: 
     117#                smallTreeLearner.split.discreteSplitConstructor.measure = \ 
     118#                    smallTreeLearner.split.continuousSplitConstructor.measure =\ 
     119#                        Orange.feature.scoring.MSE() 
     120#            else: 
     121#                smallTreeLearner.split.discreteSplitConstructor.measure = \ 
     122#                    smallTreeLearner.split.continuousSplitConstructor.measure =\ 
     123#                        Orange.feature.scoring.Gini() 
     124#             
     125#            smallTreeLearner.split = SplitConstructor_AttributeSubset(\ 
     126#                    smallTreeLearner.split, self.attributes, self.rand) 
     127#            self.learner = smallTreeLearner 
    80128        if not self.learner: 
    81              
    82             # tree learner assembled as suggested by Brieman (2001) 
    83             smallTreeLearner = Orange.classification.tree.TreeLearner( 
    84             storeNodeClassifier = 0, storeContingencies=0,  
    85             storeDistributions=1, minExamples=5).instance() 
    86              
    87129            # Use MSE on continuous class and Gini on discreete 
    88             if instances.domain.class_var.var_type == Orange.data.variable.Continuous.Continuous: 
    89                 smallTreeLearner.split.discreteSplitConstructor.measure = \ 
    90                     smallTreeLearner.split.continuousSplitConstructor.measure =\ 
    91                         Orange.feature.scoring.MSE() 
     130            if isinstance(instances.domain.class_var, Orange.data.variable.Discrete): 
     131                learner = default_small_learner(Orange.feature.scoring.Gini(), self.attributes, self.rand) 
    92132            else: 
    93                 smallTreeLearner.split.discreteSplitConstructor.measure = \ 
    94                     smallTreeLearner.split.continuousSplitConstructor.measure =\ 
    95                         Orange.feature.scoring.Gini() 
    96              
    97             smallTreeLearner.split = SplitConstructor_AttributeSubset(\ 
    98                     smallTreeLearner.split, self.attributes, self.rand) 
    99             self.learner = smallTreeLearner 
     133                learner = default_small_learner(Orange.feature.scoring.MSE(), self.attributes, self.rand) 
     134        else: 
     135            learner = self.learner 
    100136         
    101137        # if number of features for subset is not set, use square root 
    102         if hasattr(self.learner.split, 'attributes') and\ 
    103                     not self.learner.split.attributes: 
    104             self.learner.split.attributes = int(sqrt(\ 
     138        if hasattr(learner.split, 'attributes') and\ 
     139                    not learner.split.attributes: 
     140            learner.split.attributes = int(sqrt(\ 
    105141                    len(instances.domain.attributes))) 
    106142 
     
    117153            data = instances.getitems(selection) 
    118154            # build the model from the bootstrap sample 
    119             classifiers.append(self.learner(data)) 
     155            classifiers.append(learner(data)) 
    120156            if self.callback: 
    121157                self.callback() 
     
    181217                    prob = map(add, prob, a) 
    182218                norm = sum(prob) 
    183                 cprob = Orange.statistics.distributions.Discrete(self.classVar) 
     219                cprob = Orange.statistics.distribution.Discrete(self.classVar) 
    184220                for i in range(len(prob)): 
    185221                    cprob[i] = prob[i]/norm 
     
    211247                    a = dict(prob.items()) 
    212248                    cprob = dict( (n, a.get(n, 0)+cprob.get(n, 0)) for n in set(a)|set(cprob) ) 
    213                 cprob = Orange.statistics.distributions.Continuous(cprob) 
     249                cprob = Orange.statistics.distribution.Continuous(cprob) 
    214250                cprob.normalize() 
    215251                 
     
    254290     
    255291        if self.learner == None: 
    256           temp = RandomForestLearner(attributes=self.attributes) 
    257           self.learner = temp.learner 
     292#          temp = RandomForestLearner(attributes=self.attributes) 
     293#          self.learner = temp.learner 
     294            self.learner = default_small_learner(attributes=self.attributes) 
     295           
    258296     
    259297        if hasattr(self.learner.split, 'attributes'): 
  • orange/OrangeWidgets/Classify/OWRandomForest.py

    r6949 r7687  
    105105 
    106106        attrs = None 
    107         if self.attributes: attrs = self.attributesP 
    108  
    109         learner = orngEnsemble.RandomForestLearner(trees = self.trees, rand=rand, attributes=attrs) 
    110  
    111         if self.preNodeInst: learner.learner.stop.minExamples = self.preNodeInstP  
    112         else: learner.learner.stop.minExamples = 0 
    113  
    114         learner.learner.storeExamples = 1 
    115         learner.learner.storeNodeClassifier = 1 
    116         learner.learner.storeContingencies = 1 
    117         learner.learner.storeDistributions = 1 
    118  
    119         if self.limitDepth: learner.learner.maxDepth = self.limitDepthP 
     107        if self.attributes: 
     108            attrs = self.attributesP 
     109 
     110        smallLearner = orngEnsemble.default_small_learner(rand=rand, attributes=attrs) 
     111         
     112        if self.preNodeInst: 
     113            smallLearner.stop.minExamples = self.preNodeInstP  
     114        else: 
     115            smallLearner.stop.minExamples = 0 
     116 
     117        smallLearner.storeExamples = 1 
     118        smallLearner.storeNodeClassifier = 1 
     119        smallLearner.storeContingencies = 1 
     120        smallLearner.storeDistributions = 1 
     121 
     122        if self.limitDepth: 
     123            smallLearner.maxDepth = self.limitDepthP 
     124         
     125        learner = orngEnsemble.RandomForestLearner(learner=smallLearner,  
     126                            trees = self.trees, rand=rand, attributes=attrs) 
     127 
     128#        if self.preNodeInst: learner.learner.stop.minExamples = self.preNodeInstP  
     129#        else: learner.learner.stop.minExamples = 0 
     130# 
     131#        learner.learner.storeExamples = 1 
     132#        learner.learner.storeNodeClassifier = 1 
     133#        learner.learner.storeContingencies = 1 
     134#        learner.learner.storeDistributions = 1 
     135 
     136#        if self.limitDepth: learner.learner.maxDepth = self.limitDepthP 
    120137        if self.preprocessor: 
    121138            learner = self.preprocessor.wrapLearner(learner) 
Note: See TracChangeset for help on using the changeset viewer.