Sleep arousal detection

Name: sleep_arousal
Category: sleep
Dataset: Ghassemi2018 (Physionet Challenge 2018)
Objective: Binary classification
Split: Leave-subjects-out

Usage

neuralbench eeg sleep_arousal
Show config.yaml
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.

data:
  study:
    source:
      name: Ghassemi2018You
    # Only the "train" subset of Ghassemi2018You has labels
    filter_train_split:
      name: QueryEvents
      query: "split == 'train'"
    # `noise` is an artifact-span annotation in PC18, not a cortical arousal
    drop_noise:
      name: QueryEvents
      query: "~((type == 'SleepArousal') & (state == 'noise'))"
    create_label:
      name: CreateColumn
      column: label
      query_row: "type == 'SleepArousal'"
      query_value: arousal
    split:
      name: SklearnSplit
      split_by: subject
      valid_split_ratio: 0.2
      test_split_ratio: 0.2
      valid_random_state: 33
      test_random_state: 33
  channel_positions.layout_or_montage_name: standard_1005
  target:
    =replace=: true
    name: LabelEncoder
    allow_missing: true
    event_types: SleepArousal
    event_field: label
    predefined_mapping: {arousal: 0}
    return_one_hot: true
    aggregation: sum
    treat_missing_as_separate_class: true
  trigger_event_type: Eeg
  start: 0.0
  duration: 15.0
  stride: 15.0
  stride_drop_incomplete: true
  use_weighted_sampler: true
  summary_columns: [state, label]
brain_model_output_size: &brain_model_output_size 2
trainer_config.monitor: val/bal_acc
trainer_config.mode: max
loss:
  name: CrossEntropyLoss
metrics: !!python/object/apply:neuralbench.defaults.metrics.get_classification_metric_configs
  - *brain_model_output_size

Description

Based on the PhysioNet/Computing in Cardiology Challenge 2018 [Ghassemi2018b], this task benchmarks cortical-arousal detection from whole-night sleep EEG. Each non-overlapping 15 s segment is labelled positive if it overlaps any scored SleepArousal event — respiratory disturbances (apnea, hypopnea, Cheyne-Stokes breathing, hypoventilation, partial obstruction) or non-respiratory arousals (RERA, spontaneous, PLM, bruxism, snore) — and negative otherwise.

This is intentionally a simpler framing than the original Challenge, which scored per-sample, restricted positives to non-apnea arousals, and excluded wake and apnea periods from scoring. We therefore do not expect scores to be directly comparable to the Challenge leaderboard.

Dataset Notes

  • Only the split == 'train' portion of the Challenge dataset (~994 subjects) is used, because the public test subset has no released labels. Train/val/test splits are drawn at the subject level (60/20/20).

  • Most positive segments overlap respiratory events (apneas, hypopneas, RERAs), because the PC18 cohort is weighted toward sleep-disordered breathing.

  • SleepArousal events tagged noise are artifact spans (vocalizations, coughing, movement, external noise) rather than cortical arousals, so they are filtered out before labelling. Segments overlapping only such spans receive the negative label rather than triggering a positive.

  • Strong imbalance toward “no arousal” is addressed with a weighted sampler, and we report both bal_acc (principal metric, for consistency across the benchmark) and AUPRC.

References

[Ghassemi2018b]

Ghassemi, Mohammad M., et al. “You Snooze, You Win: the Physionet/Computing in Cardiology Challenge 2018.” 2018 Computing in Cardiology Conference (CinC). Vol. 45. IEEE, 2018.