信息速览
INFOBOX
| 数据集名称 | Sleep-EDF Database [Expanded] |
| 英文全称 | Sleep-EDF Database [Expanded] — Polysomnographic sleep recordings with hypnograms |
| 别名 / 简称 | Sleep-EDF、Sleep-EDFx、Sleep-EDFX-20、Sleep-EDFX-78、Sleep-EDF-2013、Sleep-EDF-2018 |
| 疾病分类 | 7A4Z 睡眠-觉醒障碍,未特指 / 7A00 失眠障碍(ST 子集相关) |
| SNOMED CT | 248669003 Wakefulness / 24867002 Sleep stage N1 / 24867007 Sleep stage N2 / 24867008 Sleep stage N3 / 89119006 Sleep stage REM |
| 数据模态 | 时序(多导睡眠图 PSG:EEG + EOG + EMG 同步连续记录) |
| AI 任务类型 | 时序多分类(睡眠分期)、序列建模、睡眠结构分析、跨被试泛化 |
| 样本总数 | 197 份整夜 PSG 记录(153 SC + 44 ST),来自约 100 名受试者,约 195,479 个 30 秒 epoch(EDF-78 子集) |
| 数据大小 | ~8.1 GB(Expanded 版解压后)/ ~314.6 MB(原始版) |
| 数据格式 | EDF(PSG 信号文件)/ EDF+(Hypnogram 标注文件)/ XLS(受试者信息表) |
| 许可证 | Open Data Commons Attribution License v1.0(ODC-By 1.0) |
| 访问级别 | 开放(免费直接下载,无需注册或认证) |
| DUO 标签 | NRES, GRU |
| 语言 | 英文(EDF 头信息、标注标签) |
| 首发日期 | 2002-12-12(原始版)/ 2013-10-24(Expanded v1)/ 2018-03(Expanded v2,197 PSGs) |
| 最后更新 | 2018-04-05(v1.0.0 Expanded,文件更新日期) |
| 发布机构 | Bob Kemp, Sleep Centre, MCH-Westeinde Hospital, Den Haag, The Netherlands(托管于 PhysioNet) |
| 官方主页 | https://physionet.org/content/sleep-edfx/1.0.0/ |
| 下载地址 | https://physionet.org/files/sleep-edfx/1.0.0/(wget / AWS S3 / 直接下载) |
| DOI | 10.13026/C2X676(Expanded 版)/ 10.13026/C2C30J(原始版) |
| 引用次数 | 2,000+(Google Scholar,截至 2026-08)— 原始论文 Kemp et al., 2000 IEEE-BME |
| AI 就绪度评分 | ⭐⭐⭐⭐(4/5)— 标准化 EDF 格式 + R&K 专家分期 + 社区加载工具成熟;扣分项:无官方 train/test 划分、非标准电极位置、仅健康人群、旧式采集设备 |
| 页面状态 | published |
§0 E-E-A-T 信任声明与免责声明
| 字段 | 内容 |
|---|---|
| 医学审核者 | [千方病案医学编辑部] 交叉审核:§2 医学背景(ICD-11 映射、睡眠分期临床任务定义、R&K vs AASM 标准)、§7 偏倚分析 |
| 数据工程审核者 | [千方病案医学编辑部] 交叉审核:§4 DAIMS 数据字典、§5 数据划分策略、§6 预处理 Pipeline 和坑点 |
| 审核日期 | 2026-08-06 |
| 审核方式 | 交叉审核 |
| 利益冲突声明 | 无利益冲突。本页面未接受任何商业赞助。 |
医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。
技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。
数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。Sleep-EDF 采用 ODC-By 1.0 许可,允许免费使用(含商业用途),但需署名引用。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。
§1 数据集概览(Overview)
§1.0 📌 30 秒速览(Executive Summary)
Sleep-EDF 是荷兰 Bob Kemp 博士于 2002 年通过 PhysioNet 发布的多导睡眠图(PSG)数据集,后经 2013 年和 2018 年两次扩展,现有 197 份整夜 PSG 记录,来自约 100 名受试者,包含 EEG、EOG、EMG 等同步生理信号及专家手工分期标注。
它的独特价值在于定义了自动睡眠分期 AI 的评估标准——几乎所有新的睡眠分期深度学习模型都会在 Sleep-EDF 上验证性能,它之于睡眠分期领域的地位相当于 MNIST 之于手写数字识别。该数据集累计被引用 2,000 余次,是睡眠 AI 研究的事实标准基准。
你可以用它来:训练一个自动睡眠分期模型替代人工判读、研究不同睡眠阶段的 EEG 特征、或者评估算法在跨被试场景下的泛化能力。
§1.1 摘要
Sleep-EDF Database [Expanded] 包含来自两项独立研究的 197 份整夜多导睡眠图记录。Sleep Cassette Study(SC) 于 1987-1991 年在荷兰采集,研究了年龄对健康高加索人(25-101 岁)睡眠的影响,153 份记录在受试者家中使用改装的盒式磁带录音机记录约 20 小时。Sleep Telemetry Study(ST) 于 1994 年采集,研究了替马西泮对 22 名轻度入睡困难受试者的影响,44 份记录在医院使用微型遥测系统记录约 9 小时。所有 PSG 文件采用 EDF 格式,hypnogram 采用 EDF+ 格式,EEG/EOG 采样率为 100 Hz。睡眠分期由训练有素的技术师按 1968 年 Rechtschaffen & Kales 手册标注为 30 秒 epoch,分为 W、1、2、3、4、R、M、? 八类。社区常用做法是将 S3+S4 合并为 N3,形成 AASM 五分类(W/N1/N2/N3/REM)。
§1.2 战略价值分析
技术创新维度:Sleep-EDF 是最早通过 PhysioNet 公开发布的 PSG 数据集之一,开创了将整夜多导睡眠图以标准化 EDF 格式开放给研究社区的先例。其采用的 Fpz-Cz/Pz-Oz 替代电极位置——而非临床标准的 C4-A1/C3-A2——虽最初出于便携式家庭记录的技术限制,却意外催生了单通道 EEG 睡眠分期这一研究方向,极大降低了算法部署的硬件门槛。
应用影响维度:自 2017 年深度学习在睡眠分期领域取得突破以来,Sleep-EDF 已成为该领域无可争议的事实标准基准。DeepSleepNet、TinySleepNet、AttnSleep、XSleepNet 等里程碑模型均在 Sleep-EDF-20 和 Sleep-EDF-78 子集上验证性能。该数据集推动了从传统特征工程(频谱功率、熵、Hjorth 参数)到端到端深度学习(CNN、RNN、Transformer)的方法学演进,也暴露了 N1 期分类、跨被试泛化等核心挑战。
生态推动维度:Sleep-EDF 的开放许可(ODC-By 1.0,无需注册或认证)使其成为睡眠 AI 入门的首选数据集。PhysioNet 平台提供了 WFDB 工具链、AWS S3 镜像等多种便捷获取方式。社区已形成成熟的预处理 Pipeline 共识(30 秒 epoch、100 Hz 降采样、±30 分钟裁剪),并发展出 torcheeg、tslearn 等专用加载库。
§1.3 与同类数据集横向对比
| 数据集 | 样本量 | 模态 | 标注标准 | 通道数 | 核心差异化 |
|---|---|---|---|---|---|
| Sleep-EDF [Expanded] | 197 夜 / ~100 人 | EEG+EOG+EMG | R&K(1968) | 2 EEG + 1 EOG + 1 EMG | 事实标准基准,开放许可,单通道 EEG 研究首选 |
| SHHS | 6,441 夜 / 3,295 人 | EEG+EOG+EMG+ECG+呼吸 | R&K → AASM | 2 EEG + 多通道 | 大规模队列,含睡眠呼吸暂停数据 |
| MASS | 1,920 夜 / 200 人 | EEG+EOG+EMG+ECG | AASM | 多通道(20+) | 多通道高密度 EEG,需申请 |
| ISRUC-Sleep | 100+ 夜 | 多通道 PSG | AASM | 6-11 通道 | 含睡眠障碍患者,多标注者一致性 |
| PhysioNet Challenge 2018 | 1,000 夜 | 多通道 PSG | AASM | 多通道 | 竞赛数据集,含异常睡眠 |
| DREAMS | 20 夜 | EEG+EOG+EMG | R&K + AASM | 3 EEG + 2 EOG | 同时提供 R&K 和 AASM 双标注 |
§1.4 版本演进时间轴
| 时间 | 事件 |
|---|---|
| 1987-1991 | Sleep Cassette Study 数据采集(74 名健康受试者,家中记录) |
| 1994 | Sleep Telemetry Study 数据采集(22 名轻度入睡困难受试者,医院记录) |
| 2000-09 | 原始论文发表:Kemp et al., IEEE-BME 47(9):1185-1194 |
| 2002-12-12 | Sleep-EDF 原始版在 PhysioNet 发布(8 名受试者,8 份记录,314.6 MB) |
| 2013-10-24 | Expanded v1 发布,扩展至 61 份 PSG 记录(Sleep-EDF-20 子集) |
| 2018-03 | Expanded v2 发布,扩展至 197 份 PSG 记录(Sleep-EDF-78 子集) |
| 2018-04-05 | 文件更新(SHA256SUMS 添加) |
§1.5 典型 AI 应用场景
- 自动睡眠分期(Sleep Stage Classification):从原始 EEG 信号自动预测每个 30 秒 epoch 的睡眠阶段(W/N1/N2/N3/REM),替代人工判读
- 单通道 EEG 睡眠监测:仅使用 Fpz-Cz 或 Pz-Oz 单通道实现睡眠分期,推动便携式设备应用
- 跨被试泛化评估:评估模型在未见过的受试者上的泛化能力,衡量算法的临床可用性
- 睡眠结构分析:研究年龄、性别对睡眠结构(各阶段比例、转换模式)的影响
- 时序序列建模:利用睡眠阶段间的时序依赖关系(如 N1→N2→N3 的渐进过渡)提升分类性能
§2 医学背景(Medical Context)
§2.1 ICD-11 编码
| ICD-11 编码 | 中文名称 | 适用说明 |
|---|---|---|
| 7A4Z | 睡眠-觉醒障碍,未特指 | 数据集整体覆盖范围(睡眠监测与分期) |
| 7A00 | 失眠障碍 | ST 子集受试者有轻度入睡困难 |
| 7A20 | 睡眠相关呼吸障碍 | 睡眠呼吸暂停检测是常见下游应用 |
§2.1b SNOMED CT 映射
| 数据集标签 | ICD-11 | SNOMED CT | SNOMED CT 术语 |
|---|---|---|---|
| Wake (W) | 7A4Z | 248669003 | Wakefulness (finding) |
| Sleep stage N1 | 7A4Z | 24867002 | Sleep stage 1 (finding) |
| Sleep stage N2 | 7A4Z | 24867007 | Sleep stage 2 (finding) |
| Sleep stage N3 | 7A4Z | 24867008 | Sleep stage 3 (finding) |
| Sleep stage REM | 7A4Z | 89119006 | Sleep stage REM (finding) |
§2.2 疾病简介
睡眠分期是睡眠医学的基础评估手段。正常的整夜睡眠由非快速眼动(NREM)睡眠和快速眼动(REM)睡眠交替组成,NREM 进一步分为 N1(浅睡眠过渡)、N2(核心睡眠)和 N3(慢波深睡眠)三个阶段。一个健康成年人每晚约经历 4-6 个 90 分钟的睡眠周期。准确的睡眠分期对于诊断失眠、睡眠呼吸暂停、发作性睡病等睡眠-觉醒障碍至关重要。全球约 30% 的成年人受睡眠障碍影响,人工分期一份整夜 PSG 记录需 2-4 小时,严重制约了大规模睡眠监测的可行性。
§2.3 临床任务定义
任务:自动睡眠分期(Sleep Staging)——将连续 PSG 信号分割为 30 秒 epoch,为每个 epoch 分类至 W/N1/N2/N3/REM 五类睡眠阶段之一。
任务类型:时序多分类(Multi-class Time-series Classification),需考虑 epoch 间的时序依赖关系。
临床意义:替代或辅助人工判读,将整夜 PSG 分析时间从 2-4 小时缩短至分钟级,支撑大规模睡眠筛查和居家睡眠监测。
§2.4 患者人群特征
| 维度 | Sleep Cassette (SC) | Sleep Telemetry (ST) |
|---|---|---|
| 数据来源 | 荷兰,受试者家中 | 荷兰,医院病房 |
| 采集时间 | 1987-1991 | 1994 |
| 受试者数 | 74 名 | 22 名 |
| 年龄分布 | 25-101 岁(均值 ~59 岁) | 18-79 岁(均值 ~40 岁) |
| 性别比例 | 男 34 / 女 40 | 男 7 / 女 15 |
| 种族 | 高加索人 | 高加索人 |
| 健康状况 | 健康,无睡眠相关药物 | 轻度入睡困难,无其他药物 |
| 记录时长 | ~20 小时/份(含白天活动) | ~9 小时/份 |
| 记录数 | 153 份(3 份因磁带故障丢失) | 44 份 |
| 采集设备 | 改装 Walkman 盒式磁带录音机 | 微型遥测系统(FM 射频传输) |
| 研究目的 | 年龄对睡眠的影响 | 替马西泮对睡眠的影响 |
§2.5 临床显著性
人工睡眠分期是睡眠医学中劳动强度最高的环节之一。一份整夜 PSG 记录含约 1,000-1,200 个 30 秒 epoch,经验丰富的技术师需 2-4 小时完成判读,且不同判读者间的一致性约 80-85%(Cohen’‘’‘’‘’‘’‘’‘’‘’'s κ ~0.76)。自动睡眠分期 AI 有望将判读时间缩短至秒级,同时提高一致性,使大规模睡眠筛查和经济型居家睡眠监测成为可能。Sleep-EDF 作为该领域的事实标准基准,直接驱动了 DeepSleepNet、TinySleepNet 等轻量化模型的发展,为可穿戴睡眠监测设备的算法选型提供了可比较的评估平台。
§2.6 金标准
| 数据划分 | 标注方式 | 标注者 | 金标准性质 |
|---|---|---|---|
| 全部 197 份记录 | 逐 epoch(30 秒)手工分期 | 训练有素的睡眠技术师(身份编码在文件名第 8 个字母) | 参考标准(Reference Standard) |
| 标注依据 | 1968 年 Rechtschaffen & Kales 手册 | — | 基于 Fpz-Cz/Pz-Oz EEG(非标准 C4-A1/C3-A2) |
| 标注类别 | W, 1, 2, 3, 4, R, M(运动时间), ?(未评分) | — | 社区常用做法:合并 S3+S4 → N3,剔除 M 和 ?,形成 AASM 五分类 |
| 一致性信息 | 未提供多标注者一致性数据 | — | 单标注者,无 inter-rater reliability 报告 |
注意:Sleep-EDF 的分期标注基于 Fpz-Cz/Pz-Oz 电极位置,而非临床标准 C4-A1/C3-A2。这一替代电极方案由 van Sweden et al. (1990) 提出,研究表明在自动分期场景下与标准位置性能相当,但在临床实践中并非标准做法。
§3 数据集规格(Specifications)
§3.0 版本抉择矩阵
| 你的需求 | 推荐版本 | 大小 | 理由 |
|---|---|---|---|
| 快速复现论文 / 资源有限 | Sleep-EDF-20(2013 版 SC 子集,20 名受试者 / 39 份记录) | ~2 GB | 社区最常用子集,绝大多数论文在此验证,结果可比性最高 |
| 更大规模训练 / 跨被试泛化 | Sleep-EDF-78(2018 版 SC 子集,78 名受试者 / 153 份记录) | ~6 GB | 4 倍于 EDF-20 的数据量,更可靠的跨被试评估 |
| 完整数据 / 含轻度失眠受试者 | Expanded 完整版(SC + ST,197 份记录) | ~8.1 GB | 包含 ST 遥测研究数据,受试者人群更多样 |
| 仅了解数据集结构 | 原始版(2002 年发布,8 份记录) | ~314.6 MB | 已过时,仅作历史参考,不推荐用于新研究 |
§3.1 模态详细说明
Sleep-EDF 的核心模态为多导睡眠图(PSG),包含以下同步生理信号:
| 信号 | 电极/传感器 | 采样率 | 研究子集 | 说明 |
|---|---|---|---|---|
| EEG (Fpz-Cz) | 额极-中央双极导联 | 100 Hz | SC + ST | 前额叶-中央区脑电活动 |
| EEG (Pz-Oz) | 中央-枕部双极导联 | 100 Hz | SC + ST | 顶叶-枕区脑电活动 |
| EOG (水平) | 水平眼电 | 100 Hz | SC + ST | 水平眼球运动(REM 检测关键) |
| EMG (颏下) | 下颌肌电图 | 1 Hz(SC 包络)/ 100 Hz(ST 原始) | SC + ST | SC 为整流平滑后的 RMS 包络,ST 为原始信号 |
| 口鼻气流 | 热敏传感器 | 1 Hz | 仅 SC | 呼吸监测 |
| 直肠体温 | 体温探头 | 1 Hz | 仅 SC | 核心体温监测 |
| 事件标记 | 按钮/自动 | 1 Hz | SC + ST | ST 中含遥测 ID+标记+错误信号 |
关键差异:SC 子集的 EMG 为 1 Hz 采样的 RMS 包络(µV-mrs),而非原始 EMG 信号;ST 子集的 EMG 为 100 Hz 原始信号。这意味着 SC 的 EMG 几乎无法用于精细肌电分析,但可用于粗略的 REM 检测(REM 期肌张力降低)。
§3.2 样本总数
| 子集 | 受试者数 | 记录数 | 30 秒 epoch 总数 | W | N1 | N2 | N3 | REM |
|---|---|---|---|---|---|---|---|---|
| Sleep-EDF-20 | 20 | 39 | 42,308 | 8,285 (19.6%) | 2,804 (6.6%) | 17,799 (42.1%) | 5,703 (13.5%) | 7,717 (18.2%) |
| Sleep-EDF-78 | 78 | 153 | 195,479 | 65,951 (33.7%) | 21,522 (11.0%) | 69,132 (35.4%) | 13,039 (6.7%) | 25,835 (13.2%) |
| 完整版(SC+ST) | ~100 | 197 | ~240,000+ | — | — | — | — | — |
注意:上述 epoch 统计为预处理后(剔除 M 和 ? 类、合并 S3+S4 → N3、部分研究裁剪至睡眠前后 ±30 分钟)的结果。不同论文的 epoch 数可能略有差异。
§3.3 数据格式
| 文件类型 | 格式 | 大小范围 | 说明 |
|---|---|---|---|
| PSG 文件 | EDF | 44-50 MB/份 | 整夜多导睡眠图信号文件,含 EDF 头信息(患者性别/年龄、采集时间、通道标签、采样率、物理参数) |
| Hypnogram 文件 | EDF+ | 2-5 KB/份 | 睡眠分期标注文件,30 秒 epoch,标注 W/1/2/3/4/R/M/? |
| SC-subjects.xls | XLS | 23.5 KB | SC 子集受试者信息表(年龄、性别、记录日期等) |
| ST-subjects.xls | XLS | 23 KB | ST 子集受试者信息表 |
| RECORDS | TXT | 6.2 KB | 文件列表索引 |
| SHA256SUMS.txt | TXT | 38.9 KB | 校验和 |
§3.4 存储大小
| 版本 | 压缩后 | 解压后 |
|---|---|---|
| 原始版(2002) | ~80 MB | ~314.6 MB |
| Expanded v1(2013, 61 份) | ~2.5 GB | ~3 GB |
| Expanded v2(2018, 197 份) | ~5 GB | ~8.1 GB |
§3.5 标注方式
┌─────────────────────────────────────────────────────────────────┐
│ Sleep-EDF 标注流程 │
│ │
│ ① PSG 原始信号采集(100 Hz EEG/EOG + 1/100 Hz EMG) │
│ ↓ │
│ ② 信号分割为 30 秒 epoch │
│ ↓ │
│ ③ 训练有素的技术师逐 epoch 人工判读 │
│ ├─ 依据:1968 Rechtschaffen & Kales 手册 │
│ ├─ 电极:Fpz-Cz / Pz-Oz(非标准 C4-A1/C3-A2) │
│ └─ 技术师 ID:编码在 hypnogram 文件名第 8 个字母 │
│ ↓ │
│ ④ 标注为 8 类:W, 1, 2, 3, 4, R, M, ? │
│ ↓ │
│ ⑤ 社区常用后处理(研究论文中): │
│ ├─ 合并 S3+S4 → N3(AASM 五分类) │
│ ├─ 剔除 M(运动时间)和 ?(未评分)epoch │
│ └─ 可选:裁剪至睡眠前后 ±30 分钟 │
│ ↓ │
│ ⑥ 最终训练标签:W / N1 / N2 / N3 / REM(五分类) │
└─────────────────────────────────────────────────────────────────┘
§3.6 标注者资质
| 维度 | 说明 |
|---|---|
| 标注者身份 | 训练有素的睡眠技术师 |
| 标注者人数 | 未明确披露(至少 1 名,可能多名,身份编码在文件名中) |
| 标注标准 | 1968 Rechtschaffen & Kales 手册 |
| Inter-rater 一致性 | 未提供(无多标注者对比数据) |
| 标注质量控制 | 无公开的标注质量审核流程说明 |
| 已知局限 | 基于非标准电极位置分期;单标注者,无一致性检验;R&K 标准(1968)已过时,AASM(2007)为当前标准 |
§3.7 采集时间范围
- SC 研究:1987-1991 年
- ST 研究:1994 年
§3.8 地域覆盖
- 荷兰(单一国家)
- SC:受试者家中(家庭环境记录)
- ST:医院病房(住院环境记录)
§3.9 采集设备规格
| 设备 | SC 研究 | ST 研究 |
|---|---|---|
| 记录仪 | 改装 Walkman 盒式磁带录音机 | 微型遥测生物信号放大器 |
| 传输方式 | 磁带存储(离线) | FM 射频遥测(实时数字传输到 PC) |
| 采样精度 | 12 bit/sample | 12 bit/sample |
| 信号质量 | 磁带记录,可能存在机械噪声 | 遥测链路,可能存在射频干扰 |
| 便携性 | 便携(可穿戴) | 半便携(需在医院佩戴) |
| 局限性 | 磁带故障导致 3 份记录丢失 | 多受试者同时记录可能射频串扰 |
§3.10 深度溯源链
数据起源
├── 研究设计
│ ├── SC: Mourtazaev et al. (1995) — 年龄与性别对睡眠 EEG 慢波特征的影响
│ └── ST: 1994 年替马西泮药物试验(替马西泮 vs 安慰剂)
│
├── 受试者招募
│ ├── SC: 荷兰健康高加索人,25-101 岁,无睡眠相关药物 → 74 人入选
│ └── ST: 荷兰轻度入睡困难受试者,无其他药物 → 22 人入选
│
├── 数据采集
│ ├── SC: 家中佩戴盒式录音机,2 个连续日夜,~20h/份 → 153 份记录
│ │ └── 丢失:subject 36 第 1 夜、subject 52 第 1 夜、subject 13 第 2 夜
│ └── ST: 医院佩戴遥测系统,2 晚(药物+安慰剂),~9h/份 → 44 份记录
│
├── 信号数字化
│ ├── EEG/EOG: 100 Hz 采样,12 bit
│ ├── EMG (SC): 电子高通滤波→整流→低通滤波→RMS 包络,1 Hz 采样
│ └── EMG (ST): 原始信号,100 Hz 采样
│
├── 专家分期
│ ├── 按 1968 R&K 手册,30 秒 epoch
│ ├── 基于 Fpz-Cz/Pz-Oz EEG(非 C4-A1/C3-A2)
│ └── 标注为 W/1/2/3/4/R/M/?
│
├── 数据发布
│ ├── 2002: PhysioNet 原始版(8 份记录)
│ ├── 2013: Expanded v1(61 份记录)
│ └── 2018: Expanded v2(197 份记录,当前版本 v1.0.0)
│
└── 社区使用
├── 标准子集:Sleep-EDF-20(20 人/39 份)、Sleep-EDF-78(78 人/153 份)
├── 标准预处理:100 Hz → 100/50/25 Hz,30s epoch,Fpz-Cz 单通道
└── 标准评估:5-fold/10-fold/20-fold subject-wise CV,leave-one-subject-out
§4 数据结构详解(Data Schema)
§4.0 目录结构预览
sleep-edf-database-expanded-1.0.0/
├── sleep-cassette/ # SC 子集(153 份记录)
│ ├── SC4001E0-PSG.edf # Subject 04, Night 1, PSG 信号
│ ├── SC4001EC-Hypnogram.edf # Subject 04, Night 1, 睡眠分期
│ ├── SC4002E0-PSG.edf # Subject 04, Night 2, PSG 信号
│ ├── SC4002EC-Hypnogram.edf # Subject 04, Night 2, 睡眠分期
│ ├── SC4011E0-PSG.edf # Subject 11, Night 1
│ ├── SC4011EH-Hypnogram.edf
│ ├── ...
│ └── SC4192EP-Hypnogram.edf # 最后一份
│
├── sleep-telemetry/ # ST 子集(44 份记录)
│ ├── ST7011J0-PSG.edf # Subject 01, Night 1 (placebo)
│ ├── ST7011JP-Hypnogram.edf
│ ├── ST7012J0-PSG.edf # Subject 01, Night 2 (temazepam)
│ ├── ST7012JA-Hypnogram.edf
│ ├── ...
│ └── ST7222JA-Hypnogram.edf # 最后一份
│
├── RECORDS # 全部文件列表
├── RECORDS-v1 # v1 版文件列表
├── SC-subjects.xls # SC 受试者信息表
├── ST-subjects.xls # ST 受试者信息表
└── SHA256SUMS.txt # 校验和
文件命名规则:
-
SC 文件:
SC4ssNEO-PSG.edf/SC4ssNEc-Hypnogram.edfss= 受试者编号(如 00、01、11、12…)N= 夜晚编号(1 或 2)E= 记录设备标识O= 采集地点标识c(Hypnogram 文件名中的第 8 个字母)= 技术师 ID
-
ST 文件:
ST7ssNJ0-PSG.edf/ST7ssNJp-Hypnogram.edfss= 受试者编号N= 夜晚编号(1 = 安慰剂,2 = 替马西泮)J0= 遥测设备标识p(Hypnogram 文件名中的第 8 个字母)= 技术师 ID
§4.1 DAIMS 标准化字段描述表
| 字段名 | 数据类型 | 说明 | 示例值 | AI 用途 | 观测误差 | 信息性缺失编码 | 取值范围 |
|---|---|---|---|---|---|---|---|
| subject_id | string | 受试者匿名 ID | “SC4001” | 被试级分组 | — | — | SC4ssN / ST7ssN |
| age | integer | 受试者年龄 | 57 | 协变量/分层 | 自报年龄 | — | 25-101(SC)/ 18-79(ST) |
| gender | string | 性别 | “M”/“F” | 协变量/公平性 | — | — | M/F |
| study_type | string | 研究子集 | “cassette”/“telemetry” | 分层/域适应 | — | — | cassette/telemetry |
| night | integer | 夜晚编号 | 1, 2 | 重复测量分组 | — | — | 1-2 |
| epoch_idx | integer | 30 秒 epoch 序号 | 0, 1, 2, … | 时序建模 | — | — | 0~~3000 |
| eeg_fpz_cz | float[] | Fpz-Cz EEG 信号 (µV) | [12.3, -5.1, …] | 分类特征输入 | 电极阻抗/磁带噪声 | — | ±200 µV(近似) |
| eog_horizontal | float[] | 水平 EOG 信号 (µV) | [23.1, -8.2, …] | REM 检测 | — | — | ±500 µV(近似) |
| emg_submental | float[] | 颏下 EMG 信号 | SC: 1 Hz 包络 / ST: 100 Hz 原始 | REM/Tonic 区分 | SC 包络信息损失 | — | SC: µV-mrs / ST: µV |
| sleep_stage | string | 睡眠分期标签 | “W”/“1”/“2”/“3”/“4”/“R”/“M”/“?” | 分类目标 | 单标注者 | “M”=运动时间, “?”=未评分 | W/1/2/3/4/R/M/? |
| oro_nasal_airflow | float[] | 口鼻气流 (SC only) | — | 呼吸监测 | 1 Hz 低分辨率 | — | — |
| rectal_temp | float[] | 直肠体温 (SC only) | 36.8 | 体温节律 | — | — | 35-38 °C |
§4.2 标签分布统计
Sleep-EDF-20(20 名受试者,39 份记录,预处理后):
| 睡眠阶段 | Epoch 数 | 占比 | 说明 |
|---|---|---|---|
| W (Wake) | 8,285 | 19.6% | 含睡眠前后清醒期 |
| N1 | 2,804 | 6.6% | 最少,浅睡眠过渡期 |
| N2 | 17,799 | 42.1% | 最多,核心睡眠 |
| N3 | 5,703 | 13.5% | 慢波深睡眠(S3+S4 合并) |
| REM | 7,717 | 18.2% | 快速眼动 |
| 总计 | 42,308 | 100% | — |
Sleep-EDF-78(78 名受试者,153 份记录,预处理后):
| 睡眠阶段 | Epoch 数 | 占比 | 说明 |
|---|---|---|---|
| W (Wake) | 65,951 | 33.7% | 占比显著高于 EDF-20(含更多老年受试者白天清醒) |
| N1 | 21,522 | 11.0% | 仍为少数类 |
| N2 | 69,132 | 35.4% | 仍为最大睡眠类 |
| N3 | 13,039 | 6.7% | 最少(老年人深睡眠减少) |
| REM | 25,835 | 13.2% | — |
| 总计 | 195,479 | 100% | — |
关键观察:EDF-20 与 EDF-78 的标签分布差异显著——EDF-78 中 W 占比从 19.6% 升至 33.7%,N3 从 13.5% 降至 6.7%,反映了 EDF-78 包含更多老年受试者(深睡眠随年龄减少,睡眠片段化增加)。这直接影响模型在两个子集上的性能可比性。
§4.3 关键字段描述性统计
| 统计项 | SC 子集 | ST 子集 |
|---|---|---|
| 平均记录时长 | ~20 小时 | ~9 小时 |
| 平均 epoch 数/份 | ~2,400 | ~1,080 |
| EEG 信号范围 | ±200 µV(近似) | ±200 µV(近似) |
| 平均年龄 | ~59 岁 | ~40 岁 |
| 年龄范围 | 25-101 岁 | 18-79 岁 |
§4.4 数据层级关系
数据集 → 研究(SC / ST)→ 受试者 → 夜晚记录 → 30 秒 epoch → 信号采样点
↓
hypnogram 标签
- 一个受试者有 1-2 份记录(SC: 2 夜,ST: 2 夜)
- 一份记录含 1 个 PSG 文件 + 1 个 Hypnogram 文件
- 一份记录约 1,000-2,400 个 epoch(取决于记录时长)
- 一个 epoch 含 100 Hz × 30s = 3,000 个采样点/通道
§4.5 缺失值情况
| 缺失类型 | 说明 | 处理建议 |
|---|---|---|
| 完全缺失记录 | SC: subject 36 第 1 夜、subject 52 第 1 夜、subject 13 第 2 夜(磁带故障) | 直接排除,不影响分析 |
| M 类(运动时间) | 体动导致的信号伪影,无法分期 | 剔除该 epoch |
| ? 类(未评分) | 技术师无法判读的 epoch | 剔除该 epoch |
| SC 的 EMG 原始信号 | SC 仅保留 1 Hz RMS 包络,无原始 EMG | SC 子集无法用于精细 EMG 分析 |
| ST 的呼吸/体温信号 | ST 子集不含口鼻气流和直肠体温 | ST 子集无法用于呼吸/体温分析 |
§5 数据划分与使用建议(Splits & Usage)
§5.1 官方划分
Sleep-EDF 不提供官方 train/val/test 划分。 这是该数据集最大的使用痛点之一——不同论文使用不同的划分策略,导致绝对性能数值不可直接比较。
§5.2 社区常用划分策略
| 策略 | 说明 | 适用场景 | 代表论文 |
|---|---|---|---|
| Subject-wise K-fold CV | 按受试者分组,K 折交叉验证 | 跨被试泛化评估 | TinySleepNet (K=10), DeepSleepNet (K=20) |
| Leave-One-Subject-Out (LOSO) | 每次留 1 名受试者作测试集 | 严格跨被试评估 | 部分早期论文 |
| Fixed split | 前 N 名受试者训练,剩余测试 | 快速实验 | 部分工程论文 |
| Random split (不推荐) | 随机划分 epoch | 会导致数据泄漏 | 不推荐 |
关键警告:绝不可按 epoch 随机划分——同一受试者的 epoch 间高度相关(时序依赖+个体特征),随机划分会导致训练集和测试集数据泄漏,性能虚高 10-15%。
§5.3 推荐划分方案
Sleep-EDF-20 推荐方案:20-fold subject-wise CV(每折 1 名受试者作测试集,其余 19 名训练)
Sleep-EDF-78 推荐方案:10-fold subject-wise CV(78 名受试者随机分 10 组,每组 ~8 人作测试集)
§5.4 评估指标
| 指标 | 说明 | 共识度 |
|---|---|---|
| Overall Accuracy (ACC) | 总体准确率 | ✅ 所有论文均报告 |
| Macro-F1 (MF1) | 宏平均 F1 分数 | ✅ 推荐主指标(考虑类别不平衡) |
| Cohen’‘’‘’‘’‘’‘’‘’‘’'s Kappa (κ) | 一致性系数 | ✅ 常用 |
| Per-class F1 | 各类 F1 分数 | ✅ N1 F1 是关键指标 |
| Confusion Matrix | 混淆矩阵 | ✅ 常用 |
| Sensitivity/Specificity | 灵敏度/特异度 | 常用 |
§5.5 预处理共识
| 步骤 | 共识做法 | 备注 |
|---|---|---|
| 1. 通道选择 | Fpz-Cz 单通道(或 Fpz-Cz + Pz-Oz 双通道) | 单通道为最常用配置 |
| 2. 采样率 | 保持 100 Hz(或降采样至 50/25 Hz) | TinySleepNet 使用 100 Hz |
| 3. Epoch 分割 | 30 秒 | 与 R&K 标注一致 |
| 4. 标签合并 | S3+S4 → N3 | AASM 五分类 |
| 5. 标签剔除 | 剔除 M 和 ? | 运动时间和未评分 epoch |
| 6. 时间裁剪 | 保留睡眠前后 ±30 分钟 | 剔除无关清醒期,减少 W 占比 |
| 7. 滤波 | 0.5-30 Hz 带通(可选) | 去除直流漂移和高频噪声 |
| 8. 归一化 | Z-score(可选) | 部分论文不归一化 |
§5.6 数据泄漏风险
| 风险源 | 严重程度 | 说明 |
|---|---|---|
| 按 epoch 随机划分 | 🔴 极高 | 同一受试者 epoch 进入训练和测试集 |
| 同一受试者两夜分别进训练和测试 | 🟡 中 | 两夜数据高度相关 |
| 不裁剪 W 期 | 🟡 中 | W 占比过高导致模型偏向 W 分类 |
| 数据增强后泄漏 | 🟡 中 | 增强后的 epoch 可能泄漏到测试集 |
§6 AI 就绪指南(AI-Ready Guide)
§6.1 快速上手
<details>
<summary>📋 MNE-Python 快速上手代码</summary>
# ========================================
# Sleep-EDF 快速上手 — MNE-Python 版
# 环境要求: mne>=1.0, numpy, pandas
#
# ⚠️ 目录结构预期:
# 请将下载的数据解压至 ./data/ 目录,确保以下结构:
# ./data/
# ├── sleep-cassette/
# │ ├── SC4001E0-PSG.edf
# │ ├── SC4001EC-Hypnogram.edf
# │ └── ...
# └── sleep-telemetry/
# └── ...
#
# 下载命令:
# wget -r -N -c -np https://physionet.org/files/sleep-edfx/1.0.0/
# ========================================
import mne
import numpy as np
import os
# 加载一份 PSG 文件
psg_file = "./data/sleep-cassette/SC4001E0-PSG.edf"
hypno_file = "./data/sleep-cassette/SC4001EC-Hypnogram.edf"
# 读取 PSG 信号
raw = mne.io.read_raw_edf(psg_file, preload=True)
print(f"通道: {raw.info[''''''''''''''''ch_names'''''''''''''''']}")
print(f"采样率: {raw.info[''''''''''''''''sfreq'''''''''''''''']} Hz")
print(f"时长: {raw.times[-1]/3600:.1f} 小时")
# 读取 hypnogram
annotationevent-blocked= mne.read_annotations(hypno_file)
print(f"标注数: {len(annotations)}")
print(f"前 10 个标注: {list(zip(annotations.description[:10], annotations.onset[:10]))}")
# 将标注映射到原始信号
raw.set_annotations(annotations, emit_warning=False)
# 提取 Fpz-Cz 通道,分割为 30 秒 epoch
raw.pick_channels(["EEG Fpz-Cz"])
epochs = mne.make_fixed_length_epochs(raw, duration=30, preload=True)
# 获取 epoch 数据和标签
X = epochs.get_data() # shape: (n_epochs, 1, 3000)
print(f"Epoch 数据形状: {X.shape}")
# 从标注中提取每个 epoch 的睡眠阶段
events = mne.events_from_annotations(raw, event_id=lambda x: {
"Sleep stage W": 0, "Sleep stage 1": 1, "Sleep stage 2": 2,
"Sleep stage 3": 3, "Sleep stage 4": 3, # S3+S4 → N3
"Sleep stage R": 4,
}.get(x, -1), use_rounding=False)
# 获取标签
labels = events[1][:, 2]
# 剔除未标注 epoch (label == -1)
valid_mask = labels != -1
X = X[valid_mask]
labels = labels[valid_mask]
print(f"有效 epoch 数: {len(labels)}")
print(f"标签分布: W={np.sum(labels==0)}, N1={np.sum(labels==1)}, "
f"N2={np.sum(labels==2)}, N3={np.sum(labels==3)}, REM={np.sum(labels==4)}")
</details>
§6.2 数据获取
| 方式 | 命令/链接 | 大小 | 说明 |
|---|---|---|---|
| wget 下载 | wget -r -N -c -np https://physionet.org/files/sleep-edfx/1.0.0/ |
~5 GB(压缩) | 最常用,支持断点续传 |
| AWS S3 同步 | aws s3 sync no-sign-request s3://physionet-open/sleep-edfx/1.0.0/ DESTINATION |
~5 GB | 高速下载,需 AWS CLI |
| 直接下载 ZIP | https://physionet.org/files/sleep-edfx/1.0.0/ | ~5 GB | 浏览器直接下载 |
| Google Cloud | gsutil -m cp -r gs://sleep-edfx-1.0.0.physionet.org DESTINATION |
~5 GB | Google Cloud 用户 |
§6.3 预处理 Pipeline
<details>
<summary>📋 完整预处理 Pipeline(MNE-Python)</summary>
import mne
import numpy as np
from pathlib import Path
def preprocess_sleep_edf(data_dir, output_dir, channels=["EEG Fpz-Cz"],
sfreq_target=100, epoch_len=30, trim_minutes=30):
"""
Sleep-EDF 完整预处理 Pipeline
参数:
data_dir: 解压后的数据目录
output_dir: 预处理结果输出目录
channels: 使用的 EEG 通道
sfreq_target: 目标采样率 (Hz)
epoch_len: epoch 长度 (秒)
trim_minutes: 睡眠前后保留的清醒时间 (分钟)
"""
output_dir = Path(output_dir)
output_dir.mkdir(parents=True, exist_ok=True)
# R&K → AASM 映射
stage_map = {
"Sleep stage W": 0,
"Sleep stage 1": 1,
"Sleep stage 2": 2,
"Sleep stage 3": 3,
"Sleep stage 4": 3, # S3+S4 → N3
"Sleep stage R": 4,
# M 和 ? 将被剔除
}
all_epochs = []
all_labels = []
subject_ids = []
psg_files = sorted(Path(data_dir).glob("sleep-cassette/SC*PSG.edf"))
for psg_file in psg_files:
subject_id = psg_file.name[:6] # e.g., "SC4001"
hypno_file = psg_file.name.replace("PSG", "Hypnogram")
hypno_path = psg_file.parent / hypno_file
if not hypno_path.exists():
print(f"Warning: hypnogram not found for {psg_file.name}")
continue
# 1. 读取 PSG
raw = mne.io.read_raw_edf(psg_file, preload=True, verbose=False)
raw.pick_channels(channels)
# 2. 降采样(如需要)
if sfreq_target < raw.info["sfreq"]:
raw.resample(sfreq_target, verbose=False)
# 3. 带通滤波 0.5-30 Hz
raw.filter(0.5, 30, fir_design="firwin", verbose=False)
# 4. 读取 hypnogram 并映射
annotationevent-blocked= mne.read_annotations(hypno_path)
raw.set_annotations(annotations, emit_warning=False)
events, event_id = mne.events_from_annotations(
raw, event_id=stage_map, chunk_duration=epoch_len,
use_rounding=False, verbose=False
)
# 5. 分割为 epoch
epochs = mne.Epochs(
raw, events, event_id, tmin=0, tmax=epoch_len - 1/raw.info["sfreq"],
baseline=None, preload=True, verbose=False
)
X = epochs.get_data() # (n_epochs, n_channels, n_samples)
y = epochs.events[:, 2]
# 6. 剔除无效标签 (event_id 中不包含的)
valid_mask = y != -1
X = X[valid_mask]
y = y[valid_mask]
# 7. 裁剪:保留睡眠前后 trim_minutes 分钟的 W 期
sleep_start = np.where(y != 0)[0][0] if np.any(y != 0) else 0
sleep_end = np.where(y != 0)[0][-1] if np.any(y != 0) else len(y) - 1
trim_epochs = int(trim_minutes * 60 / epoch_len)
start = max(0, sleep_start - trim_epochs)
end = min(len(y), sleep_end + trim_epochs + 1)
X = X[start:end]
y = y[start:end]
all_epochs.append(X)
all_labels.append(y)
subject_ids.extend([subject_id] * len(X))
print(f"{subject_id}: {len(X)} epochs")
# 合并所有受试者数据
X_all = np.concatenate(all_epochs, axis=0)
y_all = np.concatenate(all_labels, axis=0)
subject_all = np.array(subject_ids)
# Z-score 归一化(按受试者)
for sid in np.unique(subject_all):
mask = subject_all == sid
X_all[mask] = (X_all[mask] - X_all[mask].mean()) / (X_all[mask].std() + 1e-8)
# 保存
np.save(output_dir / "X.npy", X_all.astype(np.float32))
np.save(output_dir / "y.npy", y_all.astype(np.int64))
np.save(output_dir / "subjects.npy", subject_all)
print(f"\n总计: {len(y_all)} epochs")
stage_names = ["W", "N1", "N2", "N3", "REM"]
for i, name in enumerate(stage_names):
print(f" {name}: {np.sum(y_all == i)} ({np.mean(y_all == i)*100:.1f}%)")
return X_all, y_all, subject_all
# 运行
# X, y, subjects = preprocess_sleep_edf("./data/", "./preprocessed/")
</details>
§6.4 框架 DataLoader
<details>
<summary>📋 PyTorch DataLoader(含 subject-wise K-fold CV)</summary>
import torch
from torch.utils.data import Dataset, DataLoader
import numpy as np
from sklearn.model_selection import KFold
class SleepEDFDataset(Dataset):
"""Sleep-EDF PyTorch Dataset"""
STAGE_NAMES = ["W", "N1", "N2", "N3", "REM"]
def __init__(self, X, y, subjects=None, augment=False):
"""
X: (N, C, L) float32 — epoch 数据
y: (N,) int64 — 标签 (0-4)
subjects: (N,) — 受试者 ID(用于分组)
"""
self.X = torch.from_numpy(X).float()
self.y = torch.from_numpy(y).long()
self.subjects = subjects
self.augment = augment
def __len__(self):
return len(self.y)
def __getitem__(self, idx):
x = self.X[idx]
if self.augment:
# 时移:随机偏移 ±50 samples
shift = np.random.randint(-50, 50)
x = torch.roll(x, shift, dims=-1)
# 加高斯噪声
x = x + torch.randn_like(x) * 0.01
return x, self.y[idx]
def get_subject_wise_split(X, y, subjects, test_subjects):
"""按受试者划分训练/测试集"""
test_mask = np.isin(subjects, test_subjects)
train_mask = ~test_mask
return (X[train_mask], y[train_mask], subjects[train_mask],
X[test_mask], y[test_mask], subjects[test_mask])
def kfold_subject_wise(X, y, subjects, k=10, batch_size=64):
"""K-fold subject-wise 交叉验证生成器"""
unique_subjects = np.unique(subjects)
kf = KFold(n_splits=k, shuffle=True, random_state=42)
for fold, (train_idx, test_idx) in enumerate(kf.split(unique_subjects)):
train_subjects = unique_subjects[train_idx]
test_subjects = unique_subjects[test_idx]
X_tr, y_tr, _, X_te, y_te, _ = get_subject_wise_split(
X, y, subjects, test_subjects
)
# 从训练集中划出 10% 作为验证集(按受试者)
n_val_subjects = max(1, len(train_subjects) // 10)
val_subjects = train_subjects[:n_val_subjects]
train_subjects_final = train_subjects[n_val_subjects:]
X_tr_final, y_tr_final, _, X_val, y_val, _ = get_subject_wise_split(
X_tr, y_tr, np.array(train_subjects)[train_idx], val_subjects
)
train_ds = SleepEDFDataset(X_tr_final, y_tr_final, augment=True)
val_ds = SleepEDFDataset(X_val, y_val)
test_ds = SleepEDFDataset(X_te, y_te)
train_loader = DataLoader(train_ds, batch_size=batch_size, shuffle=True, num_workers=4)
val_loader = DataLoader(val_ds, batch_size=batch_size, shuffle=False)
test_loader = DataLoader(test_ds, batch_size=batch_size, shuffle=False)
yield fold, train_loader, val_loader, test_loader
# 使用示例
# X = np.load("./preprocessed/X.npy")
# y = np.load("./preprocessed/y.npy")
# subjects = np.load("./preprocessed/subjects.npy")
#
# for fold, train_loader, val_loader, test_loader in kfold_subject_wise(X, y, subjects, k=10):
# print(f"Fold {fold}: train={len(train_loader.dataset)}, "
# f"val={len(val_loader.dataset)}, test={len(test_loader.dataset)}")
# # 训练模型...
</details>
<details>
<summary>📋 TensorFlow / Keras DataLoader</summary>
import tensorflow as tf
import numpy as np
def create_tf_dataset(X, y, batch_size=64, augment=False, shuffle=True):
"""创建 TensorFlow Dataset"""
dataset = tf.data.Dataset.from_tensor_slices((X.astype(np.float32), y.astype(np.int32)))
if shuffle:
dataset = dataset.shuffle(buffer_size=len(y))
if augment:
def augment_fn(x, label):
# 时移增强
shift = tf.random.uniform([], -50, 50, dtype=tf.int32)
x = tf.roll(x, shift, axis=-1)
# 高斯噪声
x = x + tf.random.normal(tf.shape(x), stddev=0.01)
return x, label
dataset = dataset.map(augment_fn, num_parallel_calls=tf.data.AUTOTUNE)
dataset = dataset.batch(batch_size).prefetch(tf.data.AUTOTUNE)
return dataset
# 使用示例
# train_ds = create_tf_dataset(X_train, y_train, augment=True)
# val_ds = create_tf_dataset(X_val, y_val, shuffle=False)
# test_ds = create_tf_dataset(X_test, y_test, shuffle=False)
</details>
§6.5 常见坑点
⚠️ 坑点 1:无官方划分导致论文间性能不可比(分类:评估误用)
问题:Sleep-EDF 不提供官方 train/test 划分。不同论文使用不同的 K-fold 折数(5/10/20-fold)、不同的裁剪策略(是否裁剪 W 期)、不同的 epoch 筛选标准,导致同一模型的报告性能可能相差 5-10%。
症状:复现论文时发现性能与原文差距 >3%,且无法确定原因是代码实现差异还是数据划分差异。
解决:
- 始终使用 subject-wise K-fold CV(推荐 10-fold for EDF-78,20-fold for EDF-20)
- 明确报告预处理细节:裁剪策略、滤波参数、epoch 筛选标准
- 对比论文时,关注相对提升(ΔACC/ΔMF1)而非绝对数值
- 参考社区共识实现:TinySleepNet 官方代码仓库的预处理流程被广泛采用
参考:Supratak et al. (2020), “TinySleepNet: An Efficient Deep Learning Model for Sleep Stage Scoring Based on Raw Single-Channel EEG.” — 提供了标准化的预处理和评估流程。
⚠️ 坑点 2:按 epoch 随机划分导致数据泄漏(分类:数据泄漏)
问题:同一受试者的 epoch 间高度相关(共享个体 EEG 特征 + 时序依赖)。若按 epoch 随机划分训练/测试集,训练集中的 epoch 与测试集中的 epoch 来自同一受试者,模型只需学习个体特征即可"作弊"。
症状:报告性能异常高(ACC >95%,MF1 >90%),但模型在未见受试者上性能骤降 10-15%。
解决:
- 必须按受试者划分——训练集和测试集的受试者完全不重叠
- 使用
sklearn.model_selection.GroupKFold或GroupShuffleSplit,将受试者 ID 作为 group- 验证:打印训练集和测试集的受试者列表,确认无交集
参考:Sleep-EDF 官方文档明确建议按受试者划分。
⚠️ 坑点 3:N1 期严重欠采样导致 MF1 偏低(分类:偏倚陷阱)
问题:N1 期在 EDF-20 中仅占 6.6%,在 EDF-78 中仅占 11.0%。N1 是睡眠阶段中最难分类的过渡期,其 EEG 特征介于 W 和 N2 之间。模型倾向于将 N1 误分为 W 或 N2,导致 N1 的 F1 分数通常仅 40-60%,远低于其他阶段(W/N2/N3/REM 通常 >80%)。
症状:Overall ACC 看起来不错(~85%),但 N1 F1 仅 ~50%,Macro-F1 被 N1 拉低 5-10%。
解决:
- 类别加权交叉熵:权重与类别频率成反比,如
weights = n_total / (n_classes * n_class)- 过采样 N1:对 N1 epoch 进行数据增强(时移、加噪、频谱扰动)
- Focal Loss:降低易分类样本的损失权重,聚焦难分类的 N1
- 报告 N1 F1:始终单独报告 N1 的 F1 分数,不要仅看 ACC
- SMOTE/ADASYN:对 N1 进行合成过采样
参考:He et al. (2022), “Single-channel EEG sleep staging based on data augmentation and cross-subject discrepancy alleviation.” Computers in Biology and Medicine 149:106044.
⚠️ 坑点 4:W 期占比过高导致模型偏向 W(分类:偏倚陷阱)
问题:SC 研究记录约 20 小时(含白天活动),其中大量时间是清醒期。若不做裁剪直接使用所有 epoch,W 期占比在 EDF-78 中高达 33.7%,模型倾向于多预测 W 以提高 ACC。
症状:Overall ACC 高但实际睡眠分期能力差;W 期 Recall 高但其他期 Recall 低;模型对短时间睡眠记录表现差。
解决:
- 裁剪策略:仅保留睡眠开始前 30 分钟至睡眠结束后 30 分钟的 epoch
- 下采样 W:随机采样 W 期使其与其他类别数量相当
- 报告 per-class F1:不要仅依赖 Overall ACC
参考:TinySleepNet 官方实现采用 ±30 分钟裁剪策略。
⚠️ 坑点 5:R&K 与 AASM 标准差异(分类:标签理解)
问题:Sleep-EDF 原始标注按 1968 年 R&K 标准(W/1/2/3/4/R/M/?,八类),而当前临床标准为 2007 年 AASM(W/N1/N2/N3/REM,五类)。社区通用做法是合并 S3+S4 → N3,但不同论文的合并方式可能不同——有些论文保留 S3 和 S4 不合并,有些将 M/? 替换为 W 而非剔除。
症状:复现论文时标签数不一致;同一模型在不同论文中的性能差异来自标签处理而非模型。
解决:
- 统一采用 AASM 五分类:W/N1/N2/N3/REM
- 合并 S3+S4 → N3
- 剔除 M(运动时间)和 ?(未评分)epoch,不要替换为其他类别
- 在论文中明确描述标签处理方式
参考:Phan et al. (2021), “XSleepNet: Multi-modal Cross-attention Network for Automatic Sleep Staging.” — 提供了标准化的 R&K → AASM 映射流程。
⚠️ 坑点 6:SC 与 ST 子集异构性(分类:工程陷阱)
问题:SC 和 ST 子集在多个维度上存在差异:①受试者人群不同(健康 vs 轻度失眠);②EMG 采样率不同(1 Hz 包络 vs 100 Hz 原始);③ST 不含呼吸和体温信号;④记录时长不同(~20h vs ~9h);⑤采集设备不同(磁带 vs 遥测)。若将 SC 和 ST 混合训练而不做域适应,可能导致性能下降。
症状:在 SC 上训练、ST 上测试时性能显著下降;混合训练后整体性能不如仅用 SC 训练。
解决:
- 推荐仅使用 SC 子集(社区主流做法,即 Sleep-EDF-20 和 Sleep-EDF-78)
- 若必须使用 ST,需对 EMG 信号做统一处理(如对 ST 的 EMG 也提取 RMS 包络降至 1 Hz)
- 报告实验结果时明确说明使用了哪些子集
- 考虑域适应方法(如 DANN、MMD)缓解 SC-ST 分布差异
参考:绝大多数 SOTA 论文(DeepSleepNet、TinySleepNet、AttnSleep、XSleepNet)仅使用 SC 子集。
§6.6 数据增强策略
| 方法 | 安全性 | 说明 | 推荐参数 |
|---|---|---|---|
| 时移(Time Shift) | ✅ 安全 | 随机循环偏移 ±50 samples(0.5s) | shift ∈ [-50, 50] |
| 高斯噪声 | ✅ 安全 | 添加微小高斯噪声 | σ = 0.01 × 信号标准差 |
| 频谱扰动 | ✅ 安全 | 微扰时频谱幅度 | 扰动幅度 ±10% |
| 随机裁剪 | ✅ 安全 | 从 30s epoch 中随机裁取 29s | 裁剪 1s |
| 信号缩放 | ✅ 安全 | 全局缩放信号幅度 | scale ∈ [0.9, 1.1] |
| Mixup | ✅ 安全 | 同类 epoch 线性混合 | α = 0.2 |
| 时间反转 | ⚠️ 谨慎 | 反转时间轴——可能破坏睡眠阶段时序特征 | 仅用于频域特征 |
| 频率掩码 | ⚠️ 谨慎 | 随机遮蔽某频段——可能移除关键频段 | 仅遮蔽 >30Hz |
| 通道交换 | ❌ 危险 | Fpz-Cz 和 Pz-Oz 交换——信号物理含义不同 | 不推荐 |
| GAN 生成 | ❌ 危险 | 生成假 EEG 信号——可能引入伪影 | 不推荐 |
§6.7 模型推荐配置
| 模型 | 参数量 | 输入 | EDF-20 ACC | EDF-78 ACC | 推荐场景 | 代码 |
|---|---|---|---|---|---|---|
| TinySleepNet | ~0.4M | 单通道 raw EEG, 100Hz | 85.4% | 83.1% | 轻量级/边缘设备 | GitHub |
| DeepSleepNet | ~4.5M | 单通道 raw EEG, 100Hz | 82.0% | 77.8% | 经典基线 | GitHub |
| AttnSleep | ~1.2M | 单通道 raw EEG, 100Hz | 84.4% | 81.3% | 注意力机制基线 | GitHub |
| XSleepNet2 | ~2.1M | 单通道 raw+频谱, 100Hz | 86.3% | — | 多模态输入 | GitHub |
| CNN-BiGRU+MHSA | ~3.0M | 单通道, 数据平衡 | 90.8% | — | 数据增强+注意力 | — |
§6.8 硬件配置
| 配置级别 | GPU | 显存 | 磁盘 | 训练时间(EDF-78, 10-fold) |
|---|---|---|---|---|
| 最低配置 | GTX 1660 Ti | 6 GB | 20 GB SSD | ~8 小时/fold |
| 推荐配置 | RTX 3090 / A100 | 24 GB | 50 GB SSD | ~2 小时/fold |
| 高性能配置 | A100 × 2 | 80 GB | 100 GB NVMe | ~1 小时/fold |
§6.9 评估指标代码
<details>
<summary>📋 评估指标计算代码</summary>
import numpy as np
from sklearn.metrics import (accuracy_score, f1_score, cohen_kappa_score,
confusion_matrix, classification_report)
def evaluate_sleep_staging(y_true, y_pred, stage_names=None):
"""
睡眠分期完整评估指标
参数:
y_true: (N,) int — 真实标签 (0-4)
y_pred: (N,) int — 预测标签 (0-4)
stage_names: list — 阶段名称
返回:
dict — 各项指标
"""
if stage_names is None:
stage_names = ["W", "N1", "N2", "N3", "REM"]
# Overall Accuracy
acc = accuracy_score(y_true, y_pred)
# Macro-F1 (推荐主指标)
mf1 = f1_score(y_true, y_pred, average="macro")
# Cohen''''''''''''''''s Kappa
kappa = cohen_kappa_score(y_true, y_pred)
# Per-class F1
per_class_f1 = f1_score(y_true, y_pred, average=None, labels=range(5))
# Per-class precision/recall
cm = confusion_matrix(y_true, y_pred, labels=range(5))
# Sensitivity (Recall) per class
sensitivity = cm.diagonal() / cm.sum(axis=1).clip(min=1)
# Specificity per class
specificity = []
for i in range(5):
tn = cm.sum() - cm[i, :].sum() - cm[:, i].sum() + cm[i, i]
fp = cm[:, i].sum() - cm[i, i]
specificity.append(tn / (tn + fp) if (tn + fp) > 0 else 0)
# 打印结果
print(f"{''''''''''''''''=''''''''''''''''*50}")
print(f"Overall Accuracy: {acc:.4f} ({acc*100:.2f}%)")
print(f"Macro-F1: {mf1:.4f} ({mf1*100:.2f}%)")
print(f"Cohen''''''''''''''''s Kappa: {kappa:.4f}")
print(f"{''''''''''''''''=''''''''''''''''*50}")
print(f"\n{''''''''''''''''Stage'''''''''''''''':<8} {''''''''''''''''F1'''''''''''''''':>8} {''''''''''''''''Sens'''''''''''''''':>8} {''''''''''''''''Spec'''''''''''''''':>8} {''''''''''''''''Support'''''''''''''''':>10}")
print(f"{''''''''''''''''-''''''''''''''''*44}")
for i, name in enumerate(stage_names):
support = cm[i, :].sum()
print(f"{name:<8} {per_class_f1[i]:>8.4f} {sensitivity[i]:>8.4f} "
f"{specificity[i]:>8.4f} {support:>10}")
# 混淆矩阵
print(f"\nConfusion Matrix (rows=true, cols=pred):")
header = f"{'''''''''''''''''''''''''''''''':>8}" + "".join(f"{name:>8}" for name in stage_names)
print(header)
for i, name in enumerate(stage_names):
row = f"{name:>8}" + "".join(f"{cm[i,j]:>8}" for j in range(5))
print(row)
# N1 F1 特别标注(关键指标)
print(f"\n⚠️ N1 F1 = {per_class_f1[1]:.4f} — N1 是最难分类的阶段,"
f"社区 SOTA 约 50-60%")
return {
"accuracy": acc,
"macro_f1": mf1,
"kappa": kappa,
"per_class_f1": per_class_f1.tolist(),
"sensitivity": sensitivity.tolist(),
"specificity": specificity,
"confusion_matrix": cm.tolist(),
"n1_f1": per_class_f1[1], # 关键指标
}
# 使用示例
# results = evaluate_sleep_staging(y_true, y_pred)
</details>
§6.10 MLOps 笔记
-
模型版本管理:建议使用 MLflow 或 Weights & Biases 记录每折训练的模型权重、超参数和评估指标
-
推理部署:TinySleepNet 参数量仅 ~0.4M,可在树莓派等边缘设备上实时推理(推理时间 <100ms/epoch)
-
数据版本管理:使用 DVC 管理预处理后的
.npy文件,确保可复现性 -
CI/CD:在 GitHub Actions 中设置自动化的 10-fold CV 评估,每次代码提交自动运行单折快速验证
§7 质量评估与局限性(Quality & Limitations)
§7.1 已知偏倚
| 偏倚类型 | 描述 | 严重程度 | 缓解措施 |
|---|---|---|---|
| 选择偏倚 | SC 子集仅含健康高加索人,ST 子集仅含轻度入睡困难者 | 🟡 中 | 不适用于睡眠障碍患者模型 |
| 年龄偏倚 | SC 受试者 25-101 岁(均值 ~59),ST 受试者 18-79 岁(均值 ~40) | 🟡 中 | 两个子集年龄分布不同,混合使用需注意 |
| 种族偏倚 | 仅高加索人 | 🔴 高 | 不可推广至其他种族 |
| 性别偏倚 | SC: 男 34/女 40;ST: 男 7/女 15 | 🟡 中 | ST 子集女性偏多 |
| 类别不平衡 | N1 严重少数类(6.6%-11.0%),W 过度代表(19.6%-33.7%) | 🔴 高 | 使用类别加权/Focal Loss/过采样 |
| 技术偏倚 | 非标准电极位置(Fpz-Cz/Pz-Oz vs C4-A1/C3-A2) | 🟡 中 | 不直接适用于标准临床 PSG |
| 设备偏倚 | 1987-1994 年磁带/遥测记录,信号质量低于现代数字 PSG | 🟡 中 | 预处理时加强滤波 |
| 标注者偏倚 | 单标注者,无 inter-rater 一致性数据 | 🟡 中 | 结果需谨慎解读 |
§7.2 标注质量评估
| 维度 | 评估结果 |
|---|---|
| 标注标准 | 1968 R&K 手册——已过时,当前临床标准为 2007 AASM |
| 标注者资质 | 训练有素的技术师(非执业睡眠医师) |
| 一致性检验 | 未提供 inter-rater reliability 数据 |
| 替代电极影响 | 基于 Fpz-Cz/Pz-Oz 分期,van Sweden et al. (1990) 研究表明与标准位置性能相当 |
| M/? 类处理 | 运动时间和未评分 epoch 占比小,剔除后影响有限 |
| 总体评估 | 标注质量可接受,但缺乏多标注者一致性验证是该数据集的主要局限 |
§7.3 泛化性讨论
| 场景 | 失效风险 | 证据 |
|---|---|---|
| 跨被试泛化 | 🟡 中等风险 | EDF-20 ACC ~85% → EDF-78 ACC ~80%(更多受试者 = 更难的泛化) |
| 跨数据集泛化 | 🔴 高风险 | Sleep-EDF 训练的模型在 SHHS/MASS/ISRUC 上性能显著下降 |
| 跨种族泛化 | 🔴 高风险 | 仅高加索人数据,EEG 模式可能存在种族差异 |
| 跨年龄泛化 | 🟡 中等风险 | SC 覆盖 25-101 岁,但老年受试者深睡眠减少影响 N3 检测 |
| 跨设备泛化 | 🔴 高风险 | 磁带/遥测 vs 现代数字 PSG 信号特征不同 |
| 临床部署 | 🔴 高风险 | 无睡眠障碍患者数据,不适用于临床诊断场景 |
§7.4 伦理考量
- 数据隐私:EDF 头信息仅含性别和年龄,已脱敏。但受试者来自特定地理区域(荷兰),存在再识别风险
- 知情同意:原始研究(1987-1994)的知情同意流程未在数据集文档中详细说明
- 公平性:仅高加索人数据,算法在其他种族上的性能未经验证
- 误用风险:该数据集仅含健康/轻度失眠受试者,不应用于训练临床诊断模型
- 商业使用:ODC-By 许可允许商业使用,但需署名引用
§7.5 公平性评估
# 公平性评估代码示例
def evaluate_fairness(y_true, y_pred, groups, group_names):
"""按受试者子组评估分类性能差异"""
from sklearn.metrics import f1_score
import numpy as np
results = {}
for g, name in zip(np.unique(groups), group_names):
mask = groups == g
if mask.sum() < 10:
continue
f1 = f1_score(y_true[mask], y_pred[mask], average="macro")
results[name] = f1
print(f"{name}: MF1 = {f1:.4f} (n={mask.sum()})")
# 性能差距
f1_values = list(results.values())
if len(f1_values) > 1:
gap = max(f1_values) - min(f1_values)
print(f"\n公平性差距 (max MF1 - min MF1): {gap:.4f}")
return results
# 示例:按年龄组评估
# age_groups = np.where(ages < 40, "young", np.where(ages < 65, "middle", "elderly"))
# evaluate_fairness(y_true, y_pred, age_groups, ["young", "middle", "elderly"])
已知差异:老年受试者(>65 岁)的 N3 F1 显著低于年轻受试者(老年受试者 N3 epoch 本身就少,且慢波幅度降低)。
§7.6 数据漂移提示
- 采集年代漂移:数据采集于 1987-1994 年,当时的 PSG 设备和记录条件与现代数字 PSG 系统存在差异
- 标准漂移:标注使用 1968 R&K 标准,而当前临床标准为 2007 AASM 标准(合并 S3+S4 为 N3,移除了 M 类)
- 信号质量漂移:磁带录音机(SC)的信号质量低于现代数字记录设备
§7.7 DAIMS 24 项数据就绪度评估表
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 数据集名称与标识符 | ✅ | Sleep-EDF Database [Expanded], DOI: 10.13026/C2X676 |
| 2 | 版本号与发布日期 | ✅ | v1.0.0, 2018-03 |
| 3 | 创建者与联系方式 | ✅ | Bob Kemp, MCH-Westeinde Hospital |
| 4 | 许可证 | ✅ | ODC-By 1.0,开放免费 |
| 5 | 数据格式标准 | ✅ | EDF/EDF+ 国际标准 |
| 6 | 数据字典/字段描述 | ✅ | EDF 头信息含通道/采样率/物理参数 |
| 7 | 标注方式描述 | ✅ | 人工分期,R&K 标准,30s epoch |
| 8 | 标注者资质 | ⚠️ | 训练有素的技术师,但无资质认证详情 |
| 9 | 标注一致性 | ❌ | 未提供 inter-rater reliability 数据 |
| 10 | 数据划分建议 | ⚠️ | 无官方划分,社区有共识做法 |
| 11 | 样本量统计 | ✅ | 197 份记录,195,479 epoch(EDF-78) |
| 12 | 类别分布 | ✅ | 详细分布可用,类别不平衡已知 |
| 13 | 缺失值处理 | ✅ | M/? 类标注明确,3 份记录丢失有记录 |
| 14 | ICD/SNOMED 映射 | ⚠️ | 本 Wiki 补充映射,原始数据集未提供 |
| 15 | 采集设备规格 | ✅ | 详细描述磁带/遥测系统 |
| 16 | 采集时间范围 | ✅ | 1987-1991(SC)/ 1994(ST) |
| 17 | 地域覆盖 | ⚠️ | 仅荷兰,单一国家 |
| 18 | 人口统计 | ✅ | 年龄/性别/种族/健康状况有记录 |
| 19 | 伦理审批 | ⚠️ | 原始研究伦理审批信息未在数据集文档中披露 |
| 20 | 脱敏处理 | ✅ | EDF 头信息仅含性别和年龄 |
| 21 | 已知偏倚 | ✅ | 选择偏倚/类别不平衡/种族偏倚已识别 |
| 22 | 使用限制 | ✅ | 仅健康/轻度失眠,非标准电极 |
| 23 | 引用要求 | ✅ | 需引用 Kemp 2000 + Goldberger 2000 |
| 24 | 维护计划 | ⚠️ | 2018 年最后更新,无明确后续维护计划 |
DAIMS 评分:17 / 24
评分解读:良好 — 接近优秀,需少量预处理。对你意味着什么:该数据集的规范性总体较好。主要扣分项集中在:标注者一致性数据缺失(#9)、无官方数据划分(#10)、伦理审批信息不完整(#19)、单一国家来源(#17)。建议在训练前执行以下操作:(1) 按 subject-wise K-fold CV 划分数据(推荐 10-fold for EDF-78);(2) 使用类别加权或 Focal Loss 处理 N1 期严重不平衡;(3) 裁剪 W 期至睡眠前后 ±30 分钟以减少清醒期占比;(4) 仅使用 SC 子集以确保数据一致性。
§7.8 外部验证矩阵
| 外部数据集/场景 | 来源机构 | 样本量 | 评估任务 | 性能指标 | 相对内部测试集变化 | 关键发现 |
|---|---|---|---|---|---|---|
| SHHS | NIH (美国) | 3,295 人 | 5-class 分期 | ACC 84.2%, MF1 76.9% | -5% ~ -8% | 跨数据集泛化性能下降,不同电极位置(C4-A1)和采样率(125 Hz) |
| MESA | NIH (美国) | 2,000+ 人 | 5-class 分期 | ACC 82.0%, MF1 76.3% | -6% ~ -10% | 老年人群(>54 岁),更多睡眠片段化 |
| PhysioNet 2018 | PhysioNet | 1,000 夜 | 5-class 分期 | ACC 80.5%, MF1 76.8% | -8% ~ -12% | 含睡眠障碍患者,数据分布与 Sleep-EDF 差异大 |
| ISRUC-S3 | 葡萄牙科英布拉大学 | 10 人 | 5-class 分期 | ACC ~80% | -5% ~ -8% | 多通道 PSG,含睡眠障碍患者,AASM 标注 |
约束:本矩阵仅记录有同行评审论文支撑的外部评估结果。不收录未经验证的社区自评数据。
§8 基准性能与生态(Benchmarks & Ecosystem)
§8.1 排行榜
重要说明:以下排行榜中的绝对数值不可直接跨论文比较。不同论文使用不同的子集(EDF-20 vs EDF-78)、不同的通道(Fpz-Cz vs Pz-Oz vs 双通道)、不同的 CV 折数、不同的预处理策略。对比时请关注同一实验设置下的结果。
排行榜 A:Sleep-EDF-20(20 名受试者,单通道 Fpz-Cz,AASM 五分类)
| 排名 | 模型 | ACC (%) | MF1 (%) | κ | 年份 | 关键技术 | 完整引用 | 代码 |
|---|---|---|---|---|---|---|---|---|
| 1 | CNN-BiGRU+MHSA | 90.8 | 84.0 | 0.88 | 2025 | 数据平衡+多头自注意力+BiGRU | Zhang et al., 2025, Chinese J. Med. Physics 42(4) | — |
| 2 | Vakili et al. | 89.7 | 85.5 | 0.86 | 2025 | 上下文感知+多尺度时序编码 | Vakili et al., 2025 | — |
| 3 | MBSleepNet | 88.2 | — | — | 2025 | 多分支时频 tokenization | Zhou et al., 2025, Biomed. Signal Process. Control 106 | — |
| 4 | TPON | 87.1 | 81.7 | 0.82 | 2023 | 直推式原型优化网络 | Frontiers in Neuroinformatics 17:1297874 | — |
| 5 | LWSleepNet | 86.6 | 79.2 | — | 2023 | 轻量注意力+深度可分离卷积 | Yang et al., 2023, Health Data Sci. | — |
| 6 | XSleepNet2 | 86.3 | 80.6 | 0.81 | 2021 | 多模态(raw+频谱)+序列学习 | Phan et al., 2021, IEEE J. Biomed. Health Inform. | GitHub |
| 7 | TinySleepNet | 85.4 | 80.5 | 0.80 | 2020 | 轻量 CNN+BiLSTM+残差 | Supratak & Guo, 2020, IEEE EMBC | GitHub |
| 8 | AttnSleep | 84.4 | 78.1 | 0.79 | 2021 | 多头自注意力+特征融合 | Eldele et al., 2021, IEEE J. Biomed. Health Inform. | GitHub |
| 9 | SleepEEGNet | 84.3 | 79.7 | 0.79 | 2019 | Seq2Seq CNN | Mousavi et al., 2019, J. Neurosci. Methods | — |
| 10 | DeepSleepNet | 82.0 | 76.9 | 0.76 | 2017 | 双路 CNN+BiLSTM | Supratak et al., 2017, IEEE EMBC | GitHub |
排行榜 B:Sleep-EDF-78(78 名受试者,单通道 Fpz-Cz,AASM 五分类)
| 排名 | 模型 | ACC (%) | MF1 (%) | κ | 年份 | 关键技术 | 完整引用 |
|---|---|---|---|---|---|---|---|
| 1 | MBSleepNet | 86.5 | — | — | 2025 | 多分支时频 tokenization | Zhou et al., 2025, Biomed. Signal Process. Control 106 |
| 2 | NeuroSleepNet | 86.1 | 80.8 | 0.81 | 2025 | 多头自注意力+多尺度时序+加权损失 | Dip et al., 2025, IEEE Access |
| 3 | TinySleepNet | 83.1 | 78.1 | 0.77 | 2020 | 轻量 CNN+BiLSTM+残差 | Supratak & Guo, 2020 |
| 4 | SleePyCo | 84.6 | 79.0 | 0.79 | 2022 | 特征金字塔+对比学习 | Li et al., 2022, ESWA |
| 5 | LWSleepNet | 81.5 | 74.3 | 0.75 | 2023 | 轻量注意力 | Yang et al., 2023 |
| 6 | AttnSleep | 81.3 | 75.1 | 0.74 | 2021 | 多头自注意力 | Eldele et al., 2021 |
| 7 | NeuroNet | 81.1 | 75.7 | — | 2024 | 自监督混合框架 | 2024 |
| 8 | DeepSleepNet | 77.8 | 71.8 | 0.70 | 2017 | 双路 CNN+BiLSTM | Supratak et al., 2017 |
§8.2 SOTA 总结与选型建议
| 场景 | 推荐模型 | 理由 |
|---|---|---|
| 基线复现 | DeepSleepNet | 经典模型,代码成熟,社区认知度高 |
| 轻量部署 | TinySleepNet | 仅 0.4M 参数,边缘设备可实时推理 |
| 最高性能 | MBSleepNet / NeuroSleepNet | 2025 年最新 SOTA,多尺度时频建模 |
| 跨被试泛化 | SleePyCo / XSleepNet2 | 对比学习/多模态增强泛化能力 |
| N1 期优化 | CNN-BiGRU+MHSA | 数据平衡+注意力显著提升 N1 F1 |
§8.3 评估协议
Sleep-EDF 的社区评估协议(非官方,但广泛共识):
- 数据选择:仅使用 SC 子集(EDF-20 或 EDF-78)
- 通道:Fpz-Cz 单通道(或 Fpz-Cz + Pz-Oz 双通道)
- 采样率:100 Hz(或降采样至 50 Hz)
- Epoch:30 秒
- 标签:AASM 五分类(W/N1/N2/N3/REM),S3+S4 合并为 N3,剔除 M/?
- 裁剪:保留睡眠前后 ±30 分钟
- 划分:Subject-wise K-fold CV(EDF-20: K=20, EDF-78: K=10)
- 指标:Overall ACC + Macro-F1 + Cohen’‘’‘’‘’‘’‘’‘’‘’'s Kappa + Per-class F1(特别是 N1 F1)
§8.4 相关数据集
| 数据集 | 关系 | 说明 |
|---|---|---|
| SHHS | 互补 | 大规模睡眠队列,含睡眠呼吸暂停,标准电极位置 |
| MASS | 互补 | 多通道高密度 EEG,需申请 |
| ISRUC-Sleep | 拓展 | 含睡眠障碍患者,多标注者一致性 |
| PhysioNet 2018 Challenge | 拓展 | 竞赛数据集,含异常睡眠 |
| DREAMS | 互补 | 同时提供 R&K 和 AASM 双标注 |
| TUH EEG Corpus | 同类 | EEG 领域另一重要数据集,但非睡眠专用 |
§8.5 关键论文
-
Kemp B, Zwinderman AH, Tuk B, Kamphuisen HAC, Oberyé JJL. “Analysis of a sleep-dependent neuronal feedback loop: the slow-wave microcontinuity of the EEG.” IEEE Transactions on Biomedical Engineering 47(9):1185-1194 (2000). DOI: 10.1109/10.867928 — 数据集原始论文
-
Supratak A, Dong H, Wu C, Guo Y. “DeepSleepNet: A Model for Automatic Sleep Stage Scoring based on Raw Single-Channel EEG.” IEEE Transactions on Neural Systems and Rehabilitation Engineering 25(11):1998-2008 (2017). — 深度学习睡眠分期开山之作
-
Supratak A, Guo Y. “TinySleepNet: An Efficient Deep Learning Model for Sleep Stage Scoring Based on Raw Single-Channel EEG.” IEEE EMBC 2020. — 轻量级 SOTA 基线
-
Eldele E, Wu M, Chen C, et al. “An Attention-Based Deep Learning Approach for Sleep Stage Classification With Single-Channel EEG.” IEEE J. Biomed. Health Inform. 25(8):2833-2843 (2021). — 注意力机制在睡眠分期中的应用
-
Phan H, Chén OY, Lu L, et al. “XSleepNet: Multi-modal Cross-attention Network for Automatic Sleep Staging.” IEEE J. Biomed. Health Inform. 26(6):2884-2895 (2022). — 多模态(raw+频谱图)联合学习
-
Goldberger AL, Amaral LAN, Glass L, et al. “PhysioBank, PhysioToolkit, and PhysioNet: Components of a New Research Resource for Complex Physiologic Signals.” Circulation 101(23):e215-e220 (2000). — PhysioNet 平台论文(需同时引用)
§8.6 社区活跃度
| 维度 | 指标 | 说明 |
|---|---|---|
| PhysioNet 浏览量 | 1,482(截至 2026-08) | PhysioNet 平台页面浏览 |
| Google Scholar 引用 | 2,000+ | 原始论文 Kemp 2000 |
| 活跃论文数 | ~100+/年 | 2020 年后深度学习驱动增长 |
| GitHub 仓库 | 50+ | 含预处理、模型实现、教程 |
| Kaggle 竞赛 | 多个 | 睡眠分期竞赛常用此数据集 |
§8.7 生态快照
| 资源 | 类型 | 链接 | 为什么值得关注 |
|---|---|---|---|
| PhysioNet 官方页面 | 官方资源 | physionet.org/content/sleep-edfx/1.0.0/ | 权威数据来源,含完整文档和下载 |
| DeepSleepNet | 模型代码 | GitHub | 经典基线模型,预处理代码广泛复用 |
| TinySleepNet | 模型代码 | GitHub | 轻量级 SOTA,含完整预处理+训练+评估流程 |
| AttnSleep | 模型代码 | GitHub | 注意力机制基线,含特征提取代码 |
| torcheeg | 工具库 | 文档 | PyTorch EEG 数据集加载库,内置 Sleep-EDF 加载器 |
| EDF 浏览器 Polyman | 工具 | edfplus.info | 可视化 EDF/EDF+ 文件,含 Sleep-EDF 专用模板 |
§9 相关资源与引用(Resources & Citation)
§9.1 引用格式
BibTeX:
@article{kemp2000analysis,
title={Analysis of a sleep-dependent neuronal feedback loop: the slow-wave microcontinuity of the EEG},
author={Kemp, Bob and Zwinderman, Aeilko H and Tuk, Bert and Kamphuisen, Hilbert AC and Obery{\''''''''''''''''e}, Josefien JL},
journal={IEEE Transactions on Biomedical Engineering},
volume={47},
number={9},
pages={11851194},
year={2000},
publisher={IEEE},
doi={10.1109/10.867928}
}
@article{goldberger2000physiobank,
title={PhysioBank, PhysioToolkit, and PhysioNet: components of a new research resource for complex physiologic signals},
author={Goldberger, Ary L and Amaral, Luis AN and Glass, Leon and Hausdorff, Jeffrey M and Ivanov, Plamen Ch and Mark, Roger G and Mietus, Joseph E and Moody, George B and Peng, Chung-Kang and Stanley, H Eugene},
journal={Circulation},
volume={101},
number={23},
pages={e215e220},
year={2000}
}
@dataset{kemp2018sleepedf,
title={Sleep-EDF Database [Expanded]},
author={Kemp, Bob},
year={2018},
publisher={PhysioNet},
doi={10.13026/C2X676}
}
§9.2 相关标准文档
| 文档 | 说明 |
|---|---|
| Rechtschaffen A, Kales A. (1968) | R&K 睡眠分期手册(原始标注标准) |
| AASM (2007) | AASM 睡眠分期手册(当前临床标准) |
| EDF 规范 | European Data Format 标准(www.edfplus.info) |
| EDF+ 规范 | EDF 扩展格式,支持标注和间断信号 |
§9.3 许可证摘要
ODC-By 1.0(Open Data Commons Attribution License v1.0):
- ✅ 免费使用(含商业用途)
- ✅ 自由修改和分发
- ✅ 无需注册或认证
- ✅ 无需 IRB 或 DUA
- ⚠️ 需署名引用(Kemp 2000 + Goldberger 2000)
§9.4 下载清单
| 文件 | 大小 | 说明 |
|---|---|---|
| sleep-edfx-1.0.0.zip | ~5 GB | Expanded 完整版(197 份记录) |
| SC-subjects.xls | 23.5 KB | SC 子集受试者信息 |
| ST-subjects.xls | 23 KB | ST 子集受试者信息 |
| SHA256SUMS.txt | 38.9 KB | 完整性校验 |
§9.5 常见问题
Q: 应该使用 EDF-20 还是 EDF-78?
A: 如果复现论文,使用论文中使用的子集。如果开展新研究,推荐 EDF-78(更多受试者 = 更可靠的评估)。EDF-20 适合快速实验。
Q: 可以使用 ST 子集吗?
A: 可以,但社区主流做法仅使用 SC 子集。ST 子集的 EMG 采样率不同(100 Hz vs SC 的 1 Hz),混合使用需注意。
Q: 需要注册或申请吗?
A: 不需要。Sleep-EDF 采用 ODC-By 许可,可直接下载,无需 PhysioNet 注册或 CITI 培训(区别于 PhysioNet Credentialed 数据集如 MIMIC)。
Q: 如何处理 M 和 ? 标签?
A: 社区共识是直接剔除这些 epoch。不要将其替换为 W 或其他类别。
§9.6 致谢
Sleep-EDF 数据集由 Bob Kemp 博士(Sleep Centre, MCH-Westeinde Hospital, Den Haag, The Netherlands)创建并贡献给 PhysioNet。本 Wiki 的技术内容由千方病案医学编辑部交叉审核,审核范围涵盖医学背景、数据工程和 AI 就绪指南。
§9.7 变更日志
| 日期 | 变更 |
|---|---|
| 2026-08-06 | 初始版本发布 |
§10 AI 使用声明卡
§10.1 AI 模型使用
| 模型 | 版本 | 用途 |
|---|---|---|
| Claude | Sonnet 4 | 文献研究、条目撰写、代码生成 |
| WebSearch | — | 数据集技术规格、SOTA 性能、社区资源检索 |
§10.2 AI 参与范围
AI 深度参与:文献检索、数据整理、条目结构设计、代码示例编写、表格生成
§10.3 输入来源
- PhysioNet Sleep-EDF Database [Expanded] 官方页面
- Kemp et al., 2000, IEEE-BME 47(9):1185-1194(原始论文)
- Supratak et al., 2017, IEEE TNSRE(DeepSleepNet)
- Supratak & Guo, 2020, IEEE EMBC(TinySleepNet)
- Eldele et al., 2021, IEEE JBHI(AttnSleep)
- Phan et al., 2021, IEEE JBHI(XSleepNet)
- Dip et al., 2025, IEEE Access(NeuroSleepNet)
- Zhou et al., 2025, Biomed. Signal Process. Control(MBSleepNet)
- Zhang et al., 2025, Chinese J. Med. Physics(CNN-BiGRU+MHSA)
- He et al., 2022, Computers in Biology and Medicine 149:106044
- Yang et al., 2023, Health Data Science(LWSleepNet)
- 《Global Medical AI Datasets》数据集基础介绍
§10.4 人工校验表
| 内容模块 | 审核者 | 审核方式 | 审核状态 |
|---|---|---|---|
| §2 医学背景 | 千方病案医学编辑部 | 交叉审核 | ✅ 已通过 |
| §3 数据规格 | 千方病案医学编辑部 | 与 PhysioNet 官方文档交叉比对 | ✅ 已验证 |
| §4 DAIMS 数据字典 | 千方病案医学编辑部 | 与 EDF 规范交叉比对 | ✅ 已验证 |
| §6 代码示例 | 千方病案医学编辑部 | 逻辑审查 | ✅ 已通过 |
| §7 偏倚分析 | 千方病案医学编辑部 | 交叉审核 | ✅ 已通过 |
| §8 排行榜 | 千方病案医学编辑部 | 与原始论文交叉验证 | ✅ 已验证 |
§10.5 AI 生成章节
以下章节由 AI 生成并经人工审核:§1-§9 全部正文内容、代码示例、表格、JSON-LD 元数据、封面图 Prompt。
§10.6 最后人工审核日期
2026-08-06
页面状态:published(全部内容已完成审核并发布)
