.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/02_decoding/plot_haxby_searchlight.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. or to run this example in your browser via Binder .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_02_decoding_plot_haxby_searchlight.py: Searchlight analysis of face vs house recognition ================================================= Searchlight analysis requires fitting a classifier a large amount of times. As a result, it is an intrinsically slow method. In order to speed up computing, in this example, Searchlight is run only on one slice on the :term:`fMRI` (see the generated figures). .. include:: ../../../examples/masker_note.rst .. GENERATED FROM PYTHON SOURCE LINES 15-17 Load Haxby dataset ------------------ .. GENERATED FROM PYTHON SOURCE LINES 17-34 .. code-block:: Python import pandas as pd from nilearn.datasets import fetch_haxby from nilearn.image import get_data, load_img, new_img_like # We fetch 2nd subject from haxby datasets (which is default) haxby_dataset = fetch_haxby() # print basic information on the dataset print(f"Anatomical nifti image (3D) is located at: {haxby_dataset.mask}") print(f"Functional nifti image (4D) is located at: {haxby_dataset.func[0]}") fmri_filename = haxby_dataset.func[0] labels = pd.read_csv(haxby_dataset.session_target[0], sep=" ") y = labels["labels"] run = labels["chunks"] .. rst-class:: sphx-glr-script-out .. code-block:: none [fetch_haxby] Dataset found in /home/runner/nilearn_data/haxby2001 Anatomical nifti image (3D) is located at: /home/runner/nilearn_data/haxby2001/mask.nii.gz Functional nifti image (4D) is located at: /home/runner/nilearn_data/haxby2001/subj2/bold.nii.gz .. GENERATED FROM PYTHON SOURCE LINES 35-37 Restrict to faces and houses ---------------------------- .. GENERATED FROM PYTHON SOURCE LINES 37-44 .. code-block:: Python from nilearn.image import index_img condition_mask = y.isin(["face", "house"]) fmri_img = index_img(fmri_filename, condition_mask) y, run = y[condition_mask], run[condition_mask] .. GENERATED FROM PYTHON SOURCE LINES 45-51 Prepare masks ------------- - mask_img is the original mask - process_mask_img is a subset of mask_img, it contains the voxels that should be processed (we only keep the slice z = 29 and the back of the brain to speed up computation) .. GENERATED FROM PYTHON SOURCE LINES 51-63 .. code-block:: Python import numpy as np mask_img = load_img(haxby_dataset.mask) # .astype() makes a copy. process_mask = get_data(mask_img).astype(int) picked_slice = 29 process_mask[..., (picked_slice + 1) :] = 0 process_mask[..., :picked_slice] = 0 process_mask[:, 30:] = 0 process_mask_img = new_img_like(mask_img, process_mask) .. rst-class:: sphx-glr-script-out .. code-block:: none /home/runner/work/nilearn/nilearn/examples/02_decoding/plot_haxby_searchlight.py:61: UserWarning: Data array used to create a new image contains 64-bit ints. This is likely due to creating the array with numpy and passing `int` as the `dtype`. Many tools such as FSL and SPM cannot deal with int64 in Nifti images, so for compatibility the data has been converted to int32. process_mask_img = new_img_like(mask_img, process_mask) .. GENERATED FROM PYTHON SOURCE LINES 64-72 Searchlight computation ----------------------- Make processing parallel .. warning:: As each thread will print its progress, n_jobs > 1 could mess up the information output. .. GENERATED FROM PYTHON SOURCE LINES 72-74 .. code-block:: Python n_jobs = 2 .. GENERATED FROM PYTHON SOURCE LINES 75-81 Define the cross-validation scheme used for validation. Here we use a KFold cross-validation on the run, which corresponds to splitting the samples in 4 folds and make 4 runs using each fold as a test set once and the others as learning sets The radius is the one of the Searchlight sphere that will scan the volume .. GENERATED FROM PYTHON SOURCE LINES 81-97 .. code-block:: Python from sklearn.model_selection import KFold import nilearn.decoding cv = KFold(n_splits=4) searchlight = nilearn.decoding.SearchLight( mask_img, process_mask_img=process_mask_img, radius=5.6, n_jobs=n_jobs, verbose=1, cv=cv, ) searchlight.fit(fmri_img, y) .. rst-class:: sphx-glr-script-out .. code-block:: none [Parallel(n_jobs=2)]: Using backend LokyBackend with 2 concurrent workers. [Parallel(n_jobs=2)]: Done 2 out of 2 | elapsed: 13.5s remaining: 0.0s [Parallel(n_jobs=2)]: Done 2 out of 2 | elapsed: 13.5s finished .. raw:: html
SearchLight(cv=KFold(n_splits=4, random_state=None, shuffle=False),
                mask_img=<nibabel.nifti1.Nifti1Image object at 0x7f4a7f8d8a30>,
                n_jobs=2,
                process_mask_img=<nibabel.nifti1.Nifti1Image object at 0x7f4a577d5220>,
                radius=5.6, verbose=1)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.


