📄 owroc.py
字号:
self.classCombo.setMaximumSize(150, 20)
## classifiers selection (classifiersQLB)
self.classifiersQVGB = QVGroupBox(self.generalTab)
self.classifiersQVGB.setTitle("Classifiers")
self.classifiersQLB = QListBox(self.classifiersQVGB)
self.classifiersQLB.setSelectionMode(QListBox.Multi)
self.connect(self.classifiersQLB, SIGNAL("selectionChanged()"), self.classifiersSelectionChange)
self.unselectAllClassifiersQLB = QPushButton("(Un)select all", self.classifiersQVGB)
self.connect(self.unselectAllClassifiersQLB, SIGNAL("clicked()"), self.SUAclassifiersQLB)
# show convex ROC curves and show ROC convex hull
self.convexCurvesQCB = OWGUI.checkBox(self.generalTab, self, 'ShowConvexCurves', 'Show Convex ROC Curves', tooltip='', callback=self.setShowConvexCurves)
OWGUI.checkBox(self.generalTab, self, 'ShowConvexHull', 'Show ROC Convex Hull', tooltip='', callback=self.setShowConvexHull)
self.tabs.insertTab(self.generalTab, "General")
# performance analysis
self.performanceTab = QVGroupBox(self)
self.performanceTabCosts = QVGroupBox(self.performanceTab)
OWGUI.checkBox(self.performanceTabCosts, self, 'EnablePerformance', 'Show Performance Line', tooltip='', callback=self.setShowPerformanceAnalysis)
OWGUI.checkBox(self.performanceTabCosts, self, 'DefaultThresholdPoint', 'Default Threshold (0.5) Point', tooltip='', callback=self.setShowDefaultThresholdPoint)
## FP and FN cost ranges
mincost = 1; maxcost = 1000; stepcost = 5;
self.maxpsum = 100; self.minp = 1; self.maxp = self.maxpsum - self.minp ## need it also in self.pvaluesUpdated
stepp = 1.0
OWGUI.hSlider(self.performanceTabCosts, self, 'FPcost', box='FP Cost', minValue=mincost, maxValue=maxcost, step=stepcost, callback=self.costsChanged, ticks=50)
OWGUI.hSlider(self.performanceTabCosts, self, 'FNcost', box='FN Cost', minValue=mincost, maxValue=maxcost, step=stepcost, callback=self.costsChanged, ticks=50)
ptc = OWGUI.widgetBox(self.performanceTabCosts, "Prior target class probability [%]")
OWGUI.hSlider(ptc, self, 'pvalue', minValue=self.minp, maxValue=self.maxp, step=stepp, callback=self.pvaluesUpdated, ticks=5, labelFormat="%2.1f")
OWGUI.button(ptc, self, 'Compute from data', self.setDefaultPValues) ## reset p values to default
## test set selection (testSetsQLB)
self.testSetsQVGB = QVGroupBox(self.performanceTab)
self.testSetsQVGB.setTitle("Test sets")
self.testSetsQLB = QListBox(self.testSetsQVGB)
self.testSetsQLB.setSelectionMode(QListBox.Multi)
self.connect(self.testSetsQLB, SIGNAL("selectionChanged()"), self.testSetsSelectionChange)
self.unselectAllTestSetsQLB = QPushButton("(Un)select all", self.testSetsQVGB)
self.connect(self.unselectAllTestSetsQLB, SIGNAL("clicked()"), self.SUAtestSetsQLB)
self.tabs.insertTab(self.performanceTab, "Analysis")
# settings tab
self.settingsTab = QVGroupBox(self)
OWGUI.radioButtonsInBox(self.settingsTab, self, 'AveragingMethodIndex', ['Merge (expected ROC perf.)', 'Vertical', 'Threshold', 'None'], box='Averaging ROC curves', callback=self.selectAveragingMethod)
OWGUI.hSlider(self.settingsTab, self, 'PointWidth', box='Point Width', minValue=3, maxValue=9, step=1, callback=self.setPointWidth, ticks=1)
OWGUI.hSlider(self.settingsTab, self, 'CurveWidth', box='ROC Curve Width', minValue=1, maxValue=5, step=1, callback=self.setCurveWidth, ticks=1)
OWGUI.hSlider(self.settingsTab, self, 'ConvexCurveWidth', box='ROC Convex Curve Width', minValue=1, maxValue=5, step=1, callback=self.setConvexCurveWidth, ticks=1)
OWGUI.hSlider(self.settingsTab, self, 'ConvexHullCurveWidth', box='ROC Convex Hull', minValue=2, maxValue=9, step=1, callback=self.setConvexHullCurveWidth, ticks=1)
OWGUI.checkBox(self.settingsTab, self, 'ShowDiagonal', 'Show Diagonal ROC Line', tooltip='', callback=self.setShowDiagonal)
self.tabs.insertTab(self.settingsTab, "Settings")
self.resize(800, 600)
def saveToFile(self):
for g in self.graphs:
if g.isVisible():
g.saveToFile()
def setPointWidth(self):
for g in self.graphs:
g.setPointWidth(self.PointWidth)
def setCurveWidth(self):
for g in self.graphs:
g.setCurveWidth(self.CurveWidth)
def setConvexCurveWidth(self):
for g in self.graphs:
g.setConvexCurveWidth(self.ConvexCurveWidth)
def setShowDiagonal(self):
for g in self.graphs:
g.setShowDiagonal(self.ShowDiagonal)
def setConvexHullCurveWidth(self):
for g in self.graphs:
g.setConvexHullCurveWidth(self.ConvexHullCurveWidth)
def setHullColor(self):
self.HullColor = str(c.name())
for g in self.graphs:
g.setHullColor(self.HullColor)
##
def selectUnselectAll(self, qlb):
selected = 0
for i in range(qlb.count()):
if qlb.isSelected(i):
selected = 1
break
qlb.selectAll(not(selected))
def SUAclassifiersQLB(self):
self.selectUnselectAll(self.classifiersQLB)
def SUAtestSetsQLB(self):
self.selectUnselectAll(self.testSetsQLB)
##
def selectAveragingMethod(self):
self.AveragingMethod = self.AveragingMethodNames[self.AveragingMethodIndex]
if self.AveragingMethod == 'merge':
self.performanceTabCosts.setEnabled(self.EnablePerformance)
elif self.AveragingMethod == 'vertical':
self.performanceTabCosts.setEnabled(0)
elif self.AveragingMethod == 'threshold':
self.performanceTabCosts.setEnabled(0)
else:
self.performanceTabCosts.setEnabled(0)
self.convexCurvesQCB.setEnabled(self.AveragingMethod == 'merge' or self.AveragingMethod == None)
self.performanceTabCosts.setEnabled(self.AveragingMethod == 'merge')
for g in self.graphs:
g.setAveragingMethod(self.AveragingMethod)
## class selection (classQLB)
def target(self):
for i in range(len(self.graphs)):
self.graphs[i].hide()
if (self.targetClass <> None) and (len(self.graphs) > 0):
if self.targetClass >= len(self.graphs):
self.targetClass = len(self.graphs) - 1
if self.targetClass < 0:
self.targetClass = 0
self.graphsGridLayoutQGL.addWidget(self.graphs[self.targetClass], 0, 0)
self.graphs[self.targetClass].show()
self.FPcost = self.FPcostList[self.targetClass]
self.FNcost = self.FNcostList[self.targetClass]
self.pvalue = self.pvalueList[self.targetClass]
##
## classifiers selection (classifiersQLB)
def classifiersSelectionChange(self):
list = []
for i in range(self.classifiersQLB.count()):
if self.classifiersQLB.isSelected(i):
list.append( 1 )
else:
list.append( 0 )
for g in self.graphs:
g.setShowClassifiers(list)
def setShowConvexCurves(self):
for g in self.graphs:
g.setShowConvexCurves(self.ShowConvexCurves)
def setShowConvexHull(self):
for g in self.graphs:
g.setShowConvexHull(self.ShowConvexHull)
##
def setShowPerformanceAnalysis(self):
for g in self.graphs:
g.setShowPerformanceLine(self.EnablePerformance)
def setShowDefaultThresholdPoint(self):
for g in self.graphs:
g.setShowDefaultThresholdPoint(self.DefaultThresholdPoint)
## test set selection (testSetsQLB)
def testSetsSelectionChange(self):
list = []
for i in range(self.testSetsQLB.count()):
if self.testSetsQLB.isSelected(i):
list.append( 1 )
else:
list.append( 0 )
for g in self.graphs:
g.setShowIterations(list)
##
def calcAllClassGraphs(self):
for (cl, g) in enumerate(self.graphs):
g.setNumberOfClassifiersIterationsAndClassifierColors(self.dres.classifierNames, self.numberOfIterations, self.classifierColor)
g.setTestSetData(self.dresSplitByIterations, cl)
g.setShowConvexCurves(self.ShowConvexCurves)
g.setShowConvexHull(self.ShowConvexHull)
g.setAveragingMethod(self.AveragingMethod)
g.setShowPerformanceLine(self.EnablePerformance)
g.setShowDefaultThresholdPoint(self.DefaultThresholdPoint)
## user settings
g.setPointWidth(self.PointWidth)
g.setCurveWidth(self.CurveWidth)
g.setConvexCurveWidth(self.ConvexCurveWidth)
g.setShowDiagonal(self.ShowDiagonal)
g.setConvexHullCurveWidth(self.ConvexHullCurveWidth)
g.setHullColor(QColor(self.HullColor))
def removeGraphs(self):
for g in self.graphs:
g.removeCurves()
g.hide()
def costsChanged(self):
if self.targetClass <> None and (len(self.graphs) > 0):
self.FPcostList[self.targetClass] = self.FPcost
self.FNcostList[self.targetClass] = self.FNcost
self.graphs[self.targetClass].costChanged(self.FPcost, self.FNcost)
def pvaluesUpdated(self):
if (self.targetClass == None) or (len(self.graphs) == 0): return
## update p values
if self.pvalue > self.maxpsum - (len(self.pvalueList) - 1):
self.pvalue = self.maxpsum - (len(self.pvalueList) - 1)
self.pvalueList[self.targetClass] = self.pvalue ## set new value
sum = int(statc.sum(self.pvalueList))
## adjust for big changes
distrib = []
for vi in range(len(self.pvalueList)):
if vi == self.targetClass:
distrib.append(0.0)
else:
distrib.append(self.pvalueList[vi] / float(sum - self.pvalue))
dif = self.maxpsum - sum
for vi in range(len(distrib)):
self.pvalueList[vi] += int(float(dif) * distrib[vi])
if self.pvalueList[vi] < self.minp:
self.pvalueList[vi] = self.minp
if self.pvalueList[vi] > self.maxp:
self.pvalueList[vi] = self.maxp
## small changes
dif = self.maxpsum - int(statc.sum(self.pvalueList))
while abs(dif) > 0:
if dif > 0: vi = self.pvalueList.index(min(self.pvalueList[:self.targetClass] + [self.maxp + 1] + self.pvalueList[self.targetClass+1:]))
else: vi = self.pvalueList.index(max(self.pvalueList[:self.targetClass] + [self.minp - 1] + self.pvalueList[self.targetClass+1:]))
if dif > 0: self.pvalueList[vi] += 1
elif dif < 0: self.pvalueList[vi] -= 1
if self.pvalueList[vi] < self.minp: self.pvalueList[vi] = self.minp
if self.pvalueList[vi] > self.maxp: self.pvalueList[vi] = self.maxp
dif = self.maxpsum - int(statc.sum(self.pvalueList))
## apply new pvalues
for (index, graph) in enumerate(self.graphs):
graph.pChanged(float(self.pvalueList[index]) / float(self.maxp))
def setDefaultPValues(self):
if self.defaultPerfLinePValues:
self.pvaluesList = [v for v in self.defaultPerfLinePValues]
self.pvalue = self.pvaluesList[self.targetClass]
self.pvaluesUpdated()
def test_results(self, dres):
self.FPcostList = []
self.FNcostList = []
self.pvalueList = []
if not dres:
self.targetClass = None
self.classCombo.clear()
self.removeGraphs()
self.testSetsQLB.clear()
return
self.dres = dres
self.classifiersQLB.clear()
self.testSetsQLB.clear()
self.removeGraphs()
self.classCombo.clear()
self.defaultPerfLinePValues = []
if self.dres <> None:
## classQLB
self.numberOfClasses = len(self.dres.classValues)
self.graphs = []
for i in range(self.numberOfClasses):
self.FPcostList.append( 500)
self.FNcostList.append( 500)
graph = singleClassROCgraph(self.mainArea, "", "Predicted Class: " + self.dres.classValues[i])
self.graphs.append( graph )
self.classCombo.insertItem(self.dres.classValues[i])
## classifiersQLB
self.classifierColor = []
self.numberOfClassifiers = self.dres.numberOfLearners
if self.numberOfClassifiers > 1:
allCforHSV = self.numberOfClassifiers - 1
else:
allCforHSV = self.numberOfClassifiers
for i in range(self.numberOfClassifiers):
newColor = QColor()
newColor.setHsv(i*255/allCforHSV, 255, 255)
self.classifierColor.append( newColor )
## testSetsQLB
self.dresSplitByIterations = orngStat.splitByIterations(self.dres)
self.numberOfIterations = len(self.dresSplitByIterations)
self.calcAllClassGraphs()
## classifiersQLB
for i in range(self.numberOfClassifiers):
newColor = self.classifierColor[i]
self.classifiersQLB.insertItem(ColorPixmap(newColor), self.dres.classifierNames[i])
self.classifiersQLB.selectAll(1)
## testSetsQLB
self.testSetsQLB.insertStrList([str(i) for i in range(self.numberOfIterations)])
self.testSetsQLB.selectAll(1)
## calculate default pvalues
reminder = self.maxp
for f in orngStat.classProbabilitiesFromRes(self.dres):
v = int(round(f * self.maxp))
reminder -= v
if reminder < 0:
v = v+reminder
self.defaultPerfLinePValues.append(v)
self.pvalueList.append( v)
self.targetClass = 0 ## select first target
self.target()
else:
self.classifierColor = None
self.performanceTabCosts.setEnabled(self.AveragingMethod == 'merge')
self.setDefaultPValues()
if __name__ == "__main__":
a = QApplication(sys.argv)
owdm = OWROC()
a.setMainWidget(owdm)
owdm.show()
a.exec_loop()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -