Changeset 9275:632525b31b8c in orange


Ignore:
Timestamp:
11/25/11 18:37:23 (2 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
5e792b01205737c6db9c487d607fd2db19de77cb
Message:

GUI changes, added reportSettings.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Regression/OWSVMRegression.py

    r9231 r9275  
    1414from OWSVM import * 
    1515 
     16import Orange 
     17from Orange.classification import svm 
     18 
    1619class OWSVMRegression(OWSVM): 
    1720    def __init__(self, parent=None, signalManager=None, title="SVM Regression"): 
    18         OWSVM.__init__(self, parent, signalManager, title) 
    19          
    20         self.inputs=[("Example Table", ExampleTable, self.setData), ("Preprocess", PreprocessedLearner, self.setPreprocessor)] 
    21         self.outputs=[("Learner", orange.Learner, Default),("Classifier", orange.Classifier, Default),("Support Vectors", ExampleTable)] 
    22          
    23         buttons = self.findChildren(QRadioButton) 
    24         b_parent = None 
    25         for b in buttons: 
    26             if "C-SVM" in b.text(): 
    27                 b.setText(u"ε-SVR") 
    28                 b_parent = b.parent() 
    29                 b.setToolTip("Epsilon SVR") 
    30             if u"ν-SVM" in b.text(): 
    31                 b.setText(u"ν-SVR") 
    32                 b.setToolTip("Nu SVR") 
    33          
    34         if b_parent: 
    35             grid = b_parent.layout() 
    36             for i in range(3): 
    37                 item = grid.itemAtPosition(1, i) 
    38                 widget = item.widget() 
    39                 index = grid.indexOf(widget) 
    40                 grid.takeAt(index) 
    41                 if i == 1: 
    42                     grid.addWidget(widget, 2, i, Qt.AlignRight) 
    43                 else: 
    44                     grid.addWidget(widget, 2, i) 
    45              
    46             grid.addWidget(QLabel(u"Loss Epsilon (ε)", b_parent), 1, 1, Qt.AlignRight) 
    47             epsilon = OWGUI.doubleSpin(b_parent, self, "p", 0.05, 1.0, 0.05, 
    48                         addToLayout=False, 
    49                         callback=lambda *x: self.setType(0), 
    50                         alignment=Qt.AlignRight) 
    51             grid.addWidget(epsilon, 1, 2) 
    52          
    53         self.probability = False 
    54         self.probBox.hide() 
     21        OWWidget.__init__(self, parent, signalManager, title, wantMainArea=False) 
     22         
     23        self.inputs=[("Data", Orange.data.Table, self.setData),  
     24                     ("Preprocess", PreprocessedLearner, self.setPreprocessor)] 
     25         
     26        self.outputs=[("Learner", orange.Learner, Default), 
     27                      ("Predictor", orange.Classifier, Default), 
     28                      ("Support Vectors", Orange.data.Table)] 
     29 
     30        ########## 
     31        # Settings 
     32        ########## 
     33        self.kernel_type = 2 
     34        self.gamma = 0.0 
     35        self.coef0 = 0.0 
     36        self.degree = 3 
     37        self.C = 1.0 
     38        self.p = 0.1 
     39        self.eps = 1e-3 
     40        self.nu = 0.5 
     41        self.shrinking = 1 
     42        self.probability=1 
     43        self.useNu=0 
     44        self.nomogram=0 
     45        self.normalization=1 
     46        self.data = None 
     47        self.selFlag=False 
     48        self.preprocessor = None 
     49        self.name="SVM Regression" 
     50         
     51        self.loadSettings() 
     52 
     53         
     54        OWGUI.lineEdit(self.controlArea, self, 'name', box='Learner/predictor Name', 
     55                       tooltip='Name to be used by other widgets to identify your learner/predictor.') 
     56        OWGUI.separator(self.controlArea) 
     57 
     58        b = OWGUI.radioButtonsInBox(self.controlArea, self, "useNu", [],  
     59                                    box="SVM Type",  
     60                                    orientation = QGridLayout(),  
     61                                    addSpace=True) 
     62         
     63        # Epsilon SVR 
     64        b.layout().addWidget(OWGUI.appendRadioButton(b, self,  
     65                                                "useNu", u"ε-SVR", 
     66                                                tooltip="Epsilon SVR", 
     67                                                addToLayout=False), 
     68                             0, 0, Qt.AlignLeft) 
     69         
     70        b.layout().addWidget(QLabel("Cost (C)", b), 0, 1, Qt.AlignRight) 
     71        b.layout().addWidget(OWGUI.doubleSpin(b, self, "C", 0.5, 512.0, 0.5,  
     72                          addToLayout=False,  
     73                          callback=lambda *x: self.setType(0),  
     74                          alignment=Qt.AlignRight, 
     75                          tooltip="Cost for out of epsilon training points."), 
     76                          0, 2) 
     77         
     78        b.layout().addWidget(QLabel(u"Loss Epsilon (ε)", b), 1, 1, Qt.AlignRight) 
     79        b.layout().addWidget(OWGUI.doubleSpin(b, self, "p", 0.05, 1.0, 0.05, 
     80                                      addToLayout=False, 
     81                                      callback=lambda *x: self.setType(0), 
     82                                      alignment=Qt.AlignRight, 
     83                                      tooltip="Epsilon bound (all points inside this interval are not penalized)." 
     84                                      ), 
     85                             1, 2) 
     86         
     87        # Nu SVR 
     88        b.layout().addWidget(OWGUI.appendRadioButton(b, self,  
     89                                                "useNu", u"ν-SVR", 
     90                                                tooltip="Nu SVR", 
     91                                                addToLayout=False), 
     92                             2, 0, Qt.AlignLeft) 
     93         
     94        b.layout().addWidget(QLabel("Cost (C)", b),  
     95                             2, 1, Qt.AlignRight) 
     96        b.layout().addWidget(OWGUI.doubleSpin(b, self, "C", 0.5, 512.0, 0.5,  
     97                        addToLayout=False,  
     98                        callback=lambda *x: self.setType(0),  
     99                        alignment=Qt.AlignRight, 
     100                        tooltip="Cost for out of epsilon training points."), 
     101                        2, 2) 
     102         
     103        b.layout().addWidget(QLabel(u"Complexity bound (\u03bd)", b), 
     104                             3, 1, Qt.AlignRight) 
     105        b.layout().addWidget(OWGUI.doubleSpin(b, self, "nu", 0.1, 1.0, 0.1, 
     106                        tooltip="Lower bound on the ratio of support vectors", 
     107                        addToLayout=False,  
     108                        callback=lambda *x: self.setType(1),  
     109                        alignment=Qt.AlignRight), 
     110                        3, 2) 
     111         
     112        # Kernel 
     113        self.kernelBox=b = OWGUI.widgetBox(self.controlArea, "Kernel") 
     114        self.kernelradio = OWGUI.radioButtonsInBox(b, self, "kernel_type",  
     115                                btnLabels=[u"Linear,   x∙y",  
     116                                           u"Polynomial,   (g x∙y + c)^d", 
     117                                           u"RBF,   exp(-g|x-y|²)",  
     118                                           u"Sigmoid,   tanh(g x∙y + c)"], 
     119                                callback=self.changeKernel) 
     120 
     121        OWGUI.separator(b) 
     122        self.gcd = OWGUI.widgetBox(b, orientation="horizontal") 
     123        self.leg = OWGUI.doubleSpin(self.gcd, self, "gamma", 0.0, 10.0, 0.0001, 
     124                                    label="  g: ", orientation="horizontal", 
     125                                    callback=self.changeKernel,  
     126                                    alignment=Qt.AlignRight) 
     127         
     128        self.led = OWGUI.doubleSpin(self.gcd, self, "coef0", 0.0, 10.0, 0.0001, 
     129                                    label="  c: ", orientation="horizontal",  
     130                                    callback=self.changeKernel,  
     131                                    alignment=Qt.AlignRight) 
     132         
     133        self.lec = OWGUI.doubleSpin(self.gcd, self, "degree", 0.0,10.0,0.5,  
     134                                    label="  d: ", orientation="horizontal",  
     135                                    callback=self.changeKernel,  
     136                                    alignment=Qt.AlignRight) 
     137 
     138        OWGUI.separator(self.controlArea) 
     139         
     140        self.optionsBox=b=OWGUI.widgetBox(self.controlArea, "Options", addSpace=True) 
     141         
     142        OWGUI.doubleSpin(b,self, "eps", 0.0005, 1.0, 0.0005,  
     143                         label=u"Numerical tolerance",  
     144                         labelWidth = 180,  
     145                         orientation="horizontal", 
     146                         tooltip="Numerical tolerance of termination criterion.",  
     147                         alignment=Qt.AlignRight) 
     148 
     149        OWGUI.checkBox(b, self, "normalization",  
     150                       label="Normalize data",  
     151                       tooltip="Use data normalization") 
     152 
     153        self.paramButton = OWGUI.button(self.controlArea, self, 
     154                                         "Automatic parameter search",  
     155                                         callback=self.parameterSearch, 
     156                                         tooltip="Automatically searches for parameters that optimize classifier accuracy",  
     157                                         debuggingEnabled=0) 
     158         
     159        self.paramButton.setDisabled(True) 
     160 
     161        OWGUI.button(self.controlArea, self,"&Apply",  
     162                     callback=self.applySettings,  
     163                     default=True) 
     164         
     165        OWGUI.rubber(self.controlArea) 
     166         
     167         
     168        self.changeKernel() 
     169        self.searching=False 
     170        self.applySettings() 
     171 
     172    def setData(self, data=None): 
     173        self.data = self.isDataWithClass(data,  
     174                    wantedVarType=Orange.core.VarTypes.Continuous, 
     175                    checkMissing=True) and data or None 
     176        self.paramButton.setDisabled(not self.data) 
     177         
     178    def applySettings(self): 
     179        learner = svm.SVMLearner(svm_type=svm.SVMLearner.Nu_SVR  
     180                                          if self.useNu else 
     181                                          svm.SVMLearner.Epsilon_SVR, 
     182                                 C=self.C, 
     183                                 p=self.p, 
     184                                 nu=self.nu, 
     185                                 kernel_type=self.kernel_type, 
     186                                 gamma=self.gamma, 
     187                                 degree=self.degree, 
     188                                 coef0=self.coef0, 
     189                                 eps=self.eps, 
     190                                 probability=self.probability, 
     191                                 normalization=self.normalization, 
     192                                 name=self.name) 
     193        predictor = None 
     194        support_vectors = None 
     195        if self.preprocessor: 
     196            learner = self.preprocessor.wrapLearner(learner) 
     197         
     198        if self.data is not None: 
     199            predictor = learner(self.data) 
     200            support_vectors = predictor.support_vectors 
     201             
     202        self.send("Learner", learner) 
     203        self.send("Predictor", predictor) 
     204        self.send("Support Vectors", support_vectors) 
     205         
     206    def sendReport(self): 
     207        if self.useNu: 
     208            settings = [("Type", "Nu SVM regression"), 
     209                        ("Cost (C)", "%.3f" % self.C), 
     210                        ("Complexity bound (nu)", "%.2f" % self.nu)] 
     211        else: 
     212            settings = [("Type", "Epsilon SVM regression"), 
     213                        ("Cost (C)", "%.3f" % self.C), 
     214                        ("Loss epsilon", "%.3f" % self.p)] 
     215             
     216        if self.kernel_type == 0: 
     217            kernel = "Linear, x.y" 
     218        elif self.kernel_type == 1: 
     219            kernel = "Polynomial, (%.4f*x.y+%.4f)<sup>%.4f</sup>" % (self.gamma, self.coef0, self.degree) 
     220        elif self.kernel_type == 2: 
     221            kernel = "RBF, e<sup>-%.4f*(x-y).(x-y)</sup>" % self.gamma 
     222        else: 
     223            kernel = "Sigmoid, tanh(%.4f*x.y+%.4f)" % (self.gamma, self.coef0) 
     224             
     225        settings.extend([("Kernel", kernel), 
     226                         ("Tolerance", self.eps), 
     227                         ("Normalize data", OWGUI.YesNo[self.normalization])]) 
     228         
     229             
     230        self.reportSettings("Settings", settings) 
     231        self.reportData(self.data) 
     232             
    55233         
    56234if __name__ == "__main__": 
     
    58236    w = OWSVMRegression() 
    59237    w.show() 
     238    data = Orange.data.Table("housing") 
     239    w.setData(data) 
    60240    app.exec_() 
Note: See TracChangeset for help on using the changeset viewer.