Split Dataset Example

In this example, we show multiple ways of how to split datasets.

# Authors: Lukas Gemein <l.gemein@gmail.com>
#
# License: BSD (3-clause)

from IPython.display import display

from braindecode.datasets import MOABBDataset
from braindecode.datautil.windowers import create_windows_from_events

First, we create a dataset based on BCIC IV 2a fetched with MOABB,

ds = MOABBDataset(dataset_name="BNCI2014001", subject_ids=[1])

Out:

48 events found
Event IDs: [1 2 3 4]
48 events found
Event IDs: [1 2 3 4]
48 events found
Event IDs: [1 2 3 4]
48 events found
Event IDs: [1 2 3 4]
48 events found
Event IDs: [1 2 3 4]
48 events found
Event IDs: [1 2 3 4]
48 events found
Event IDs: [1 2 3 4]
48 events found
Event IDs: [1 2 3 4]
48 events found
Event IDs: [1 2 3 4]
48 events found
Event IDs: [1 2 3 4]
48 events found
Event IDs: [1 2 3 4]
48 events found
Event IDs: [1 2 3 4]

ds has a pandas DataFrame with additional description of its internal datasets

display(ds.description)

Out:

    subject    session    run
0         1  session_T  run_0
1         1  session_T  run_1
2         1  session_T  run_2
3         1  session_T  run_3
4         1  session_T  run_4
5         1  session_T  run_5
6         1  session_E  run_0
7         1  session_E  run_1
8         1  session_E  run_2
9         1  session_E  run_3
10        1  session_E  run_4
11        1  session_E  run_5

We can split the dataset based on the info in the description, for example based on different runs. The returned dictionary will have string keys corresponding to unique entries in the description DataFrame column

splits = ds.split("run")
display(splits)
display(splits["run_4"].description)

Out:

{'run_0': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747f9e2b50>, 'run_1': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747fa6e6d0>, 'run_2': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747d1a2410>, 'run_3': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747d1a2090>, 'run_4': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747d1a2250>, 'run_5': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747d1a26d0>}
   subject    session    run
0        1  session_T  run_4
1        1  session_E  run_4

We can also split the dataset based on a list of integers corresponding to rows in the description. In this case, the returned dictionary will have ‘0’ as the only key

splits = ds.split([0, 1, 5])
display(splits)
display(splits["0"].description)

Out:

{'0': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747f9e2a90>}
   subject    session    run
0        1  session_T  run_0
1        1  session_T  run_1
2        1  session_T  run_5

If we want multiple splits based on indices, we can also specify a list of list of integers. In this case, the dictionary will have string keys representing the id of the dataset split in the order of the given list of integers

splits = ds.split([[0, 1, 5], [2, 3, 4], [6, 7, 8, 9, 10, 11]])
display(splits)
display(splits["2"].description)

Out:

{'0': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747d1a2050>, '1': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747d1a2c10>, '2': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747d1a2610>}
   subject    session    run
0        1  session_E  run_0
1        1  session_E  run_1
2        1  session_E  run_2
3        1  session_E  run_3
4        1  session_E  run_4
5        1  session_E  run_5

Similarly, we can split datasets after creating windows

windows = create_windows_from_events(
    ds, trial_start_offset_samples=0, trial_stop_offset_samples=0)
splits = windows.split("run")
display(splits)
splits = windows.split([4, 8])
display(splits)
splits = windows.split([[4, 8], [5, 9, 11]])
display(splits)

Out:

Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Adding metadata with 4 columns
Replacing existing metadata with 4 columns
48 matching events found
No baseline correction applied
0 projection items activated
Loading data for 48 events and 1000 original time points ...
0 bad epochs dropped
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Adding metadata with 4 columns
Replacing existing metadata with 4 columns
48 matching events found
No baseline correction applied
0 projection items activated
Loading data for 48 events and 1000 original time points ...
0 bad epochs dropped
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Adding metadata with 4 columns
Replacing existing metadata with 4 columns
48 matching events found
No baseline correction applied
0 projection items activated
Loading data for 48 events and 1000 original time points ...
0 bad epochs dropped
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Adding metadata with 4 columns
Replacing existing metadata with 4 columns
48 matching events found
No baseline correction applied
0 projection items activated
Loading data for 48 events and 1000 original time points ...
0 bad epochs dropped
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Adding metadata with 4 columns
Replacing existing metadata with 4 columns
48 matching events found
No baseline correction applied
0 projection items activated
Loading data for 48 events and 1000 original time points ...
0 bad epochs dropped
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Adding metadata with 4 columns
Replacing existing metadata with 4 columns
48 matching events found
No baseline correction applied
0 projection items activated
Loading data for 48 events and 1000 original time points ...
0 bad epochs dropped
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Adding metadata with 4 columns
Replacing existing metadata with 4 columns
48 matching events found
No baseline correction applied
0 projection items activated
Loading data for 48 events and 1000 original time points ...
0 bad epochs dropped
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Adding metadata with 4 columns
Replacing existing metadata with 4 columns
48 matching events found
No baseline correction applied
0 projection items activated
Loading data for 48 events and 1000 original time points ...
0 bad epochs dropped
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Adding metadata with 4 columns
Replacing existing metadata with 4 columns
48 matching events found
No baseline correction applied
0 projection items activated
Loading data for 48 events and 1000 original time points ...
0 bad epochs dropped
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Adding metadata with 4 columns
Replacing existing metadata with 4 columns
48 matching events found
No baseline correction applied
0 projection items activated
Loading data for 48 events and 1000 original time points ...
0 bad epochs dropped
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Adding metadata with 4 columns
Replacing existing metadata with 4 columns
48 matching events found
No baseline correction applied
0 projection items activated
Loading data for 48 events and 1000 original time points ...
0 bad epochs dropped
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Adding metadata with 4 columns
Replacing existing metadata with 4 columns
48 matching events found
No baseline correction applied
0 projection items activated
Loading data for 48 events and 1000 original time points ...
0 bad epochs dropped
{'run_0': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747f5c1710>, 'run_1': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747d1a2990>, 'run_2': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747d1a2750>, 'run_3': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747d1a7190>, 'run_4': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747f5b8290>, 'run_5': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747f5b8350>}
{'0': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747d1a21d0>}
{'0': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747d1a7a10>, '1': <braindecode.datasets.base.BaseConcatDataset object at 0x7f747f5b8410>}

Total running time of the script: ( 0 minutes 3.082 seconds)

Estimated memory usage: 338 MB

Gallery generated by Sphinx-Gallery