source: orange/Orange/OrangeWidgets/Classify/OWLogisticRegression.py @ 11765:1546cd04481b

Revision 11765:1546cd04481b, 6.6 KB checked in by Ales Erjavec <ales.erjavec@…>, 5 months ago (diff)

Fixed widget layouts.

Line 
1"""
2<name>Logistic Regression</name>
3<description>Logistic regression learner/classifier.</description>
4<icon>icons/LogisticRegression.svg</icon>
5<contact>Martin Mozina (martin.mozina(@at@)fri.uni-lj.si)</contact>
6<priority>15</priority>
7"""
8from OWWidget import *
9from orngLR import *
10import OWGUI
11
12from orngWrap import PreprocessedLearner
13
14class OWLogisticRegression(OWWidget):
15    settingsList = ["univariate", "name", "stepwiseLR", "addCrit", "removeCrit", "numAttr", "zeroPoint", "imputation", "limitNumAttr"]
16
17    def __init__ (self, parent=None, signalManager = None, name = "Logistic regression"):
18        OWWidget.__init__(self, parent, signalManager, name, wantMainArea = 0, resizingEnabled = 0)
19
20        self.inputs = [("Data", ExampleTable, self.setData), ("Preprocess", PreprocessedLearner, self.setPreprocessor)]
21        self.outputs = [("Learner", orange.Learner), ("Classifier", orange.Classifier), ("Features", list)]
22
23        from orngTree import TreeLearner
24        imputeByModel = orange.ImputerConstructor_model()
25        imputeByModel.learnerDiscrete = TreeLearner(measure = "infoGain", minSubset = 50)
26        imputeByModel.learnerContinuous = TreeLearner(measure = "retis", minSubset = 50)
27        self.imputationMethods = [imputeByModel, orange.ImputerConstructor_average(), orange.ImputerConstructor_minimal(), orange.ImputerConstructor_maximal(), None]
28        self.imputationMethodsStr = ["Classification/Regression trees", "Average values", "Minimal value", "Maximal value", "None (skip examples)"]
29
30        self.name = "Logistic regression"
31        self.univariate = 0
32        self.stepwiseLR = 0
33        self.addCrit = 10
34        self.removeCrit = 10
35        self.numAttr = 10
36        self.limitNumAttr = False
37        self.zeroPoint = 0
38        self.imputation = 1
39
40        self.data = None
41        self.preprocessor = None
42
43        self.loadSettings()
44
45        OWGUI.lineEdit(self.controlArea, self, 'name', box='Learner/Classifier Name', tooltip='Name to be used by other widgets to identify your learner/classifier.')
46        OWGUI.separator(self.controlArea)
47
48        box = OWGUI.widgetBox(self.controlArea, "Attribute selection")
49
50        stepwiseCb = OWGUI.checkBox(box, self, "stepwiseLR", "Stepwise attribute selection")
51        ibox = OWGUI.indentedBox(box, sep=OWGUI.checkButtonOffsetHint(stepwiseCb))
52        form = QFormLayout(
53            spacing=8, fieldGrowthPolicy=QFormLayout.AllNonFixedFieldsGrow,
54            labelAlignment=Qt.AlignLeft, formAlignment=Qt.AlignLeft
55        )
56        ibox.layout().addLayout(form)
57
58        addCritSpin = OWGUI.spin(
59            ibox, self, "addCrit", 1, 50,
60            tooltip="Requested significance for adding an attribute"
61        )
62
63        addCritSpin.setSuffix(" %")
64
65        form.addRow("Add threshold", addCritSpin)
66
67        remCritSpin = OWGUI.spin(
68            ibox, self, "removeCrit", 1, 50,
69            tooltip="Requested significance for removing an attribute"
70        )
71        remCritSpin.setSuffix(" %")
72
73        form.addRow("Remove threshold", remCritSpin)
74
75        # Need to wrap the check box in a layout to force vertical centering
76        limitBox = OWGUI.widgetBox(ibox, "")
77        limitCb = OWGUI.checkBox(
78            limitBox, self, "limitNumAttr", "Limit number of attributes to",
79        )
80
81        limitAttSpin = OWGUI.spin(
82            ibox, self, "numAttr", 1, 100,
83            tooltip="Maximum number of attributes. Algorithm stops when it " +
84                    "selects specified number of attributes."
85        )
86
87        limitCb.disables += [limitAttSpin]
88        limitCb.makeConsistent()
89
90        form.addRow(limitBox, limitAttSpin)
91
92        stepwiseCb.disables += [ibox]
93        stepwiseCb.makeConsistent()
94
95        OWGUI.separator(self.controlArea)
96
97        self.imputationCombo = OWGUI.comboBox(self.controlArea, self, "imputation", box="Imputation of unknown values", items=self.imputationMethodsStr)
98        OWGUI.separator(self.controlArea)
99
100        applyButton = OWGUI.button(self.controlArea, self, "&Apply", callback=self.applyLearner, default=True)
101
102        OWGUI.rubber(self.controlArea)
103        #self.adjustSize()
104
105        self.applyLearner()
106
107    def sendReport(self):
108        if self.stepwiseLR:
109            step = "add at %i%%, remove at %i%%" % (self.addCrit, self.removeCrit)
110            if self.limitNumAttr:
111                step += "; allow up to %i attributes" % self.numAttr
112        else:
113            step = "No"
114        self.reportSettings("Learning parameters",
115                            [("Stepwise attribute selection", step),
116                             ("Imputation of unknown values", self.imputationMethodsStr[self.imputation])])
117        self.reportData(self.data)
118       
119
120    def applyLearner(self):
121        imputer = self.imputationMethods[self.imputation]
122        removeMissing = not imputer
123
124        if self.univariate:
125            self.learner = Univariate_LogRegLearner()
126        else:
127            self.learner = LogRegLearner(removeSingular = True, imputer = imputer, removeMissing = removeMissing,
128                                         stepwiseLR = self.stepwiseLR, addCrit = self.addCrit/100., removeCrit = self.removeCrit/100.,
129                                         numAttr = self.limitNumAttr and float(self.numAttr) or -1.0)
130
131        if self.preprocessor:
132            self.learner = self.preprocessor.wrapLearner(self.learner)
133        self.learner.name = self.name
134        self.send("Learner", self.learner)
135        self.applyData()
136
137    def applyData(self):
138        classifier = None
139
140        if self.data:
141            if self.zeroPoint:
142                classifier, betas_ap = LogRegLearner_getPriors(self.data)
143                self.error()
144                classifier.setattr("betas_ap", betas_ap)
145            else:
146                try:
147                    classifier = self.learner(self.data)
148                    self.error()
149                except orange.KernelException, (errValue):
150                    self.error("LogRegFitter error:"+ str(errValue))
151
152            if classifier:
153                classifier.setattr("data", self.data)
154                classifier.setattr("betas_ap", None)
155                classifier.name = self.name
156
157        self.send("Classifier", classifier)
158
159
160    def setData(self, data):
161        self.data = self.isDataWithClass(data, orange.VarTypes.Discrete, checkMissing=True) and data or None
162        self.applyData()
163       
164    def setPreprocessor(self, pp):
165        self.preprocessor = pp
166        self.applyLearner()
167
168
169if __name__=="__main__":
170    a=QApplication(sys.argv)
171    ow=OWLogisticRegression()
172
173    #dataset = orange.ExampleTable(r'..\..\doc\datasets\heart_disease')
174    #ow.setData(dataset)
175
176    ow.show()
177    a.exec_()
178    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.