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.

Line 
1"""
2<name>Earth</name>
3<description>Multivariate Adaptive Regression Splines (MARS)</description>
4<category>Regression</category>
5<icon>icons/EarthMars.svg</icon>
6<priority>100</priority>
7<tags>MARS, Multivariate, Adaptive, Regression, Splines</tags>
8"""
9
10from OWWidget import *
11import OWGUI
12import Orange
13
14from Orange.regression import earth
15from orngWrap import PreprocessedLearner
16 
17class OWEarth(OWWidget):
18    settingsList = ["name", "degree", "terms", "penalty"]
19
20    def __init__(self, parent=None, signalManager=None,
21                 title="Earth"):
22        OWWidget.__init__(self, parent, signalManager, title, wantMainArea=False)
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
31        self.name = "Earth Learner"
32        self.degree = 1
33        self.terms = 21
34        self.penalty = 2
35
36        self.loadSettings()
37
38        #####
39        # GUI
40        #####
41
42        OWGUI.lineEdit(self.controlArea, self, "name", 
43                       box="Learner/Classifier Name",
44                       tooltip="Name for the learner/predictor")
45
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).")
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")
54
55        box = OWGUI.widgetBox(self.controlArea, "Pruning Pass", addSpace=True)
56        OWGUI.doubleSpin(box, self, "penalty", min=0.0, max=10.0, step=0.25,
57                   label="Knot penalty")
58
59        OWGUI.button(self.controlArea, self, "&Apply",
60                     callback=self.apply)
61
62        self.data = None
63        self.preprocessor = None
64        self.resize(300, 200)
65
66        self.apply()
67
68    def set_data(self, data=None):
69        self.data = data
70
71    def set_preprocessor(self, pproc=None):
72        self.preprocessor = pproc
73
74    def handleNewSignals(self):
75        self.apply()
76
77    def apply(self):
78        learner = earth.EarthLearner(degree=self.degree,
79                                    terms=self.terms if self.terms >= 2 else None,
80                                    penalty=self.penalty,
81                                    name=self.name)
82        predictor = None
83        basis_matrix = None
84        if self.preprocessor:
85            learner = self.preprocessor.wrapLearner(learner)
86
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)
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
101        self.send("Learner", learner)
102        self.send("Predictor", predictor)
103        self.send("Basis Matrix", basis_matrix)
104
105    def sendReport(self):
106        self.reportSettings("Learning parameters", 
107                            [("Degree", self.degree),
108                             ("Terms", self.terms if self.terms >= 2 else "Automatic"),
109                             ("Knot penalty", "%.2f" % self.penalty)
110                             ])
111        self.reportData(self.data)
112
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_()
119    w.saveSettings()
Note: See TracBrowser for help on using the repository browser.