Note
Go to the end to download the full example code.
Split Dataset Example#
In this example, we aim to show multiple ways of how you can split your datasets for training, testing, and evaluating your models.
# Authors: Lukas Gemein <l.gemein@gmail.com>
#
# License: BSD (3-clause)
from braindecode.datasets import MOABBDataset
from braindecode.preprocessing import create_windows_from_events
Loading the dataset#
Firstly, we create a dataset using the braindecode class <MOABBDataset> to load it fetched from MOABB. In this example, we’re using Dataset 2a from BCI Competition IV.
dataset = MOABBDataset(dataset_name="BNCI2014001", subject_ids=[1])
BNCI2014001 has been renamed to BNCI2014_001. BNCI2014001 will be removed in version 1.1.
The dataset class name 'BNCI2014001' must be an abbreviation of its code 'BNCI2014-001'. See moabb.datasets.base.is_abbrev for more information.
48 events found on stim channel stim
Event IDs: [1 2 3 4]
48 events found on stim channel stim
Event IDs: [1 2 3 4]
48 events found on stim channel stim
Event IDs: [1 2 3 4]
48 events found on stim channel stim
Event IDs: [1 2 3 4]
48 events found on stim channel stim
Event IDs: [1 2 3 4]
48 events found on stim channel stim
Event IDs: [1 2 3 4]
48 events found on stim channel stim
Event IDs: [1 2 3 4]
48 events found on stim channel stim
Event IDs: [1 2 3 4]
48 events found on stim channel stim
Event IDs: [1 2 3 4]
48 events found on stim channel stim
Event IDs: [1 2 3 4]
48 events found on stim channel stim
Event IDs: [1 2 3 4]
48 events found on stim channel stim
Event IDs: [1 2 3 4]
Splitting#
By description information#
The class <MOABBDataset> has a pandas DataFrame containing additional description of its internal datasets, which can be used to help splitting the data based on recording information, such as subject, session, and run of each trial.
dataset.description
Here, we’re splitting the data based on different runs. The method split returns a dictionary with string keys corresponding to unique entries in the description DataFrame column.
splits = dataset.split("run")
print(splits)
splits["4"].description
{'0': <braindecode.datasets.base.BaseConcatDataset object at 0x7f39b87a5780>, '1': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bdf1c0>, '2': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bdca30>, '3': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bdcb50>, '4': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bdd630>, '5': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bdfa90>}
By row index#
Another way we can split the dataset is 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 = dataset.split([0, 1, 5])
print(splits)
splits["0"].description
{'0': <braindecode.datasets.base.BaseConcatDataset object at 0x7f39b87a7c10>}
However, if we want multiple splits based on indices, we can also define a list containing lists of integers. In this case, the dictionary will have string keys representing the index of the dataset split in the order of the given list of integers.
splits = dataset.split([[0, 1, 5], [2, 3, 4], [6, 7, 8, 9, 10, 11]])
print(splits)
splits["2"].description
{'0': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bdc790>, '1': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bdf940>, '2': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e8c20100>}
You can also name each split in the output dictionary by specifying the keys of each list of indexes in the input dictionary:
splits = dataset.split(
{"train": [0, 1, 5], "valid": [2, 3, 4], "test": [6, 7, 8, 9, 10, 11]}
)
print(splits)
splits["test"].description
{'train': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bdca30>, 'valid': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bdded0>, 'test': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bddd20>}
Observation#
Similarly, we can split datasets after creating windows using the same methods.
windows = create_windows_from_events(
dataset, trial_start_offset_samples=0, trial_stop_offset_samples=0
)
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']
# Splitting by different runs
print("Using description info")
splits = windows.split("run")
print(splits)
print()
# Splitting by row index
print("Splitting by row index")
splits = windows.split([4, 8])
print(splits)
print()
print("Multiple row index split")
splits = windows.split([[4, 8], [5, 9, 11]])
print(splits)
print()
# Specifying output's keys
print("Specifying keys")
splits = windows.split(dict(train=[4, 8], test=[5, 9, 11]))
print(splits)
Using description info
{'0': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e8c20370>, '1': <braindecode.datasets.base.BaseConcatDataset object at 0x7f39b8ae6ce0>, '2': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bdffa0>, '3': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bdf730>, '4': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bddc90>, '5': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bdcb50>}
Splitting by row index
{'0': <braindecode.datasets.base.BaseConcatDataset object at 0x7f39b89f31c0>}
Multiple row index split
{'0': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7d7cfd0>, '1': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e8c20100>}
Specifying keys
{'train': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e84013c0>, 'test': <braindecode.datasets.base.BaseConcatDataset object at 0x7f38e7bdcb50>}
Total running time of the script: (0 minutes 3.930 seconds)
Estimated memory usage: 1032 MB