source: orange/Orange/OrangeWidgets/Regression/OWEarth.py @ 11217:adbdaf6efe02

Revision 11217:adbdaf6efe02, 4.0 KB checked in by Ales Erjavec <ales.erjavec@…>, 17 months ago (diff)

Addeed new widget icons by Peter Cuhalev and replaced existing ones with expanded paths and removed groups.

RevLine 
[9223]1"""
2<name>Earth</name>
3<description>Multivariate Adaptive Regression Splines (MARS)</description>
4<category>Regression</category>
[11217]5<icon>icons/EarthMars.svg</icon>
[9223]6<priority>100</priority>
[10776]7<tags>MARS, Multivariate, Adaptive, Regression, Splines</tags>
[9223]8"""
[8151]9
10from OWWidget import *
11import OWGUI
12import Orange
13
14from Orange.regression import earth
[8152]15from orngWrap import PreprocessedLearner
[8151]16 
17class OWEarth(OWWidget):
[8833]18    settingsList = ["name", "degree", "terms", "penalty"]
[10776]19
[8151]20    def __init__(self, parent=None, signalManager=None,
[9142]21                 title="Earth"):
[8151]22        OWWidget.__init__(self, parent, signalManager, title, wantMainArea=False)
[10776]23
24        self.inputs = [("Data", Orange.data.Table, self.set_data),
25                       ("Preprocessor", PreprocessedLearner, self.set_preprocessor)]
26
27        self.outputs = [("Learner", earth.EarthLearner, Default),
28                        ("Predictor", earth.EarthClassifier, Default),
29                        ("Basis Matrix", Orange.data.Table)]
30
[8151]31        self.name = "Earth Learner"
[8152]32        self.degree = 1
[8151]33        self.terms = 21
34        self.penalty = 2
[10776]35
[8152]36        self.loadSettings()
[10776]37
[8151]38        #####
39        # GUI
40        #####
[10776]41
[8151]42        OWGUI.lineEdit(self.controlArea, self, "name", 
43                       box="Learner/Classifier Name",
44                       tooltip="Name for the learner/predictor")
[10776]45
[8151]46        box = OWGUI.widgetBox(self.controlArea, "Forward Pass", addSpace=True)
47        OWGUI.spin(box, self, "degree", 1, 3, step=1,
48                   label="Max. term degree", 
49                   tooltip="Maximum degree of the terms derived (number of hinge functions).")
[9343]50        s = OWGUI.spin(box, self, "terms", 1, 200, step=1,
51                       label="Max. terms",
52                       tooltip="Maximum number of terms derived in the forward pass.")
53        s.control.setSpecialValueText("Automatic")
[10776]54
[9142]55        box = OWGUI.widgetBox(self.controlArea, "Pruning Pass", addSpace=True)
[8151]56        OWGUI.doubleSpin(box, self, "penalty", min=0.0, max=10.0, step=0.25,
57                   label="Knot penalty")
[10776]58
[8151]59        OWGUI.button(self.controlArea, self, "&Apply",
60                     callback=self.apply)
[10776]61
[8151]62        self.data = None
63        self.preprocessor = None
64        self.resize(300, 200)
[10776]65
[8151]66        self.apply()
[10776]67
[8151]68    def set_data(self, data=None):
69        self.data = data
[10776]70
[8151]71    def set_preprocessor(self, pproc=None):
72        self.preprocessor = pproc
[10776]73
[8151]74    def handleNewSignals(self):
75        self.apply()
[10776]76
[8151]77    def apply(self):
78        learner = earth.EarthLearner(degree=self.degree,
[9343]79                                    terms=self.terms if self.terms >= 2 else None,
[8151]80                                    penalty=self.penalty,
81                                    name=self.name)
82        predictor = None
[10776]83        basis_matrix = None
[8151]84        if self.preprocessor:
85            learner = self.preprocessor.wrapLearner(learner)
[10776]86
[8151]87        self.error(0)
88        if self.data is not None:
89            try:
90                predictor = learner(self.data)
91                predictor.name = self.name
92            except Exception, ex:
93                self.error(0, "An error during learning: %r" % ex)
[10776]94
95            if predictor is not None:     
96                base_features = predictor.base_features()
97                basis_domain = Orange.data.Domain(base_features, 
98                                                  self.data.domain.class_var)
99                basis_matrix = Orange.data.Table(basis_domain, self.data)
100
[8151]101        self.send("Learner", learner)
102        self.send("Predictor", predictor)
[10776]103        self.send("Basis Matrix", basis_matrix)
104
[9304]105    def sendReport(self):
106        self.reportSettings("Learning parameters", 
107                            [("Degree", self.degree),
[9343]108                             ("Terms", self.terms if self.terms >= 2 else "Automatic"),
[9304]109                             ("Knot penalty", "%.2f" % self.penalty)
110                             ])
111        self.reportData(self.data)
[10776]112
[8151]113if __name__ == "__main__":
114    app = QApplication(sys.argv)
115    w = OWEarth()
116    w.set_data(Orange.data.Table("auto-mpg"))
117    w.show()
118    app.exec_()
[8152]119    w.saveSettings()
Note: See TracBrowser for help on using the repository browser.