Mercurial > pylearn
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 | 1 """Run an experiment using libsvm. |
2 """ | |
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 | 5 |
6 # libsvm currently has no python installation instructions/convention. | |
7 # | |
8 # This module uses a specific convention for libsvm's installation. | |
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 | 11 # 1. Build libsvm (run make in both the root dir and the python subdir). |
12 # 2. touch a '__init__.py' file in the python subdir | |
13 # 3. add a symbolic link to a PYTHONPATH location that looks like this: | |
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 | 16 # |
17 # That is the sort of thing that this module expects from 'import libsvm' | |
18 | |
19 import libsvm | |
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 | 79 def score_01(x, y, model): |
80 assert len(x) == len(y) | |
81 size = len(x) | |
82 errors = 0 | |
83 for i in range(size): | |
84 prediction = model.predict(x[i]) | |
85 #probability = model.predict_probability | |
86 if (y[i] != prediction): | |
87 errors = errors + 1 | |
88 return float(errors)/size | |
89 | |
90 #this is the dbdict experiment interface... if you happen to use dbdict | |
91 class State(object): | |
92 #TODO: parametrize to get all the kernel types, not hardcode for RBF | |
93 dataset = 'MNIST_1k' | |
94 C = 10.0 | |
95 kernel = 'RBF' | |
96 # rel_gamma is related to the procedure Jerome used. He mentioned why in | |
97 # quadratic_neurons/neuropaper/draft3.pdf. | |
98 rel_gamma = 1.0 | |
99 | |
100 def __init__(self, **kwargs): | |
101 for k, v in kwargs: | |
102 setattr(self, k, type(getattr(self, k))(v)) | |
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 | 105 """Parameters are described in state, and returned in state. |
106 | |
107 :param state: object instance to store parameters and return values | |
108 :param channel: not used | |
109 | |
110 :returns: None | |
111 | |
112 This is the kind of function that dbdict-run can use. | |
113 | |
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 | 117 |
118 #libsvm needs stuff in int32 on a 32bit machine | |
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 | 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 | 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 | 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 | 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 | 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 | 141 |
142 def run_svm_experiment(**kwargs): | |
143 """Python-friendly interface to dbdict_run_svm_experiment | |
144 | |
145 Parameters are used to construct a `State` instance, which is returned after running | |
146 `dbdict_run_svm_experiment` on it. | |
147 | |
148 .. code-block:: python | |
149 results = run_svm_experiment(dataset='MNIST_1k', C=100.0, rel_gamma=0.01) | |
150 print results.n_train | |
151 # 1000 | |
152 print results.valid_01, results.test_01 | |
153 # 0.14, 0.10 #.. or something... | |
154 | |
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 | 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 |