annotate pylearn/external/wrap_libsvm.py @ 1492:e7c4d031d333

Fix for Windows paths
author Olivier Delalleau <delallea@iro>
date Tue, 16 Aug 2011 15:44:01 -0400
parents 80123baa4544
children
rev   line source
517
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
1 """Run an experiment using libsvm.
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
2 """
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
3 import numpy
542
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
4 from ..datasets import make_dataset
517
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
5
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
6 # libsvm currently has no python installation instructions/convention.
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
7 #
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
8 # This module uses a specific convention for libsvm's installation.
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
9 # I base this on installing libsvm-2.88.
688
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
10 # To install libsvm's python module, do the following:
517
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
11 # 1. Build libsvm (run make in both the root dir and the python subdir).
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
12 # 2. touch a '__init__.py' file in the python subdir
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
13 # 3. add a symbolic link to a PYTHONPATH location that looks like this:
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
14 # libsvm -> <your root path>/libsvm-2.88/python/
688
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
15 # 4. modify the svm_model class in python/svm.py to inherit from object
517
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
16 #
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
17 # That is the sort of thing that this module expects from 'import libsvm'
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
18
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
19 import libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
20
688
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
21 class svm_model(libsvm.svm_model):
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
22 """
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
23 This class is a picklable drop-in replacement for libsvm.svm_model.
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
24 """
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
25 def __getstate__(self):
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
26 return PicklableSVM.svm_to_str(self)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
27
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
28 def __setstate__(self, svm_str):
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
29 PicklableSVM.str_to_svm(svm_str, self=self)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
30
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
31 @staticmethod
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
32 def str_to_svm(s, self=None):
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
33 fname = tempfile.mktemp()
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
34 f = open(fname,'w')
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
35 f.write(s)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
36 f.close()
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
37 rval = self
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
38 try:
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
39 if self:
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
40 self.__init__(fname)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
41 else:
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
42 rval = libsvm.svm_model(fname)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
43 finally:
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
44 os.remove(fname)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
45 return rval
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
46
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
47 @staticmethod
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
48 def svm_to_str(svm):
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
49 fname = tempfile.mktemp()
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
50 svm.save(fname)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
51 rval = open(fname, 'r').read()
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
52 os.remove(fname)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
53 return rval
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
54
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
55 def predict(self, x):
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
56 if type(x) != numpy.ndarray:
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
57 raise TypeError(x)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
58 if x.ndim != 1:
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
59 raise TypeError(x)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
60 return libsvm.svm_model.predict(self, numpy.asarray(x, dtype='float64'))
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
61
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
62 def predict_probability(self, x):
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
63 if x.ndim != 1:
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
64 raise TypeError(x)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
65 return libsvm.svm_model.predict_probability(self, numpy.asarray(x, dtype='float64'))
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
66
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
67 svm_problem = libsvm.svm_problem
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
68 svm_parameter = libsvm.svm_parameter
752
80123baa4544 fixed typos in wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 688
diff changeset
69 RBF = libsvm.RBF
688
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
70
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
71
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
72 ####################################
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
73 # Extra stuff that is less essential
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
74 #
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
75 # TODO: Move stuff below to a file
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
76 # in algorithms
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
77 ####################################
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
78
517
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
79 def score_01(x, y, model):
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
80 assert len(x) == len(y)
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
81 size = len(x)
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
82 errors = 0
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
83 for i in range(size):
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
84 prediction = model.predict(x[i])
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
85 #probability = model.predict_probability
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
86 if (y[i] != prediction):
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
87 errors = errors + 1
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
88 return float(errors)/size
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
89
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
90 #this is the dbdict experiment interface... if you happen to use dbdict
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
91 class State(object):
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
92 #TODO: parametrize to get all the kernel types, not hardcode for RBF
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
93 dataset = 'MNIST_1k'
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
94 C = 10.0
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
95 kernel = 'RBF'
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
96 # rel_gamma is related to the procedure Jerome used. He mentioned why in
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
97 # quadratic_neurons/neuropaper/draft3.pdf.
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
98 rel_gamma = 1.0
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
99
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
100 def __init__(self, **kwargs):
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
101 for k, v in kwargs:
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
102 setattr(self, k, type(getattr(self, k))(v))
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
103
688
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
104 def state_run_svm_experiment(state, channel=lambda *args, **kwargs:None):
517
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
105 """Parameters are described in state, and returned in state.
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
106
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
107 :param state: object instance to store parameters and return values
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
108 :param channel: not used
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
109
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
110 :returns: None
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
111
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
112 This is the kind of function that dbdict-run can use.
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
113
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
114 """
656
40cae12a9bb8 Get rid of old dbdict
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents: 646
diff changeset
115 dataset = make_dataset(**state.dataset)
542
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
116
517
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
117
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
118 #libsvm needs stuff in int32 on a 32bit machine
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
119 #TODO: test this on a 64bit machine
646
fa6c399dc292 Get rid of dbdict, it now has its own repository.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents: 542
diff changeset
120 # -> Both int32 and int64 (default) seem to be OK
542
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
121 train_y = numpy.asarray(dataset.train.y, dtype='int32')
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
122 valid_y = numpy.asarray(dataset.valid.y, dtype='int32')
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
123 test_y = numpy.asarray(dataset.test.y, dtype='int32')
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
124 problem = libsvm.svm_problem(train_y, dataset.train.x);
517
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
125
542
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
126 gamma0 = 0.5 / numpy.sum(numpy.var(dataset.train.x, axis=0))
517
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
127
542
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
128 param = libsvm.svm_parameter(C=state['C'],
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
129 kernel_type=getattr(libsvm, state['kernel']),
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
130 gamma=state['rel_gamma'] * gamma0)
517
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
131
542
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
132 model = libsvm.svm_model(problem, param) #this is the expensive part
517
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
133
542
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
134 state['train_01'] = score_01(dataset.train.x, train_y, model)
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
135 state['valid_01'] = score_01(dataset.valid.x, valid_y, model)
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
136 state['test_01'] = score_01(dataset.test.x, test_y, model)
517
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
137
542
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
138 state['n_train'] = len(train_y)
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
139 state['n_valid'] = len(valid_y)
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
140 state['n_test'] = len(test_y)
517
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
141
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
142 def run_svm_experiment(**kwargs):
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
143 """Python-friendly interface to dbdict_run_svm_experiment
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
144
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
145 Parameters are used to construct a `State` instance, which is returned after running
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
146 `dbdict_run_svm_experiment` on it.
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
147
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
148 .. code-block:: python
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
149 results = run_svm_experiment(dataset='MNIST_1k', C=100.0, rel_gamma=0.01)
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
150 print results.n_train
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
151 # 1000
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
152 print results.valid_01, results.test_01
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
153 # 0.14, 0.10 #.. or something...
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
154
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
155 """
542
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
156 state_run_svm_experiment(state=kwargs)
ee5324c21e60 changes to dbdict to use dict-like instead of object-like state
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 537
diff changeset
157 return kwargs
517
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
158
688
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
159 def train_rbf_model(train_X, train_Y, C, gamma):
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
160 param = libsvm.svm_parameter(C=C, kernel_type=libsvm.RBF, gamma=gamma)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
161 problem = libsvm.svm_problem(train_Y, train_X)
752
80123baa4544 fixed typos in wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 688
diff changeset
162 model = svm_model(problem, param)
688
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
163
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
164 #save_filename = state.save_filename
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
165 #model.save(save_filename)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
166
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
167
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
168 def jobman_train_model(state, channel):
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
169 """
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
170
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
171 According to the given validation set,
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
172 What is the best libsvm parameter setting to train on?
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
173 """
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
174 (train_X, train_Y) = jobman.tools.make(state.train_set)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
175 (valid_X, valid_Y) = jobman.tools.make(state.valid_set)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
176
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
177 C_grid = [1,2,3]
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
178 gamma_grid = [0.1, 1, 10]
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
179
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
180 grid = [dict(
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
181 train_set=None,
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
182 svm_param=dict(kernel='RBF', C=C, gamma=g),
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
183 save_filename='model_RBF_C%f_G%f.libsvm')
752
80123baa4544 fixed typos in wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 688
diff changeset
184 for C in C_grid
688
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
185 for g in gamma_grid]
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
186
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
187 # will return quickly if jobs have already run
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
188 # and the rootpath is populated with results
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
189 grid = jobman.map(
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
190 jobman_train_model_given_all_params,
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
191 grid,
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
192 path=jobman.rootpath(state)+'/gridmap',
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
193 cleanup=False)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
194
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
195 # evaluate all these sub_state models on our validation_set
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
196 valid_perf = []
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
197 for sub_state in grid:
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
198 # create a file in this state-space called model.tmp
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
199 # with the same contents as the
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
200 # save_filename file in the sub_state
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
201 jobman.link('model.tmp', jobman.rootpath(sub_state)+'/'+sub_state.save_filename)
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
202 model = svm.model('model.tmp')
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
203 valid_perf.append((score_01(valid_X, valid_Y, model), sub_state))
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
204 jobman.unlink('model.tmp')
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
205
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
206 # calculate the return value
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
207 valid_perf.sort() #lowest first
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
208 state.lowest_valid_err = valid_perf[0][0]
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
209 state.lowest_valid_svm_param = valid_perf[0][1].svm_param
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
210
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
211
49e531f7b0ba added picklable svm_model to wrap_libsvm
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 656
diff changeset
212