.. GENERATED FROM PYTHON SOURCE LINES 98-103 Visualization ------------- %% After fitting the searchlight, we can access the searchlight scores as a NIfTI image using the `scores_img_` attribute. .. GENERATED FROM PYTHON SOURCE LINES 103-105 .. code-block:: Python scores_img = searchlight.scores_img_ .. GENERATED FROM PYTHON SOURCE LINES 106-107 Use the :term:`fMRI` mean image as a surrogate of anatomical data .. GENERATED FROM PYTHON SOURCE LINES 107-111 .. code-block:: Python from nilearn.image import mean_img mean_fmri = mean_img(fmri_img, copy_header=True) .. GENERATED FROM PYTHON SOURCE LINES 112-114 Because scores are not a zero-center test statistics, we cannot use plot_stat_map .. GENERATED FROM PYTHON SOURCE LINES 114-129 .. code-block:: Python from nilearn.plotting import plot_img, plot_stat_map, show plot_img( scores_img, bg_img=mean_fmri, title="Searchlight scores image", display_mode="z", cut_coords=[-9], vmin=0.2, cmap="inferno", threshold=0.2, black_bg=True, colorbar=True, ) .. image-sg:: /auto_examples/02_decoding/images/sphx_glr_plot_haxby_searchlight_001.png :alt: plot haxby searchlight :srcset: /auto_examples/02_decoding/images/sphx_glr_plot_haxby_searchlight_001.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none /home/runner/work/nilearn/nilearn/.tox/doc/lib/python3.9/site-packages/nilearn/plotting/displays/_slicers.py:1674: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance. ax = fh.add_axes( .. GENERATED FROM PYTHON SOURCE LINES 130-132 F-scores computation -------------------- .. GENERATED FROM PYTHON SOURCE LINES 132-165 .. code-block:: Python from sklearn.feature_selection import f_classif from nilearn.maskers import NiftiMasker # For decoding, standardizing is often very important nifti_masker = NiftiMasker( mask_img=mask_img, runs=run, standardize="zscore_sample", memory="nilearn_cache", memory_level=1, ) fmri_masked = nifti_masker.fit_transform(fmri_img) _, p_values = f_classif(fmri_masked, y) p_values = -np.log10(p_values) p_values[p_values > 10] = 10 p_unmasked = get_data(nifti_masker.inverse_transform(p_values)) # F_score results p_ma = np.ma.array(p_unmasked, mask=np.logical_not(process_mask)) f_score_img = new_img_like(mean_fmri, p_ma) plot_stat_map( f_score_img, mean_fmri, title="F-scores", display_mode="z", cut_coords=[-9], cmap="inferno", ) show() .. image-sg:: /auto_examples/02_decoding/images/sphx_glr_plot_haxby_searchlight_002.png :alt: plot haxby searchlight :srcset: /auto_examples/02_decoding/images/sphx_glr_plot_haxby_searchlight_002.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none /home/runner/work/nilearn/nilearn/.tox/doc/lib/python3.9/site-packages/nilearn/plotting/displays/_slicers.py:1674: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance. ax = fh.add_axes( .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 24.430 seconds) **Estimated memory usage:** 1014 MB .. _sphx_glr_download_auto_examples_02_decoding_plot_haxby_searchlight.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: binder-badge .. image:: images/binder_badge_logo.svg :target: https://mybinder.org/v2/gh/nilearn/nilearn/0.12.0?urlpath=lab/tree/notebooks/auto_examples/02_decoding/plot_haxby_searchlight.ipynb :alt: Launch binder :width: 150 px .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_haxby_searchlight.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_haxby_searchlight.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: plot_haxby_searchlight.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_