Changeset 10961:e38223aa3c8a in orange


Ignore:
Timestamp:
08/03/12 10:57:10 (21 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Fixed Linear Regression widget's parameters for Lasso regression.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/Regression/OWLinearRegression.py

    r10794 r10961  
    99""" 
    1010 
    11 import os, sys 
     11import sys 
    1212from OWWidget import * 
    1313 
     
    1717from Orange import feature as variable 
    1818 
     19 
    1920class OWLinearRegression(OWWidget): 
    2021    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          
     22                    "use_lasso", "lasso_lambda", "eps"] 
     23 
     24    def __init__(self, parent=None, signalManager=None, 
     25                 title="Linear Regression"): 
     26        OWWidget.__init__(self, parent, signalManager, title, 
     27                          wantMainArea=False) 
     28 
    2629        self.inputs = [("Data", Orange.data.Table, self.set_data), 
    27                        ("Preprocessor", PreprocessedLearner, self.set_preprocessor)] 
    28          
    29         self.outputs = [("Learner", Orange.core.Learner),  
     30                       ("Preprocessor", PreprocessedLearner, 
     31                        self.set_preprocessor)] 
     32 
     33        self.outputs = [("Learner", Orange.core.Learner), 
    3034                        ("Predictor", Orange.core.Classifier), 
    3135                        ("Model Statistics", Orange.data.Table)] 
    32          
     36 
    3337        ########## 
    3438        # Settings 
    3539        ########## 
    36           
     40 
    3741        self.name = "Linear Regression" 
    3842        self.intercept = True 
     
    4044        self.ridge_lambda = 1.0 
    4145        self.use_lasso = False 
    42         self.t = 1.0 
    43         self.tol = 1e-3 
    44          
     46        self.lasso_lambda = 0.1 
     47        self.eps = 1e-6 
     48 
    4549        self.loadSettings() 
    46          
     50 
    4751        ##### 
    4852        # GUI 
    4953        ##### 
    50          
    51         OWGUI.lineEdit(self.controlArea, self, "name", box="Learner/predictor name",    
     54 
     55        OWGUI.lineEdit(self.controlArea, self, "name", 
     56                       box="Learner/predictor name", 
    5257                       tooltip="Name of the learner/predictor") 
    53          
     58 
    5459        OWGUI.checkBox(self.controlArea, self, 'intercept', 'Intercept') 
    55          
    56         bbox = OWGUI.radioButtonsInBox(self.controlArea, self, "use_lasso", [],  
     60 
     61        bbox = OWGUI.radioButtonsInBox(self.controlArea, self, "use_lasso", [], 
    5762                                       box=None, 
    5863                                       callback=self.on_method_changed 
    5964                                       ) 
     65 
    6066        rb = OWGUI.appendRadioButton(bbox, self, "use_lasso", 
    6167                                     label="Ordinary/Ridge Linear Regression", 
     
    6369                                     insertInto=bbox) 
    6470 
    65         self.lm_box = box = OWGUI.indentedBox(self.controlArea,  
    66                                 sep=OWGUI.checkButtonOffsetHint(rb)) 
     71        self.lm_box = box = OWGUI.indentedBox( 
     72            self.controlArea, sep=OWGUI.checkButtonOffsetHint(rb) 
     73            ) 
     74 
    6775        self.lm_box.setEnabled(not self.use_lasso) 
    68          
     76 
    6977        OWGUI.doubleSpin(box, self, "ridge_lambda", 0.1, 100, step=0.1, 
    7078                         label="Ridge lambda", checked="use_ridge", 
     
    7583                                     tooltip="", 
    7684                                     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        self.lasso_box = box = OWGUI.indentedBox( 
     87             self.controlArea, sep=OWGUI.checkButtonOffsetHint(rb) 
     88             ) 
     89 
     90        self.lasso_box.setEnabled(self.use_lasso) 
     91 
     92        OWGUI.doubleSpin(box, self, "lasso_lambda", 0.0, 100.0, 1e-2, 
     93                         label="Lasso lambda", 
    8594                         ) 
    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", 
     95 
     96        OWGUI.doubleSpin(box, self, "eps", 0.0, 0.01, 1e-7, 
     97                         label="Tolerance", 
     98                         tooltip="Numerical tolerance." 
    9099                         ) 
    91          
     100 
    92101        OWGUI.rubber(self.controlArea) 
    93          
     102 
    94103        OWGUI.button(self.controlArea, self, "&Apply", 
    95104                     callback=self.apply, 
    96                      tooltip="Send the learner on", 
     105                     tooltip="Send the learner/classifier on output", 
    97106                     autoDefault=True) 
    98          
     107 
    99108        self.data = None 
    100109        self.preprocessor = None 
    101110        self.resize(300, 100) 
    102111        self.apply() 
    103          
     112 
    104113    def set_data(self, data=None): 
    105114        if not self.isDataWithClass(data, Orange.core.VarTypes.Continuous,  
     
    107116            data = None 
    108117        self.data = data 
    109              
     118 
    110119    def set_preprocessor(self, pproc=None): 
    111120        self.preprocessor = pproc 
    112          
     121 
    113122    def handleNewSignals(self): 
    114123        self.apply() 
    115              
     124 
    116125    def on_method_changed(self): 
    117126        self.lm_box.setEnabled(not self.use_lasso) 
    118127        self.lasso_box.setEnabled(self.use_lasso) 
    119      
     128 
    120129    def apply(self): 
    121130        if self.use_lasso: 
     
    123132        else: 
    124133            self.apply_ridge() 
    125              
     134 
    126135    def apply_ridge(self): 
    127136        if self.use_ridge: 
     
    134143        if self.preprocessor: 
    135144            learner = self.preprocessor.wrapLearner(learner) 
    136          
     145 
    137146        self.error(0) 
    138147        if self.data is not None: 
     
    142151            except Exception, ex: 
    143152                self.error(0, "An error during learning: %r" % ex) 
    144              
     153 
    145154        self.send("Learner", learner) 
    146155        self.send("Predictor", predictor) 
     
    148157 
    149158    def apply_lasso(self): 
    150         learner = lasso.LassoRegressionLearner(t=self.t, 
    151                             tol=self.tol, n_boot=0, n_perm=0, 
    152                             name=self.name) 
     159        learner = lasso.LassoRegressionLearner( 
     160            lasso_lambda=self.lasso_lambda, eps=self.eps, 
     161            n_boot=0, n_perm=0, 
     162            name=self.name 
     163            ) 
     164 
    153165        predictor = None 
    154          
     166 
    155167        if self.preprocessor is not None: 
    156168            learner = self.preprocessor.wrapLearner(learner) 
     
    159171        try: 
    160172            if self.data is not None: 
    161                 ll = lasso.LassoRegressionLearner(t=self.t, 
    162                             tol=self.tol, n_boot=10, n_perm=10) 
     173                ll = lasso.LassoRegressionLearner( 
     174                    lasso_lambda=self.lasso_lambda, eps=self.eps, 
     175                    n_boot=10, n_perm=10 
     176                    ) 
    163177                predictor = ll(self.data) 
    164178                predictor.name = self.name 
    165179        except Exception, ex: 
    166180            self.error(0, "An error during learning: %r" % ex) 
    167              
     181 
    168182        self.send("Learner", learner) 
    169183        self.send("Predictor", predictor) 
    170184        self.send("Model Statistics", self.statistics_lasso(predictor)) 
    171          
     185 
    172186    def statistics_olr(self, m): 
    173187        if m is None: 
    174188            return None 
    175          
     189 
    176190        columns = [variable.String("Variable"), 
    177191                   variable.Continuous("Coeff Est"), 
    178192                   variable.Continuous("Std Error"), 
    179193                   variable.Continuous("t-value"), 
    180                    variable.Continuous("p"),] 
    181          
     194                   variable.Continuous("p")] 
     195 
    182196        domain = Orange.data.Domain(columns, None) 
    183197        vars = ["Intercept"] if m.intercept else [] 
     
    185199        stats = [] 
    186200        geti = lambda list, i: list[i] if list is not None else "?" 
    187          
     201 
    188202        for i, var in enumerate(vars): 
    189203            coef = m.coefficients[i] 
     
    192206            p = geti(m.p_vals, i) 
    193207            stats.append([var, coef, std_err, t_val, p]) 
    194                  
     208 
    195209        return Orange.data.Table(domain, stats) 
    196      
     210 
    197211    def statistics_lasso(self, m): 
    198212        if m is None: 
    199213            return None 
    200          
     214 
    201215        columns = [variable.String("Variable"), 
    202216                   variable.Continuous("Coeff Est"), 
    203217                   variable.Continuous("Std Error"), 
    204                    variable.Continuous("p"),] 
    205          
     218                   variable.Continuous("p")] 
     219 
    206220        domain = Orange.data.Domain(columns, None) 
    207221        vars = [] 
     
    209223        stats = [["Intercept", m.coef0, "?", "?"]] 
    210224        geti = lambda list, i: list[i] if list is not None else "?" 
    211          
     225 
    212226        for i, var in enumerate(vars): 
    213227            coef = m.coefficients[i] 
    214             std_err = geti(m.std_errors_fixed_t, i) 
     228            std_err = geti(m.std_errors, i) 
    215229            p = geti(m.p_vals, i) 
    216230            stats.append([var, coef, std_err, p]) 
    217          
     231 
    218232        return Orange.data.Table(domain, stats) 
    219          
    220          
     233 
     234 
    221235if __name__ == "__main__": 
    222236    app = QApplication(sys.argv) 
Note: See TracChangeset for help on using the changeset viewer.