source: orange/Orange/OrangeWidgets/Regression/OWLinearRegression.py @ 10483:1ba273736b89

Revision 10483:1ba273736b89, 8.0 KB checked in by Lan Zagar <lan.zagar@…>, 2 years ago (diff)

Changed lambda from int to float in Linear Regression widget.

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