source: orange/Orange/OrangeWidgets/Regression/OWLinearRegression.py @ 10156:6726b609e76c

Revision 10156:6726b609e76c, 7.9 KB checked in by markotoplak, 2 years ago (diff)

Fixed changes from data.variable -> feature in some widgets.

Line 
1"""
2<name>Linear Regression</name>
3<description>Linear Regression</name>
4<icon>icons/LinearRegression.png</icon>
5<priority>10</priority>
6<category>Regression</category>
7<keywords>linear, model, ridge, regression, lasso, least, absolute, shrinkage</keywords>
8
9"""
10
11import os, sys
12from OWWidget import *
13
14import Orange
15from Orange.regression import linear, lasso
16from orngWrap import PreprocessedLearner
17from Orange import feature as variable
18
19class OWLinearRegression(OWWidget):
20    settingsList = ["name", "use_ridge", "ridge_lambda", 
21                    "use_lasso", "t", "tol"]
22   
23    def __init__(self, parent=None, signalManager=None, title="Linear Regression"):
24        OWWidget.__init__(self, parent, signalManager, title, wantMainArea=False)
25       
26        self.inputs = [("Data", Orange.data.Table, self.set_data),
27                       ("Preprocessor", PreprocessedLearner, self.set_preprocessor)]
28       
29        self.outputs = [("Learner", Orange.core.Learner), 
30                        ("Predictor", Orange.core.Classifier),
31                        ("Model Statistics", Orange.data.Table)]
32       
33        ##########
34        # Settings
35        ##########
36         
37        self.name = "Linear Regression"
38        self.use_ridge = False
39        self.ridge_lambda = 1.0
40        self.use_lasso = False
41        self.t = 1.0
42        self.tol = 1e-3
43       
44        self.loadSettings()
45       
46        #####
47        # GUI
48        #####
49       
50        OWGUI.lineEdit(self.controlArea, self, "name", box="Learner/predictor name",   
51                       tooltip="Name of the learner/predictor")
52       
53        bbox = OWGUI.radioButtonsInBox(self.controlArea, self, "use_lasso", [], 
54                                       box=None,
55                                       callback=self.on_method_changed
56                                       )
57        rb = OWGUI.appendRadioButton(bbox, self, "use_lasso",
58                                     label="Ordinary/Ridge Linear Regression",
59                                     tooltip="",
60                                     insertInto=bbox)
61
62        self.lm_box = box = OWGUI.indentedBox(self.controlArea, 
63                                sep=OWGUI.checkButtonOffsetHint(rb))
64        self.lm_box.setEnabled(not self.use_lasso)
65       
66        OWGUI.checkWithSpin(box, self, "Ridge lambda", 1, 10,
67                            "use_ridge", "ridge_lambda", step=1, 
68                            tooltip="Ridge lambda for ridge regression")
69       
70        rb = OWGUI.appendRadioButton(bbox, self, "use_lasso",
71                                     label="LASSO Regression",
72                                     tooltip="",
73                                     insertInto=bbox)
74       
75        self.lasso_box = box = OWGUI.indentedBox(self.controlArea, 
76                                sep=OWGUI.checkButtonOffsetHint(rb))
77        self.lasso_box.setEnabled(self.use_lasso)       
78       
79        OWGUI.doubleSpin(box, self, "t", 0.0, 1e4, 0.1,
80                         label="Lasso bound",
81                         tooltip="Tuning parameter, upper bound for the L1-norm of the regression coefficients",
82                         )
83       
84        OWGUI.doubleSpin(box, self, "tol", 0.0, 1.0, 0.01,
85                         label="Tolerance", 
86                         tooltip="Tolerance parameter, regression coefficients (absoulute value) under tolerance are set to 0",
87                         )
88       
89        OWGUI.rubber(self.controlArea)
90       
91        OWGUI.button(self.controlArea, self, "&Apply",
92                     callback=self.apply,
93                     tooltip="Send the learner on",
94                     autoDefault=True)
95       
96        self.data = None
97        self.preprocessor = None
98        self.resize(300, 100)
99        self.apply()
100       
101    def set_data(self, data=None):
102        self.data = data
103           
104    def set_preprocessor(self, pproc=None):
105        self.preprocessor = pproc
106       
107    def handleNewSignals(self):
108        self.apply()
109           
110    def on_method_changed(self):
111        self.lm_box.setEnabled(not self.use_lasso)
112        self.lasso_box.setEnabled(self.use_lasso)
113   
114    def apply(self):
115        if self.use_lasso:
116            self.apply_lasso()
117        else:
118            self.apply_ridge()
119           
120    def apply_ridge(self):
121        if self.use_ridge:
122            learner = linear.LinearRegressionLearner(name=self.name,
123                                                ridgeLambda=self.ridge_lambda)
124        else:
125            learner = linear.LinearRegressionLearner(name=self.name)
126        predictor = None
127        if self.preprocessor:
128            learner = self.preprocessor.wrapLearner(learner)
129       
130        self.error(0)
131        if self.data is not None:
132            try:
133                predictor = learner(self.data)
134                predictor.name = self.name
135            except Exception, ex:
136                self.error(0, "An error during learning: %r" % ex)
137           
138        self.send("Learner", learner)
139        self.send("Predictor", predictor)
140        self.send("Model Statistics", self.statistics_olr(predictor))
141
142    def apply_lasso(self):
143        learner = lasso.LassoRegressionLearner(t=self.t,
144                            tol=self.tol, n_boot=0, n_perm=0,
145                            name=self.name)
146        predictor = None
147       
148        if self.preprocessor is not None:
149            learner = self.preprocessor.wrapLearner(learner)
150
151        self.error(0)
152        try:
153            if self.data is not None:
154                ll = lasso.LassoRegressionLearner(t=self.t,
155                            tol=self.tol, n_boot=10, n_perm=10)
156                predictor = ll(self.data)
157                predictor.name = self.name
158        except Exception, ex:
159            self.error(0, "An error during learning: %r" % ex)
160           
161        self.send("Learner", learner)
162        self.send("Predictor", predictor)
163        self.send("Model Statistics", self.statistics_lasso(predictor))
164       
165    def statistics_olr(self, m):
166        if m is None:
167            return None
168       
169        columns = [variable.String("Variable"),
170                   variable.Continuous("Coeff Est"),
171                   variable.Continuous("Std Error"),
172                   variable.Continuous("t-value"),
173                   variable.Continuous("p"),]
174       
175        domain = Orange.data.Domain(columns, None)
176        vars = ["Intercept"] #if m.intercept else []
177        vars.extend([a.name for a in m.domain.attributes])
178        stats = []
179        geti = lambda list, i: list[i] if list is not None else "?"
180       
181        for i, var in enumerate(vars):
182            coef = m.coefficients[i]
183            std_err = geti(m.std_error, i)
184            t_val = geti(m.t_scores, i)
185            p = geti(m.p_vals, i)
186            stats.append([var, coef, std_err, t_val, p])
187               
188        print Orange.data.Table(domain, stats)[:]
189        return Orange.data.Table(domain, stats)
190   
191    def statistics_lasso(self, m):
192        if m is None:
193            return None
194       
195        columns = [variable.String("Variable"),
196                   variable.Continuous("Coeff Est"),
197                   variable.Continuous("Std Error"),
198                   variable.Continuous("p"),]
199       
200        domain = Orange.data.Domain(columns, None)
201        vars = []
202        vars.extend([a.name for a in m.domain.attributes])
203        stats = [["Intercept", m.coef0, "?", "?"]]
204        geti = lambda list, i: list[i] if list is not None else "?"
205       
206        for i, var in enumerate(vars):
207            coef = m.coefficients[i]
208            std_err = geti(m.std_errors_fixed_t, i)
209            p = geti(m.p_vals, i)
210            stats.append([var, coef, std_err, p])
211       
212        return Orange.data.Table(domain, stats)
213       
214       
215if __name__ == "__main__":
216    app = QApplication(sys.argv)
217    w = OWLinearRegression()
218    w.set_data(Orange.data.Table("housing"))
219    w.show()
220    app.exec_()
221#    w.saveSettings()
Note: See TracBrowser for help on using the repository browser.