<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
Dear Matteo,<br>
thank you for the willingness to look into my code.<br>
<br>
This is taken almost verbatim from
<a class="moz-txt-link-freetext" href="http://dev.pymvpa.org/examples/nested_cv.html">http://dev.pymvpa.org/examples/nested_cv.html</a>, except for the
leave-one-pair-out partitioning, and a slight reduction in the
number of classifiers (in the original example, they are around 45).<br>
<br>
Any help or suggestion would be greatly appreciated!<br>
All the best,<br>
Marco<br>
<br>
<br>
########## * ##########<br>
##########<br>
<br>
PyMVPA:<br>
Version: 2.6.3<br>
Hash: 9c07e8827819aaa79ff15d2db10c420a876d7785<br>
Path: /usr/lib/python2.7/dist-packages/mvpa2/__init__.pyc<br>
Version control (GIT):<br>
GIT information could not be obtained due
"/usr/lib/python2.7/dist-packages/mvpa2/.. is not under GIT"<br>
SYSTEM:<br>
OS: posix Linux 4.13.0-1-amd64 #1 SMP Debian 4.13.4-2
(2017-10-15)<br>
<br>
<br>
print fds.summary()<br>
Dataset: 36x534@float32, <sa:
chunks,targets,time_coords,time_indices>, <fa:
voxel_indices>, <a:
imgaffine,imghdr,imgtype,mapper,voxel_dim,voxel_eldim><br>
stats: mean=0.548448 std=1.40906 var=1.98546 min=-5.41163
max=9.88639<br>
No details due to large number of targets or chunks. Increase maxc
and maxt if desired<br>
Summary for targets across chunks<br>
targets mean std min max #chunks<br>
C 0.5 0.5 0 1 18<br>
D 0.5 0.5 0 1 18<br>
<br>
<br>
#Evaluate prevalent best classifier with nested crossvalidation<br>
verbose.level = 5<br>
<br>
partitionerCD = ChainNode([NFoldPartitioner(cvtype=2,
attr='chunks'), Sifter([('partitions', 2), ('targets', ['C',
'D'])])], space='partitions')<br>
# training partitions<br>
for fds_ in partitionerCD.generate(fds): <br>
training = fds[fds_.sa.partitions == 1]<br>
#print list(zip(training.sa.chunks, training.sa.targets))<br>
# testing partitions<br>
for fds_ in partitionerCD.generate(fds): <br>
testing = fds[fds_.sa.partitions == 2]<br>
#print list(zip(testing.sa.chunks, testing.sa.targets))<br>
<br>
#Helper function (partitionerCD recursively acting on dstrain,
rather than on fds):<br>
def select_best_clf(dstrain_, clfs):<br>
"""Select best model according to CVTE<br>
Helper function which we will use twice -- once for proper
nested<br>
cross-validation, and once to see how big an optimistic bias due<br>
to model selection could be if we simply provide an entire
dataset.<br>
Parameters<br>
----------<br>
dstrain_ : Dataset<br>
clfs : list of Classifiers<br>
Which classifiers to explore<br>
Returns<br>
-------<br>
best_clf, best_error<br>
"""<br>
best_error = None<br>
for clf in clfs:<br>
cv = CrossValidation(clf, partitionerCD)<br>
# unfortunately we don't have ability to reassign clf atm<br>
# cv.transerror.clf = clf<br>
try:<br>
error = np.mean(cv(dstrain_))<br>
except LearnerError, e:<br>
# skip the classifier if data was not appropriate and it<br>
# failed to learn/predict at all<br>
continue<br>
if best_error is None or error < best_error:<br>
best_clf = clf<br>
best_error = error<br>
verbose(4, "Classifier %s cv error=%.2f" % (clf.descr,
error))<br>
verbose(3, "Selected the best out of %i classifiers %s with
error %.2f"<br>
% (len(clfs), best_clf.descr, best_error))<br>
return best_clf, best_error<br>
<br>
#Estimate error using nested CV for model selection:<br>
best_clfs = {}<br>
confusion = ConfusionMatrix()<br>
verbose(1, "Estimating error using nested CV for model selection")<br>
partitioner = partitionerCD<br>
splitter = Splitter('partitions')<br>
for isplit, partitions in enumerate(partitionerCD.generate(fds)):<br>
verbose(2, "Processing split #%i" % isplit)<br>
dstrain, dstest = list(splitter.generate(partitions))<br>
best_clf, best_error = select_best_clf(dstrain,
clfswh['!gnpp','!skl'])<br>
best_clfs[best_clf.descr] = best_clfs.get(best_clf.descr, 0) + 1<br>
# now that we have the best classifier, lets assess its transfer<br>
# to the testing dataset while training on entire training<br>
tm = TransferMeasure(best_clf, splitter,<br>
postproc=BinaryFxNode(mean_mismatch_error,
space='targets'), enable_ca=['stats'])<br>
tm(partitions)<br>
confusion += tm.ca.stats<br>
<br>
##########<br>
########## * ##########<br>
<br>
<br>
<br>
<br>
<br>
<br>
<blockquote type="cite"><font size="-1"><font face="Arial">On
10/11/2017 15:43, Matteo Visconti di Oleggio Castello wrote:<br>
<br>
What do you mean with "cycling over approx 40 different
classifiers"? Are<br>
you testing different classifiers? If that's the case, a
possibility is to<br>
create a script that takes as argument the type of classifiers
and runs the<br>
classification across all folds. In that way you can submit 40
jobs and<br>
parallelize across classifiers.<br>
<br>
If that's not the case, because the folds are independent and
deterministic<br>
I would create a script that performs the classification on
blocks of folds<br>
(say fold 1 to 30, 31, to 60, etc...), and then submit
different jobs, so<br>
to parallelize there.<br>
<br>
I think that if you send a snippet of the code you're using it
can be more<br>
evident which are good points for parallelization.<br>
</font></font><br>
<br>
<div class="moz-cite-prefix">On 10/11/2017 09:57, marco tettamanti
wrote:<br>
</div>
<blockquote type="cite"
cite="mid:9a2fb439-554c-360c-6aef-4c0693dc1a1a@gmail.com">
<pre wrap="">Dear Matteo and Nick,
thank you for your responses.
I take the occasion to ask some follow-up questions, because I am struggling to
make pymvpa2 computations faster and more efficient.
I often find myself in the situation of giving up with a particular analysis,
because it is going to take far more time that I can bear (weeks, months!). This
happens particularly with searchlight permutation testing (gnbsearchlight is
much faster, but does not support pprocess), and nested cross-validation.
As for the latter, for example, I recently wanted to run nested cross-validation
in a sample of 18 patients and 18 controls (1 image x subject), training the
classifiers to discriminate patients from controls in a leave-one-pair-out
partitioning scheme. This yields 18*18=324 folds. For a small ROI of 36 voxels,
cycling over approx 40 different classifiers takes about 2 hours for each fold
on a decent PowerEdge T430 Dell server with 128GB RAM. This means approx. 27
days for all 324 folds!
The same server is equipped with 32 CPUs. With full parallelization, the same
analysis may be completed in less than one day. This is the reason of my
interest and questions about parallelization.
Is there anything that you experts do in such situations to speed up or make the
computation more efficient?
Thank you again and best wishes,
Marco
</pre>
<blockquote type="cite">
<pre wrap="">On 10/11/2017 10:07, Nick Oosterhof wrote:
There have been some plans / minor attempts for using parallelisation more
parallel, but as far as I know we only support pprocces, and only for (1)
searchlight; (2) surface-based voxel selection; and (3) hyperalignment. I
do remember that parallelisation of other functions was challenging due to
some getting the conditional attributes set right, but this is long time
ago.
</pre>
<blockquote type="cite">
<pre wrap="">On 09/11/2017 18:35, Matteo Visconti di Oleggio Castello wrote:
Hi Marco,
AFAIK, there is no support for parallelization at the level of
cross-validation. Usually for a small ROI (such a searchlight) and with
standard CV schemes, the process is quite fast, and the bottleneck is
really the number of searchlights to be computed (for which parallelization
exists).
In my experience, we tend to parallelize at the level of individual
participants; for example we might set up a searchlight analysis with
however n_procs you can have, and then submit one such job for every
participant to a cluster (using either torque or condor).
HTH,
Matteo
On 09/11/2017 10:08, marco tettamanti wrote:
</pre>
<blockquote type="cite">
<pre wrap="">Dear all,
forgive me if this has already been asked in the past, but I was wondering
whether there has been any development meanwhile.
Are there any chances that one can generally apply parallel computing (multiple
CPUs or clusters) with pymvpa2, in addition to what is already implemented for
searchlight (pprocess)? That is, also for general cross-validation, nested
cross-validation, permutation testing, RFE, etc.?
Has anyone had succesful experience with parallelization schemes such as
ipyparallel, condor or else?
Thank you and best wishes!
Marco
</pre>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<br>
<pre class="moz-signature" cols="80">--
Marco Tettamanti, Ph.D.
Nuclear Medicine Department & Division of Neuroscience
IRCCS San Raffaele Scientific Institute
Via Olgettina 58
I-20132 Milano, Italy
Phone ++39-02-26434888
Fax ++39-02-26434892
Email: <a class="moz-txt-link-abbreviated" href="mailto:tettamanti.marco@hsr.it">tettamanti.marco@hsr.it</a>
Skype: mtettamanti
<a class="moz-txt-link-freetext" href="http://scholar.google.it/citations?user=x4qQl4AAAAAJ">http://scholar.google.it/citations?user=x4qQl4AAAAAJ</a></pre>
</blockquote>
<br>
</body>
</html>