Ignore:
Timestamp:
04/20/12 16:02:22 (2 years ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Added back single tree output using the simple tree converter.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/Classify/OWRandomForest.py

    r11627 r11628  
    2828 
    2929        self.outputs = [("Learner", orange.Learner), 
    30                         ("Random Forest Classifier", orange.Classifier)] 
     30                        ("Random Forest Classifier", orange.Classifier), 
     31                        ("Selected Tree", Orange.classification.tree.TreeClassifier)] 
    3132 
    3233        self.name = 'Random Forest' 
     
    3940        self.limitDepthP = 3 
    4041        self.rseed = 0 
     42        self.outtree = 0 
    4143 
    4244        self.maxTrees = 10000 
     
    8385 
    8486        OWGUI.separator(self.controlArea) 
     87 
     88        self.streesBox = OWGUI.spin(self.controlArea, self, "outtree", -1, 
     89                                    self.maxTrees, 
     90                                    orientation="horizontal", 
     91                                    label="Index of tree on the output", 
     92                                    callback=[self.period, self.extree]) 
     93        self.streeEnabled(False) 
    8594 
    8695        OWGUI.separator(self.controlArea) 
     
    155164 
    156165        #self.setLearner() 
    157  
     166        self.streeEnabled(False) 
    158167        if self.data: 
    159168            learner = self.constructLearner() 
     
    162171            try: 
    163172                self.classifier = learner(self.data) 
     173                self.streeEnabled(True) 
    164174                self.classifier.name = self.name 
    165175            except Exception, (errValue): 
     
    180190        self.setData(self.data) 
    181191 
     192    def period(self): 
     193        if self.outtree == -1: 
     194            self.outtree = self.claTrees - 1 
     195        elif self.outtree >= self.claTrees: 
     196            self.outtree = 0 
     197 
     198    def extree(self): 
     199        stc = self.classifier.classifiers[self.outtree] 
     200        if self.preprocessor: 
     201            # TODO: get the transformed data at learning step from the 
     202            # wrapped learner (or at least cache it here) 
     203            train_data = self.data.translate(self.classifier.domain) 
     204        else: 
     205            train_data = self.data 
     206 
     207        # Replay the bootstrap sampling as done by RandomForestLearner 
     208        rand = random.Random(self.claSeed) 
     209        n = len(train_data) 
     210        selection = [rand.randrange(n) 
     211                     for _ in range((self.outtree + 1) * n)] 
     212        # need the last n samples 
     213        selection = selection[-n:] 
     214        train_data = train_data.get_items_ref(selection) 
     215 
     216        tree = Orange.classification.tree._simple_tree_convert( 
     217            stc, self.classifier.domain, train_data) 
     218 
     219        self.send("Selected Tree", tree) 
     220 
     221    def streeEnabled(self, status): 
     222        if status: 
     223            self.claTrees = self.trees 
     224            self.claSeed = self.rseed 
     225            self.streesBox.setDisabled(False) 
     226            self.period() 
     227            self.extree() 
     228        else: 
     229            self.streesBox.setDisabled(True) 
     230 
    182231 
    183232if __name__ == "__main__": 
Note: See TracChangeset for help on using the changeset viewer.