Package PyML :: Package classifiers :: Module multi
[frames] | no frames]

Source Code for Module PyML.classifiers.multi

  1   
  2  import numpy 
  3  import os 
  4   
  5  from PyML.utils import misc 
  6  from baseClassifiers import Classifier 
  7  from composite import CompositeClassifier 
  8  from PyML.evaluators import assess 
  9  from PyML.containers.labels import oneAgainstRest 
 10   
 11  """classes for multi-class classification""" 
 12   
 13  __docformat__ = "restructuredtext en" 
 14   
15 -class OneAgainstOne (CompositeClassifier) :
16 17 '''One-against-one Multi-class classification 18 using a two class classifier. 19 20 For a k class problem k(k-1) binary classes are trained for all 21 pairs of classes; an instance is classified to the class that 22 receives the highest number of votes; an instance is constructed 23 using a classifier that is used as a template for constructing 24 the actual classifiers. 25 ''' 26
27 - def train(self, data, **args) :
28 '''train k(k-1)/2 classifiers''' 29 30 Classifier.train(self, data, **args) 31 numClasses = self.labels.numClasses 32 33 if numClasses <= 2: 34 raise ValueError, 'Not a multi class problem' 35 36 self.classifiers = misc.matrix((numClasses, numClasses)) 37 for i in range(numClasses - 1) : 38 for j in range(i+1, numClasses) : 39 self.classifiers[i][j] = self.classifier.__class__(self.classifier) 40 dataij=data.__class__(data, deepcopy = self.classifier.deepcopy, 41 classID = [i,j]) 42 self.classifiers[i][j].train(dataij) 43 self.log.trainingTime = self.getTrainingTime()
44
45 - def classify(self, data, p):
46 '''Suppose that x is classified to class c, then the margin is 47 defined as the minimum margin found against the k-1 other classes 48 ''' 49 50 numClasses = self.labels.numClasses 51 r = numpy.zeros((numClasses, numClasses),numpy.float_) 52 vote = numpy.zeros(numClasses) 53 for i in range(numClasses - 1) : 54 for j in range(i+1, numClasses) : 55 r[i][j] = self.classifiers[i][j].decisionFunc(data, p) 56 # afterwards I take the minimum or r, so assign: 57 r[j][i] = r[i][j] 58 if r[i][j] > 0 : 59 vote[j] += 1 60 else: 61 vote[i] += 1 62 63 maxvote = numpy.argmax(vote) 64 return maxvote, numpy.min(numpy.absolute(r[maxvote]))
65
66 - def preproject(self, data) :
67 68 for i in range(self.labels.numClasses-1): 69 for j in range(i+1, self.labels.numClasses): 70 self.classifiers[i][j].preproject(data)
71 72 test = assess.test
73 74
75 -class OneAgainstRest (CompositeClassifier) :
76 77 '''A one-against-the-rest multi-class classifier''' 78
79 - def train(self, data, **args) :
80 '''train k classifiers''' 81 82 Classifier.train(self, data, **args) 83 84 numClasses = self.labels.numClasses 85 if numClasses <= 2: 86 raise ValueError, 'Not a multi class problem' 87 88 self.classifiers = [self.classifier.__class__(self.classifier) 89 for i in range(numClasses)] 90 91 for i in range(numClasses) : 92 # make a copy of the data; this is done in case the classifier modifies the data 93 datai = data.__class__(data, deepcopy = self.classifier.deepcopy) 94 datai = oneAgainstRest(datai, data.labels.classLabels[i]) 95 96 self.classifiers[i].train(datai) 97 98 self.log.trainingTime = self.getTrainingTime()
99
100 - def classify(self, data, i):
101 102 r = numpy.zeros(self.labels.numClasses, numpy.float_) 103 for j in range(self.labels.numClasses) : 104 r[j] = self.classifiers[j].decisionFunc(data, i) 105 106 return numpy.argmax(r), numpy.max(r)
107
108 - def preproject(self, data) :
109 110 for i in range(self.labels.numClasses) : 111 self.classifiers[i].preproject(data)
112 113 test = assess.test
114 115
116 -def allOneAgainstRest(classifier, data, resultsFile, numFolds = 5, minClassSize = 8) :
117 118 import myio 119 labels = data.labels 120 121 results = {} 122 if os.path.exists(resultsFile) : 123 results = assess.loadResults(resultsFile) 124 125 for label in labels.classLabels : 126 if label in results : continue 127 if (minClassSize is not None and 128 labels.classSize[labels.classDict[label]] < minClassSize) : continue 129 130 myio.log('class: ' + label + '\n') 131 data = oneAgainstRest(data, label) 132 try : 133 results[label] = classifier.stratifiedCV(data, numFolds) 134 except : 135 results[label] = None 136 assess.saveResultObjects(results, resultsFile) 137 data.attachLabels(labels)
138