Changeset 10729:d7a63c606336 in orange


Ignore:
Timestamp:
04/03/12 15:50:01 (2 years ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
rebase_source:
10e90e8fd85d57c246d778be3f3296c00cee4b76
Message:

Separated the C parameter for nu-SVR and Epsilon-SVR. Fixed parameter search accordingly. More precise GUI controls.

File:
1 edited

Legend:

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

    r9671 r10729  
    1818 
    1919class OWSVMRegression(OWSVM): 
     20    settingsList = OWSVM.settingsList + ["C_epsilon", "C_nu"] 
     21 
    2022    def __init__(self, parent=None, signalManager=None, title="SVM Regression"): 
    2123        OWWidget.__init__(self, parent, signalManager, title, wantMainArea=False) 
    22          
     24 
    2325        self.inputs=[("Data", Orange.data.Table, self.setData),  
    2426                     ("Preprocess", PreprocessedLearner, self.setPreprocessor)] 
    25          
     27 
    2628        self.outputs=[("Learner", orange.Learner, Default), 
    2729                      ("Predictor", orange.Classifier, Default), 
     
    3537        self.coef0 = 0.0 
    3638        self.degree = 3 
    37         self.C = 1.0 
     39        self.C_epsilon = 1.0 
     40        self.C_nu = 1.0 
    3841        self.p = 0.1 
    3942        self.eps = 1e-3 
    4043        self.nu = 0.5 
    4144        self.shrinking = 1 
    42         self.probability=1 
    43         self.useNu=0 
    44         self.nomogram=0 
    45         self.normalization=1 
     45        self.probability = 1 
     46        self.useNu = 0 
     47        self.nomogram = 0 
     48        self.normalization = 1 
    4649        self.data = None 
    47         self.selFlag=False 
     50        self.selFlag = False 
    4851        self.preprocessor = None 
    4952        self.name = "SVM Regression" 
    50          
     53 
    5154        self.loadSettings() 
    5255 
    53          
    54         OWGUI.lineEdit(self.controlArea, self, 'name', box='Learner/predictor Name', 
     56        OWGUI.lineEdit(self.controlArea, self, 'name', 
     57                      box='Learner/predictor Name', 
    5558                       tooltip='Name to be used by other widgets to identify your learner/predictor.') 
    5659        OWGUI.separator(self.controlArea) 
    5760 
    5861        b = OWGUI.radioButtonsInBox(self.controlArea, self, "useNu", [],  
    59                                     box="SVM Type",  
    60                                     orientation = QGridLayout(),  
     62                                    box="SVM Type", 
     63                                    orientation = QGridLayout(), 
    6164                                    addSpace=True) 
    62          
     65 
    6366        # Epsilon SVR 
    6467        b.layout().addWidget(OWGUI.appendRadioButton(b, self,  
     
    6972         
    7073        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        b.layout().addWidget(OWGUI.doubleSpin(b, self, "C_epsilon", 0.1, 512.0, 0.1, 
     75                          decimals=2, 
     76                          addToLayout=False, 
     77                          callback=lambda *x: self.setType(0), 
    7478                          alignment=Qt.AlignRight, 
    7579                          tooltip="Cost for out of epsilon training points."), 
    7680                          0, 2) 
    77          
     81     
    7882        b.layout().addWidget(QLabel(u"Loss Epsilon (ε)", b), 1, 1, Qt.AlignRight) 
    7983        b.layout().addWidget(OWGUI.doubleSpin(b, self, "p", 0.05, 1.0, 0.05, 
     
    8488                                      ), 
    8589                             1, 2) 
    86          
     90 
    8791        # Nu SVR 
    88         b.layout().addWidget(OWGUI.appendRadioButton(b, self,  
     92        b.layout().addWidget(OWGUI.appendRadioButton(b, self, 
    8993                                                "useNu", u"ν-SVR", 
    9094                                                tooltip="Nu SVR", 
     
    9296                             2, 0, Qt.AlignLeft) 
    9397         
    94         b.layout().addWidget(QLabel("Cost (C)", b),  
     98        b.layout().addWidget(QLabel("Cost (C)", b), 
    9599                             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),  
     100        b.layout().addWidget(OWGUI.doubleSpin(b, self, "C_nu", 0.1, 512.0, 0.1, 
     101                        decimals=2,  
     102                        addToLayout=False, 
     103                        callback=lambda *x: self.setType(1), 
    99104                        alignment=Qt.AlignRight, 
    100105                        tooltip="Cost for out of epsilon training points."), 
     
    103108        b.layout().addWidget(QLabel(u"Complexity bound (\u03bd)", b), 
    104109                             3, 1, Qt.AlignRight) 
    105         b.layout().addWidget(OWGUI.doubleSpin(b, self, "nu", 0.1, 1.0, 0.1, 
     110        b.layout().addWidget(OWGUI.doubleSpin(b, self, "nu", 0.05, 1.0, 0.05, 
    106111                        tooltip="Lower bound on the ratio of support vectors", 
    107112                        addToLayout=False,  
     
    122127        self.gcd = OWGUI.widgetBox(b, orientation="horizontal") 
    123128        self.leg = OWGUI.doubleSpin(self.gcd, self, "gamma", 0.0, 10.0, 0.0001, 
     129                                    decimals=5, 
    124130                                    label="  g: ", orientation="horizontal", 
    125131                                    callback=self.changeKernel,  
     
    177183         
    178184    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, 
     185        if self.useNu: 
     186            svm_type = svm.SVMLearner.Nu_SVR 
     187            C = self.C_nu 
     188        else: 
     189            svm_type = svm.SVMLearner.Epsilon_SVR 
     190            C = self.C_epsilon 
     191 
     192        learner = svm.SVMLearner(svm_type=svm_type, 
     193                                 C=C, 
    183194                                 p=self.p, 
    184195                                 nu=self.nu, 
     
    195206        if self.preprocessor: 
    196207            learner = self.preprocessor.wrapLearner(learner) 
    197          
     208 
    198209        if self.data is not None: 
    199210            predictor = learner(self.data) 
    200211            support_vectors = predictor.support_vectors 
    201212            predictor.name = self.name 
    202              
     213 
    203214        self.send("Learner", learner) 
    204215        self.send("Predictor", predictor) 
    205216        self.send("Support Vectors", support_vectors) 
    206          
     217 
    207218    def sendReport(self): 
    208219        if self.useNu: 
    209220            settings = [("Type", "Nu SVM regression"), 
    210                         ("Cost (C)", "%.3f" % self.C), 
    211                         ("Complexity bound (nu)", "%.2f" % self.nu)] 
     221                        ("Cost (C)", "%.3f" % self.C_nu), 
     222                        ("Complexity bound (nu)", "%.3f" % self.nu)] 
    212223        else: 
    213224            settings = [("Type", "Epsilon SVM regression"), 
    214                         ("Cost (C)", "%.3f" % self.C), 
     225                        ("Cost (C)", "%.3f" % self.C_epsilon), 
    215226                        ("Loss epsilon", "%.3f" % self.p)] 
    216              
     227 
    217228        if self.kernel_type == 0: 
    218229            kernel = "Linear, x.y" 
     
    223234        else: 
    224235            kernel = "Sigmoid, tanh(%.4f*x.y+%.4f)" % (self.gamma, self.coef0) 
    225              
     236 
    226237        settings.extend([("Kernel", kernel), 
    227238                         ("Tolerance", self.eps), 
    228239                         ("Normalize data", OWGUI.YesNo[self.normalization])]) 
    229          
    230              
     240 
    231241        self.reportSettings("Settings", settings) 
    232242        self.reportData(self.data) 
    233              
    234          
     243 
     244    def search_(self): 
     245        learner = orngSVM.SVMLearner() 
     246        for attr in ("name", "kernel_type", "degree", "shrinking", "probability", "normalization"): 
     247            setattr(learner, attr, getattr(self, attr)) 
     248 
     249        for attr in ("gamma", "coef0", "p", "eps", "nu"): 
     250            setattr(learner, attr, float(getattr(self, attr))) 
     251 
     252        if self.useNu: 
     253            learner.svm_type = learner.Nu_SVR 
     254            learner.C = self.C_nu 
     255        else: 
     256            learner.svm_type = learner.Epsilon_SVR 
     257            learner.C = self.C_epsilon 
     258 
     259        params = []         
     260        params.append("C") 
     261        if self.kernel_type in [1, 2]: 
     262            params.append("gamma") 
     263        if self.kernel_type == 1: 
     264            params.append("degree") 
     265        try: 
     266            learner.tuneParameters(self.data, params, 4, verbose=0, 
     267                                   progressCallback=self.progres) 
     268        except UnhandledException: 
     269            pass 
     270        for param in params: 
     271            setattr(self, param, getattr(learner, param)) 
     272 
     273        if self.useNu: 
     274            self.C_nu = learner.C 
     275        else: 
     276            self.C_epsilon = learner.C 
     277 
     278        self.finishSearch() 
     279 
    235280if __name__ == "__main__": 
    236281    app = QApplication([]) 
Note: See TracChangeset for help on using the changeset viewer.