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
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
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
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
71
72 test = assess.test
73
74
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
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
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
112
113 test = assess.test
114
115
116 -def allOneAgainstRest(classifier, data, resultsFile, numFolds = 5, minClassSize = 8) :
138