信息速览
INFOBOX — CinC 2018 睡眠觉醒挑战一屏速览
维度 内容 本质 PhysioNet/CinC 2018 年挑战赛官方数据集:整夜 PSG 上的睡眠微觉醒(arousal)逐采样点检测 全称 You Snooze You Win: the PhysioNet/Computing in Cardiology Challenge 2018 数据来源 马萨诸塞州总医院(MGH)睡眠门诊,回顾性分析获 Partners IRB 批准 规模 1,985 名受试者 / 1,983 条整夜 PSG(训练 994 + 测试 989,无重叠) 信号 13 路:EEG×6、EOG×1、EMG×1、ABD/CHEST、AIRFLOW、SaO2、ECG;全部 200 Hz、16 位 格式 WFDB: .mat(MATLAB V4)+.hea+.arousal(WFDB 标注)+-arousal.mat(HDF5 三态向量)标注 7 位技师,每条 PSG 由 1 人判读;AASM 30 秒分期 + 12 类事件 目标 仅非呼吸暂停类觉醒;RERA 窗口 −2s~+10s,其余 −2s~+2s;清醒/呼吸暂停/低通气 ±10s 不计分 指标 gross AUPRC(全库汇总而非逐记录平均),概率按 1/1000 分箱 战绩 官方 22 队、19 队有效终榜;冠军 0.54;非官方最高 0.55;均值 0.28 许可 ODC-By 1.0(署名即可);托管 PhysioNet,免注册下载 体量 未压缩 266.6 GB(训练与测试各约 135 GB) 库内关系 与 rid=493( cinc-2018-sleep)为同物异名,与本条目做消歧,勿当新数据集引用
这条目讲的是一场 2018 年的比赛,但它的价值远不止比赛本身。PhysioNet 与 Computing in Cardiology 连续举办二十余年的挑战赛,2018 年把题目交给了睡眠医学中最不显眼、却最贴近"睡眠到底好不好"的环节——微觉醒(arousal)。一个人睡一夜,脑电波形上会冒出几十到上百次短促的频率加快,每次只持续数秒,本人往往毫无察觉;但正是这些数秒的碎片,把连续的睡眠切成了一段一段,与白天嗜睡、注意力下降、心血管风险联系在一起。
比赛的组织者做了一个很"工程化"的选择:不问"这个患者有没有睡眠障碍"这类诊断级问题,也不只要求每 30 秒给一个睡眠分期,而是要求参赛算法对每一个采样点输出一个"此刻是否处于目标觉醒区域"的概率,再用全库汇总的 PR 曲线下面积(gross AUPRC)打分。这个设计把问题推到了时序事件检测最难的形态:极端类别不平衡、边界模糊、标签定义本身带有临床取舍。
导语读法三则:
- 只想拿数据做模型:直奔 §5 数据结构与 §8 工程实践——先把
.mat的 16 位偏移和-arousal.mat的 HDF5 读法搞对,再谈特征。 - 想知道这东西能不能信:直奔 §3 标注协议与 §6 目标定义——目标觉醒不等于 AASM 意义上的全部觉醒,这一条足以毁掉一个不读文档的复现。
- 想引用或对标:直奔 §9 战绩与 §10 消歧——库里已经有一条
cinc-2018-sleep(rid=493),容易与本条目撞车,两个 slug 指的是同一份数据。
§0 导读:这个数据集解决什么问题
睡眠医学有一套成熟的判读体系,但它建立在一个昂贵的前提上:一位受过训练的技师,盯着屏幕,把一整夜的脑电、眼电、肌电、呼吸、血氧逐屏看过去。美国睡眠医学会(American Academy of Sleep Medicine, AASM)的判读手册把一页定为 30 秒(epoch),需要标注五期睡眠(W、N1、N2、N3、REM),还要标出呼吸暂停、低通气、觉醒、周期性肢体运动等事件。一份 8 小时整夜记录大约 960 页,一位有经验的技师需要数小时。
问题出在两处。第一处是成本:中国、印度这样的人口大国,睡眠中心数量远不足以覆盖潜在患者,整夜 PSG 的排队周期常常以周计。第二处是一致性:觉醒判读是 AASM 体系中公认一致性偏低的部分,不同技师对"频率突然加快持续 3 秒以上"的边界把握并不一致。
PhysioNet/CinC 2018 把这两处问题打包成一个可量化的任务:给定 13 路信号,输出逐采样点的目标觉醒概率;用全库 gross AUPRC 排名。于是"能不能自动化"变成了"自动化到什么程度",并且有一个 2018 年 22 支队伍的成绩分布作为参照系。
这个数据集后来成为睡眠时序事件检测领域引用最广的公开基准之一,原因有三:
- 标签粒度罕见地细。绝大多数公开睡眠数据集只给 30 秒级分期标签(Sleep-EDF、MASS、SHHS 都是如此),CinC 2018 给的是采样点级的三态序列,可以直接训练序列到序列的稠密预测模型。
- 信号完整。13 路通道覆盖了 AASM 判读觉醒所需的脑电频率信息、呼吸事件线索与血氧下降,不是"只给单导联"的简化版。
- 难度真实。冠军 0.54、均值 0.28 的成绩分布说明这不是一个已经被刷爆的榜单,任何声称"轻松超过 0.6"的论文都值得回头核对评测口径。
这个数据集不能解决什么,也需要一开始讲清楚:
- 它不提供原始 PSG 中的全部通道(体位、视频、麦克风、腿部肌电未随包发布),也不提供临床诊断结论。
- 它的测试集标签永久隐藏,所以任何"在 CinC 2018 测试集上达到 X"的说法都无法被第三方独立复核。
- 它的目标觉醒定义是为比赛定制的,与临床 AASM 判读口径有系统性差异(详见 §6.2)。
§1 数据集速览:十二问十二答
Q1:这个数据集的官方名字是什么?为什么 slug 叫 cinc-2018-sleep-arousal?
官方名是 You Snooze You Win: the PhysioNet/Computing in Cardiology Challenge 2018。"You Snooze You Win"是赛事口号,正式引用时应使用全称。slug cinc-2018-sleep-arousal 是千方病案医数集内部为消歧而采用的标识:CinC 系列挑战赛按年份有多届(2016 心音、2017 房颤、2018 睡眠觉醒、2020/2021 多导联心电),用年份加任务词可以避免把 2018 与 2020 的睡眠相关赛道混为一谈。注意:库内另有一条 cinc-2018-sleep(rid=493),与本文档描述的是同一份数据,属同物异名(详见 §10.1)。
Q2:一共多少受试者?训练和测试怎么分?
1,983 条整夜 PSG 记录,来自 1,985 名受试者。官方页面的表述是"1,985 名受试者在 MGH 睡眠实验室接受监测",而挑战论文写的是"共 1,983 条记录,其中 994 条标签公开为训练集,989 条保留为隐藏测试集"。两个数字的差异在文献中长期被混用,本条目采用双口径存照(详见 §11 与坑 1):引用记录数用 1,983,引用受试者数用 1,985。训练集与测试集之间没有共同的受试者。
Q3:13 路信号具体是什么?
依据挑战论文与头文件实测:
| 序号 | 头文件信号名 | 类型 | 说明 |
|---|---|---|---|
| 1 | F3-M2 | EEG | 国际 10-20 系统,左侧额区,对侧乳突参考 |
| 2 | F4-M1 | EEG | 右侧额区 |
| 3 | C3-M2 | EEG | 左侧中央区 |
| 4 | C4-M1 | EEG | 右侧中央区 |
| 5 | O1-M2 | EEG | 左侧枕区 |
| 6 | O2-M1 | EEG | 右侧枕区 |
| 7 | E1-M2 | EOG | 眼电,左眼对侧乳突参考 |
| 8 | Chin1-Chin2 | EMG | 颏下肌电 |
| 9 | ABD | 呼吸努力 | 腹部呼吸带 |
| 10 | CHEST | 呼吸努力 | 胸部呼吸带 |
| 11 | AIRFLOW | 气流 | 口鼻气流 |
| 12 | SaO2 | 血氧 | 单位 %,样点保持上采样 |
| 13 | ECG | 心电 | 右锁骨下至左胸侧壁 |
Q4:采样率是多少?为什么 SaO2 也写成 200 Hz?
除 SaO2 外所有信号原生采样率与重采样后统一为 200 Hz,单位微伏(µV)。SaO2 本质上是低频量(通常 1 Hz 或更低的更新率),官方用**样点保持(sample and hold)**的方式把每个血氧值复制到 200 Hz 的网格上,以保证 13 路信号在时间轴上严格对齐、无需插值即可拼接。这意味着 SaO2 通道相邻点大量重复,做频域分析时不能当真当成 200 Hz 带宽的信号处理。
Q5:一条记录有多长?
论文 Table 1 给出的平均值:记录时长 7.7 小时(标准差 0.7),卧床时间 7.5 小时,实际睡眠时间 6.2 小时。以 200 Hz 计算,一条 7.7 小时的记录约 5.5×10⁶ 个采样点(头文件样例 tr03-0005 显示 5,147,000 个采样点,约 7.15 小时)。全部 1,983 条合计约 110 亿个采样点 × 13 通道。
Q6:觉醒标签是怎么定义的?
比赛只把非呼吸暂停类觉醒作为目标(target arousal):呼吸努力相关觉醒(RERA)从开始前 2 秒到结束后 10 秒;其他非 RERA、非呼吸暂停类觉醒从开始前 2 秒到结束后 2 秒。受试者清醒、出现呼吸暂停或低通气事件前后 10 秒内的区域不计分,标记为 -1。详细推导见 §6。
Q7:-arousal.mat 里的 +1、0、-1 分别是什么?
+1 = 目标觉醒区域(正样本);0 = 非觉醒区域(负样本,模型若在此处报高概率会被惩罚);-1 = 不评分区域(既不算正也不算负,直接从 PR 曲线的分子分母里剔除)。三个值构成逐采样点的三态向量,长度与信号采样点数一致。
Q8:评分指标为什么叫 gross AUPRC?
普通的 AUPRC 是"每条记录算一个 AUPRC,再求平均";gross AUPRC 是"把全部记录的 TP/FP/FN 汇总成全局混淆矩阵,再沿 1001 个阈值点算 PR 曲线面积"。官方不取平均,是因为测试集中既有觉醒极少甚至为零的记录,逐记录平均会被 NaN 与长记录主导。gross 口径的代价是:长记录、觉醒多的记录对总分贡献更大,模型性能会偏向于在这些记录上表现好。
Q9:冠军成绩多少?
官方终榜 19 支有效队伍,最高分 0.54(Howe-Patterson、Pourbabaee、Benard);第二名 0.45,第三名 0.43。非官方提交中最高 0.55(Li & Guan),但因错过摘要截止未被列入排名。全部有效成绩均值 0.28,最低 0.07。
Q10:许可证是什么?能商用吗?
ODC-By 1.0(Open Data Commons Attribution License v1.0)。该许可证只要求在使用、分发或衍生作品时保留署名,不限制商业使用,也不要求衍生作品以相同许可证分发。落地时仍建议核对 PhysioNet 页面上的当前条款与数据使用协议(DUO 标签),并保留官方引用。
Q11:数据有多大?怎么下载?
未压缩总量 266.6 GB(训练集与测试集各约 135 GB)。PhysioNet 提供直链、wget 递归与 AWS S3 三种方式;旧版站点也提供过约 45.8 MB 的"仅标注与样本"辅助包。整库下载建议用命令行递归,浏览器逐条点击不可行。
Q12:它和 Sleep-EDF、SHHS、MASS 有什么区别?
一句话:它是唯一把"觉醒事件"标到采样点级、并且专为非呼吸暂停觉醒设计的公开 PSG 数据集。Sleep-EDF 是健康人群的两导联小样本分期基准;SHHS、MrOS、MESA 是大型队列的 30 秒级分期与呼吸事件标签;MASS 是多子集分期基准,信号完整但不发布逐采样点觉醒。详细对照见 §10.2 与附录 K。
§2 历史背景:一场连续二十八年的挑战赛
2.1 PhysioNet 与 CinC 的合作传统
PhysioNet 的前身是 1999 年由 NIH 国家研究资源中心资助建立的 Research Resource for Complex Physiologic Signals,由 MIT 计算生理学实验室(Laboratory for Computational Physiology, LCP)、波士顿贝斯以色列女执事医疗中心与哈佛医学院联合维护。它与 Computing in Cardiology(CinC,前身为 Computers in Cardiology)年会合作举办的"挑战赛"始于 2000 年,每年选择一个新的生理信号难题,向全球公开一批精心整理的数据,要求参赛者提交可运行的开源算法。
这套机制与 Kaggle 式竞赛有三点结构性差异,也是理解 2018 年这一届的关键:
- 必须开源。参赛者提交的不是预测结果,而是在官方沙箱里能跑通的完整代码;排名结束后,所有有效参赛方案以 MIT(X11)、GPLv3、GPLv2 等开源许可证公开。2018 年 19 份终榜方案中,MIT X11 许可证 8 份、GPLv3 10 份、GPLv2 1 份。
- 必须写论文并在会上口头答辩。每支队伍需向 CinC 年会提交论文,赛果同时在 IEEE 论文集发布,赛后可直接作为方法文献引用。
- 数据是长期资产。挑战赛数据集托管在 PhysioNet 上维护数十年,许可证宽松(多为 ODC-By 或 ODC-ODbL),因此同一批数据常被后续研究反复使用,成为事实上的社区基准。
2.2 2018 年之前的睡眠类挑战
在 2018 年之前,CinC 挑战赛已经两次涉及睡眠相关主题:2002 年的"从心电预测睡眠呼吸暂停"、2000 年的"从新生儿心电识别潮式呼吸",以及 2008 年"从心电与呼吸推断睡眠质量"。这些早期挑战的输入都只有单路或少数几路心电/呼吸信号,任务也偏向粗粒度分类。
2018 年的不同之处在于,挑战赛第一次拿到了完整的临床 PSG 数据:13 路通道、七年以上时间的回顾性积累、专业技师逐页判读。组织者显然想测试的是:在真实判读环境的全部信息都具备时,算法能否逼近人类技师的判读。这也是为什么比赛不满足于 30 秒分期,而要求逐采样点的觉醒检测。
2.3 “You Snooze You Win” 这个口号
口号取自英文俗语 you snooze, you lose(一打盹就输),反转成 you snooze, you win(打盹反而赢)。这里的"打盹"(snooze)一语双关:既指受试者在整夜 PSG 中睡得好,也指算法在睡眠中准确识别觉醒的能力。赛题封面与官方页面上经常出现这个口号,检索时如果只搜 “CinC 2018” 会遗漏大量以口号命名的论文。
2.4 时间线
| 时间节点 | 事件 | 来源 |
|---|---|---|
| 2018-02-21 | 数据集 v1.0.0 在 PhysioNet 发布,非官方阶段开放 | PhysioNet 版本页 |
| 2018-02-15 至 2018-04-13 | 非官方(unofficial)阶段,可自由提交 | 挑战赛规则页 |
| 2018-04-13 至 2018-04-22 | 暂停期,用于整理与修正 | 挑战赛规则页 |
| 2018-04-23 至 2018-09-01 | 官方阶段(official phase) | 挑战赛规则页 |
| 2018-07-15 | Wildcard 提交截止(未按时提交摘要的队伍) | 挑战赛规则页 |
| 2018-09-23 至 2018-09-26 | CinC 2018 年会(荷兰马斯特里赫特),赛果公布与答辩 | CinC 官网 |
| 2018-09 | 挑战论文发表于 CinC 2018 Proceedings 第 45 卷 | DOI 10.22489/CinC.2018.049 |
§3 数据来源:MGH 睡眠门诊的一万夜
3.1 采集机构
数据来自**马萨诸塞州总医院(Massachusetts General Hospital, MGH)**的睡眠门诊(Sleep Division),由计算临床神经生理实验室(Computational Clinical Neurophysiology Laboratory, CCNL)与临床数据动画中心(Clinical Data Animation Center, CDAC)合作整理。挑战论文致谢部分列出的资助来源是 NIH 的 R01-GM104987;PhysioNet 平台页面上标注的当前资助编号为 U24EB037545 与 R01EB030362,均为平台维持经费,不是数据采集经费,引用时不要混用。
Partners Institutional Review Board(Partners 伦理审查委员会)批准了对 MGH 数据的回顾性分析,且豁免了重新征得受试者知情同意——这是大型回顾性医学数据集的常见做法,也意味着数据在去标识化处理上遵循 HIPAA 安全港规则(移除 18 类标识符)。
3.2 受试者画像
挑战论文 Table 1 给出的临床特征,是本条目最值得反复查阅的一张表。它决定了模型在这些数据上训出来的"患者先验"是什么样的:
| 临床特征 | 全体(n=1,983) | 训练(n=994) | 测试(n=989) |
|---|---|---|---|
| 年龄,均值(SD) | 55(14.4) | 55(14.3) | 55(14.4) |
| 男性占比(%) | 65 | 67 | 63 |
| BMI,均值(SD) | 33(7.6) | 33(7.8) | 33(7.5) |
| AHI,均值(SD) | 19(14.4) | 19(14.6) | 18.9(14.4) |
| ESS 嗜睡量表,均值(SD) | 8.6(5.3) | 8.5(5.3) | 8.7(5.3) |
| 记录时长(h) | 7.7(0.7) | 7.7(0.7) | 7.7(0.7) |
| 卧床时间(h) | 7.5(0.7) | 7.5(0.7) | 7.5(0.7) |
| 睡眠时间(h) | 6.2(1.2) | 6.2(1.1) | 6.1(1.2) |
用药与就诊原因的分布同样值得注意:
| 项目 | 全体(%) | 训练(%) | 测试(%) |
|---|---|---|---|
| 高血压 | 40.9 | 41.0 | 40.6 |
| 助眠药 | 28.3 | 29.0 | 27.8 |
| 抗抑郁药 | 26.1 | 25.7 | 26.5 |
| 神经活性药物 | 19.1 | 20.8 | 17.5 |
| 苯二氮䓬类 | 16.1 | 16.9 | 15.4 |
| 糖尿病 | 11.7 | 11.9 | 11.5 |
| 阿片类 | 7.4 | 8.1 | 6.7 |
| 抗组胺药 | 4.8 | 4.8 | 4.8 |
| 兴奋剂 | 4.7 | 3.9 | 5.5 |
| 神经阻滞剂 | 4.2 | 4.5 | 3.8 |
| 中草药 | 4.2 | 4.3 | 4.0 |
就诊原因:诊断性检查 41.8%、分夜 CPAP 滴定 38.35%、整夜 CPAP 滴定 19.85%。也就是说,近六成记录来自正在进行 CPAP 治疗或滴定的患者——这类患者在夜间会佩戴面罩,气流与呼吸努力信号的行为与未治疗患者不同,是模型迁移时的隐性分布偏移。
从这张表能读出三个关键判断:
- 这是一个"睡眠门诊人群",不是健康人群。AHI 均值 19 属于中度睡眠呼吸暂停区间,四成有高血压,近三成服用助眠药。用这个数据集训练的模型直接部署到普通人群,会高估觉醒检出率。
- 训练与测试分布高度一致。随机划分之外,官方还专门保证了 AHI 在两个集合上分布一致(Kolmogorov-Smirnov 检验 p=0.97),这是可以放心的重要原因之一——只要不用测试集调参,训练集上的评测数字对测试集的参考价值较高。
- 年龄方差大(SD 14.4)。55±14 岁意味着覆盖了从 20 多岁的年轻患者到 80 岁以上的老年患者,模型的年龄鲁棒性可以在训练集内部做分层验证。
3.3 七年、一万夜的积累
1,983 条记录在 MGH 属于什么量级?一个中型睡眠中心每晚做 2 至 6 条 PSG,一年约 1,000 至 2,000 条;1,983 条约相当于一到两年的全量产出,但记录分布在 2010 至 2017 年间的编号段(tr03 至 tr14,数字对应仪器型号/批次而非时间),说明组织者是从多年档案中挑选出来的一批,而非连续的年度切片。挑选标准官方未公布,这是一处无法核验的偏倚来源(详见 §11 遗留疑点)。
§4 数据规格:13 路信号与 WFDB 封装
4.1 每条记录的文件构成
以 training/tr03-0005/ 为例,目录下四个文件缺一不可:
training/tr03-0005/
├── tr03-0005.mat # 信号矩阵,MATLAB V4 格式,13 行 × N 列
├── tr03-0005.hea # WFDB 头文件,文本,描述采样率/增益/基线/信号名
├── tr03-0005.arousal # WFDB 标注格式,睡眠分期与 12 类事件的起止时刻
└── tr03-0005-arousal.mat # MATLAB V7 (HDF5),键 data/arousals,逐采样点 +1/0/-1
测试集目录结构相同,但只有前两个文件(.mat 与 .hea),.arousal 与 -arousal.mat 都不存在。这一条是初次使用者最容易踩的坑:代码在训练集上跑得好好的,切到测试集后读文件报 FileNotFoundError,很多人误以为是下载不完整(实测 test/te03-0024/ 目录仅列 te03-0024.hea 与 te03-0024.mat 两项)。
4.2 头文件实测
tr03-0005.hea 的第一行是记录级描述:
tr03-0005 13 200 5147000
四个字段依次为:记录名、信号通道数(13)、采样率(200 Hz)、采样点数(5,147,000)。5,147,000 / 200 / 3600 ≈ 7.15 小时,与论文给出的平均 7.7 小时在同一量级。
随后的 13 行是信号级描述,格式为:文件名 格式 增益/单位 ADC分辨率 ADC零值 初始值 校验和 块大小 信号名。摘录两行:
tr03-0005.mat 16+24 1/uV 16 0 -9 139 0 F3-M2
tr03-0005.mat 16+24 655.35(-32768)/% 16 0 30496 9703 0 SaO2
关键信息藏在格式字段 16+24 与增益字段里:
16+24:每个采样点 16 位有符号整数,但数据在文件中有 24 字节的额外偏移(WFDB 的 “offset” 扩展)。绝大多数 WFDB 读取器(如 Python 的wfdb库、官方的wrsamp/rdmat)会正确处理,但自己用numpy.fromfile直接读.mat会踩坑——读出来的前 24 字节是元数据噪声,波形整体错位。1/uV:增益 1,单位为微伏,即原始整数 1 对应 1 µV;物理值 = (数字值 − 基线 0) / 1。655.35(-32768)/%:SaO2 的增益与基线做了特殊处理,物理值 = (数字值 − (−32768)) / 655.35,单位 %。若不按此还原,血氧会变成 0 至 100 之外的荒谬数值。
4.3 信号单位与动态范围
除 SaO2 以百分比表示外,其余 12 路信号的物理单位都是微伏。要注意的是,ECG 与 EEG 共用 µV 单位但动态范围差两个数量级:心电 R 波峰值可达数千 µV,而脑电背景只有几十 µV。头文件里 ECG 的增益写作 1000/mV,实际换算时若统一按 µV 处理,ECG 幅值会显得偏小;做归一化时必须按通道分别标准化,不能对 13 路信号做一个全局 z-score。
4.4 目录与编号规则
训练集记录名以 tr 开头,测试集以 te 开头,形如 tr03-0005、te09-0094。中间两位数字对应信号通道配置的批次(03 至 14),末四位是顺序编号。RECORDS 文件列出全部 1,983 条记录路径(每行一条,training/tr03-0005/tr03-0005 形式),是批量下载与遍历的唯一权威清单。
按批次统计的记录数(实测 RECORDS 文件):
| 批次 | 训练 | 测试 | 合计 |
|---|---|---|---|
| 03 | 139 | 153 | 292 |
| 04 | 112 | 112 | 224 |
| 05 | 166 | 166 | 332 |
| 06 | 96 | 105 | 201 |
| 07 | 110 | 98 | 208 |
| 08 | 34 | 18 | 52 |
| 09 | 49 | 60 | 109 |
| 10 | 54 | 42 | 96 |
| 11 | 61 | 77 | 138 |
| 12 | 88 | 64 | 152 |
| 13 | 64 | 66 | 130 |
| 14 | 21 | 28 | 49 |
| 合计 | 994 | 989 | 1,983 |
批次 05 最大(332 条),批次 08 最小(52 条)。训练与测试在各批次上的比例并不完全相同(例如批次 06 训练占比 47.8%,批次 08 为 65.4%),说明划分是按受试者随机分组后自然形成的,而非按批次分层。
4.5 数据体量估算
单条记录:5.5×10⁶ 采样点 × 13 通道 × 2 字节 ≈ 143 MB(仅 .mat 信号),加上标注与头文件约 150 MB。1,983 条合计约 290 GB,与官方"266.6 GB"的说法一致(部分记录短于平均值)。这个体量意味着:
- 台式机 16 GB 内存无法一次加载全部数据,必须按记录流式读取或先降采样。
- 若只训练二分类觉醒检测,可先用 1 Hz 或 4 Hz 降采样后的特征做粗筛,再对候选段做 200 Hz 精判——2018 年多数参赛方案都采用了类似的两级结构。
- 训练集 994 条约 135 GB,放在容量 500 GB 以上的 SSD 上体验最好;机械硬盘随机读会显著拖慢 DataLoader。
§5 数据结构:从 WFDB 标注到逐采样点标签
5.1 .arousal 文件:一个被低估的宝藏
大多数人拿到数据后直奔 -arousal.mat,把 .arousal 文件忽略了。这其实是损失——.arousal 是 WFDB 标准标注文件,里面包含六期睡眠分期与12 类事件的完整起止时刻,可以直接构建睡眠分期任务、呼吸事件检测任务,甚至多任务学习目标。
WFDB 标注文件是二进制格式:每个标注 8 字节,前 4 字节为两个 int16(时间偏移高 16 位、标注码),后 4 字节为小数部分与时间偏移低 16 位。阅读时需要用 wfdb.rdann(),不要用 cat 或文本编辑器打开——这一点极其重要:.arousal 文件用 head 查看会显示满屏乱码,初学者常据此误判文件损坏。
从 tr03-0005.arousal 的解析结果可以看到,标注码主要包括:
| 标注码 | 含义 | 类别 |
|---|---|---|
W |
清醒(Wake) | 睡眠分期 |
N1 |
非快速眼动 1 期 | 睡眠分期 |
N2 |
非快速眼动 2 期 | 睡眠分期 |
N3 |
非快速眼动 3 期(慢波睡眠) | 睡眠分期 |
R |
快速眼动期(REM) | 睡眠分期 |
(arousal_rera / arousal_rera) |
呼吸努力相关觉醒的起 / 止 | 觉醒事件 |
(arousal_spontaneous / 同上的右括号 |
自发性觉醒 | 觉醒事件 |
(arousal_bruxism |
磨牙相关觉醒 | 觉醒事件 |
(arousal_noise |
噪声干扰相关觉醒 | 觉醒事件 |
(arousal_snore |
打鼾相关觉醒 | 觉醒事件 |
(arousal_plm |
周期性肢体运动相关觉醒 | 觉醒事件 |
(arousal_hypoventilation |
低通气相关觉醒 | 觉醒事件 |
(arousal_partial_obstruction |
部分气道阻塞相关觉醒 | 觉醒事件 |
(arousal_cheyne_stokes |
陈-施呼吸相关觉醒 | 觉醒事件 |
(resp_hypopnea / resp_obstructiveapnea / resp_centralapnea / resp_mixedapnea |
低通气 / 阻塞性 / 中枢性 / 混合性呼吸暂停 | 呼吸事件 |
(vocalization |
发声 | 其他事件 |
括号表示区段起止:左括号 ( 标注事件开始,右括号 ) 标注事件结束。这种"成对标注"的写法在 WFDB 中常见,解析时必须用栈或状态机配对,否则会把事件长度算错。
5.2 三类觉醒的统计画像
挑战论文 Table 2 统计了训练集 994 条记录中的事件总数,这张表直接回答了"目标觉醒到底有多少":
| 事件类别 | 是否计为目标 | 训练集事件数 |
|---|---|---|
| RERA(呼吸努力相关觉醒) | 是 | 43,822 |
| 自发性觉醒(spontaneous) | 是 | 70 |
| 磨牙(bruxism) | 是 | 30 |
| PLM(周期性肢体运动) | 是 | 36 |
| 鼾声(snoring) | 是 | 28 |
| 部分气道阻塞(partial airway obstruction) | 是 | 11 |
| 低通气(hypoventilation) | 是 | 4 |
| 陈-施呼吸(Cheyne-Stokes) | 是 | 3 |
| 噪声(noise) | 是 | 1 |
| 低通气(hypopnea) | 否(触发 ±10s 不计分) | 56,936 |
| 阻塞性呼吸暂停(obstructive apnea) | 否 | 32,547 |
| 中枢性呼吸暂停(central apnea) | 否 | 22,763 |
| 混合性呼吸暂停(mixed apnea) | 否 | 2,641 |
这张表藏着 2018 年赛题最反直觉的一点:"目标觉醒"的 99.96% 都是 RERA(43,822 / 43,836)。自发性觉醒只有 70 个、磨牙 30 个、PLM 36 个——在 994 条记录里平均每条不到 0.1 个。也就是说,官方定义的"非呼吸暂停性觉醒",在 MGH 这批以睡眠呼吸障碍为主的门诊患者身上,几乎全部以 RERA 的形式出现。
这一事实有两个后果:
- 模型很快会退化成 RERA 检测器。任何在训练集上达到 0.5 以上的方案,本质上都是在捕捉"呼吸努力增加—觉醒—恢复呼吸"这一串生理模式,而非泛化的觉醒检测能力。
- 跨数据集迁移会严重掉分。ISRUC、Sleep-EDF 等数据集的自发觉醒占比高得多,模型从 CinC 2018 迁过去后,对自发性觉醒的敏感性会明显下降。
5.3 -arousal.mat 的 HDF5 结构
-arousal.mat 是 MATLAB V7.3 格式(本质是 HDF5),官方评分脚本 score2018.py 用 h5py 读取:
import h5py
import numpy as np
with h5py.File('tr03-0005-arousal.mat', 'r') as f:
truth = np.ravel(f['data']['arousals']) # 长度 == 采样点数
truth 是 int8 或 int32 的一维数组,取值:
- +1:目标觉醒区域;
- 0:非觉醒区域(负样本);
- −1:不评分区域。
注意键路径是 data/arousals(HDF5 中的嵌套组),不是根级别的 arousals。直接用 f['arousals'] 会抛 KeyError,这是早期复现代码里出现频率最高的错误之一。
5.4 标签的构造逻辑
-arousal.mat 并不是直接来自技师标注,而是由 .arousal 的原始事件按规则展开得到的。构造过程可以还原为:
# 伪代码:目标觉醒窗口的构造规则
target = np.zeros(n_samples, dtype=np.int8)
for ev in events: # 遍历 .arousal 中的全部事件
if ev.type == 'arousal_rera':
target[ev.start - 2*sr : ev.end + 10*sr] = 1 # 前 2 秒 → 后 10 秒
elif ev.type.startswith('arousal_') and ev.type != 'arousal_rera':
target[ev.start - 2*sr : ev.end + 2*sr] = 1 # 前 2 秒 → 后 2 秒
for ev in events: # 第二遍:抹掉不评分区域
if ev.type in ('W_start', 'resp_apnea', 'resp_hypopnea'):
target[ev.start - 10*sr : ev.end + 10*sr] = -1 # 优先级最高
assert (target == 1).sum() + (target == 0).sum() + (target == -1).sum() == n_samples
(sr = 200。真实构造由官方完成,以上伪代码仅用于说明三态的覆盖关系,具体边界是否含端点在官方文档中未逐条说明,属遗留疑点。)
关键点是执行顺序:先把觉醒事件涂成 +1,再把清醒/呼吸暂停/低通气周围的区域涂成 −1。因此 −1 会覆盖掉一部分本应是 +1 的区域——这就是为什么"目标觉醒总时长"并不等于所有觉醒事件时长之和,也是为什么直接用 .arousal 重新构造标签会与官方 -arousal.mat 对不上。
5.5 类别不平衡有多严重
按训练集统计:
- 目标觉醒事件 43,836 个,平均每个事件对应约 5 至 8 秒(RERA 前 2 后 10 合计 12 秒,实际按事件长度浮动);
- 994 条记录 × 平均 5.5×10⁶ 采样点 ≈ 5.5×10⁹ 采样点;
- 假设平均每个目标觉醒事件贡献 10 秒(2,000 采样点)的 +1,则总正样本约 8.8×10⁷,占比约 1.5%;
- 再扣除 −1 的 10 秒窗口,实际参与评分的负样本占比会低于 98%。
1:65 左右的阳阴比,在采样点级二分类任务中属于"中等偏难"的不平衡。这个比例带来两个建模要点:
- 不能直接用 accuracy。全部预测为 0 就能拿到 98%+ 的准确率,但 AUPRC 接近 0。
- 随机欠采样会破坏事件结构。把负样本随机砍到 1:1,会切碎觉醒前后的上下文(觉醒前的 EEG 频率渐变恰恰是最有信息量的部分),建议用按窗口采样 + 保留上下文的方式,或在损失层面用 focal loss / 类别权重。
5.6 在采样点级读取的性能账
一条 7.7 小时记录读成 float32 需要 5.5×10⁶ × 13 × 4 ≈ 286 MB 内存;994 条全读需要 284 GB。可行的工程路径有三条:
| 路径 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| 全量预转 | 一次性转成 float32 .npy 分片,训练时 mmap |
训练快 | 需要 300 GB 以上磁盘 |
| 流式读取 | 每个 batch 现场 wfdb.rdrecord |
省磁盘 | I/O 成为瓶颈,GPU 利用率低 |
| 降采样 + 分块 | 先降到 50 Hz 存特征,候选段再回原采样率 | 磁盘与内存降 4 倍 | 高频信息(如 EMG 的爆发)受损 |
2018 年排名靠前的方案多数采用第三条 + 滑窗:以 30 秒或 60 秒窗口滑动,先做粗分类,再用更细粒度的模型对候选段打分。
§6 任务与标注:目标觉醒的精确定义
6.1 定义原文与拆解
官方对"目标觉醒(target arousal)"的定义是两条规则的并集:
From 2 seconds before a RERA arousal begins, up to 10 seconds after it ends or, From 2 seconds before a non-RERA, non-apnea arousal begins, up to 2 seconds after it ends.
拆成中文:
- 规则 A:呼吸努力相关觉醒(RERA)从开始前 2 秒到结束后 10 秒。
- 规则 B:非 RERA、且非呼吸暂停类的觉醒,从开始前 2 秒到结束后 2 秒。
- 排除规则:受试者清醒(W)、出现呼吸暂停(apnea)或低通气(hypopnea)前后 10 秒内的区域不评分。
为什么 RERA 之后要留 10 秒?因为 RERA 的判读本身就依赖"呼吸努力增加并伴随觉醒"这一组合,事件结束后往往紧跟一段通气恢复与脑电频率回落,把后 10 秒纳入目标区域,是在要求算法识别整个恢复过程,而不只是事件起点的皮层唤醒。
为什么排除呼吸暂停前后 10 秒?因为呼吸暂停相关的觉醒在临床上属于"呼吸事件的一环",已经被呼吸事件标签覆盖;如果不排除,算法只要学会检测呼吸暂停就能拿到高分,赛题就失去了"非呼吸暂停性觉醒"的意义。
6.2 与 AASM 觉醒定义的三处差异
AASM 手册对觉醒(arousal)的判读规则是:在 NREM 睡眠中,脑电频率突然转变为 α、θ 或频率大于 16 Hz(不含纺锤波)的波,持续 ≥3 秒,且在此之前有 ≥10 秒的稳定睡眠;在 REM 期,还需同时满足颏下 EMG 上升 ≥1 秒。AASM 只在 NREM/REM 期内判读觉醒,清醒期不存在觉醒。
CinC 2018 的目标觉醒与之有三处关键差异:
| 维度 | AASM 临床判读 | CinC 2018 目标觉醒 |
|---|---|---|
| 涵盖类型 | 全部觉醒(自发、呼吸相关、运动相关等) | 仅非呼吸暂停类,且实际以 RERA 为主(99.96%) |
| 时间窗 | 觉醒事件本身的时长(≥3 秒) | 事件前 2 秒至后 10 秒(RERA)/ 后 2 秒(其他) |
| 不评分区 | 无此概念 | 清醒、呼吸暂停、低通气前后 10 秒一律 −1 |
这三处差异决定了:在 CinC 2018 上训练的模型不能直接当作 AASM 觉醒检测器使用。如果要在临床场景落地,必须重新定义标签、重新标注数据,或者至少在使用说明中明确"本模型检测的是呼吸努力相关觉醒的扩展窗口"。
6.3 标注流程与技师一致性
论文明确写道:共 7 位技师参与标注,但每条 PSG 只由 1 位技师判读。这意味着数据集中不存在同一记录的多位技师标注,无法直接估计评分者间一致性(inter-rater reliability)。
这是一个重要但常被忽略的限制。2018 年的比赛没有设置"金标准复审"环节,也没有公布技师之间的 κ 值。相比之下,AASM 的觉醒判读一致性文献报道 κ 通常在 0.4 至 0.7 之间——也就是说,即使算法完美复现了某位技师的判读,与另一位技师的标注仍可能存在 30% 至 60% 的分歧。0.54 的冠军成绩,有相当一部分差距来自"标签本身的不确定性",而不是模型能力不足。
论文对这一点没有展开讨论,只提到"多位参赛方案表现出非确定性行为(同一记录多次运行结果不完全一致)",这是从算法侧观察到的不确定性,和数据侧的不确定性是两回事。
6.4 六期分期的粒度
-arousal.mat 只给了觉醒三态,睡眠分期在 .arousal 文件里。分期的判读遵循 AASM 的 30 秒规则:每 30 秒一个 epoch,判为 W、N1、N2、N3、REM 之一。论文 Table 2 给出的睡眠结构占比(训练集):
| 分期 | 全体(%) | 训练(%) | 测试(%) |
|---|---|---|---|
| Wake | 29.3 | 28.0 | 31.0 |
| NREM 1 | 19.5 | 19.6 | 19.0 |
| NREM 2 | 51.3 | 51.0 | 51.7 |
| NREM 3 | 13.8 | 14.0 | 13.8 |
| REM | 15.3 | 15.5 | 15.2 |
注意 Wake 高达 29.3%,远超普通人群(通常 5% 至 10%)。原因有二:受试者本身就是失眠或睡眠呼吸障碍患者;记录包含睡前卧床与晨间苏醒阶段。这意味着整夜记录里有近三成时间处于醒着状态,而这段时间恰恰处于不评分区,进一步压缩了有效评分时长。
6.5 任务的三层拆解
从任务形态看,CinC 2018 可以拆成三层,每层的难度与可用数据不同:
| 层级 | 输入 | 输出 | 官方是否计分 |
|---|---|---|---|
| L1 睡眠分期 | 30 秒 epoch 的 13 路信号 | 五分类(W/N1/N2/N3/REM) | 否(但可用 .arousal 自建) |
| L2 呼吸事件检测 | 30 秒 epoch 或事件段 | 四分类(低通气/阻/中/混) | 否 |
| L3 目标觉醒检测 | 逐采样点 | 二分类 + 概率 | 是 |
三层之间有强依赖:觉醒位置与睡眠分期、呼吸事件高度相关。2018 年部分队伍用了多任务学习,把 L1/L3 联合训练,效果优于单任务——这也是这个数据集在后续研究中被当作"多任务生理信号基准"使用的原因。
§7 评测协议:gross AUPRC 的细节
7.1 为什么不用准确率
沉睡一分钟、觉醒三秒——任何按采样点算准确率的模型都能轻易拿到 98% 以上。所以官方选了 AUPRC(area under the precision-recall curve,精确率-召回率曲线下面积)。PR 曲线对少数类更敏感,在 1:65 的不平衡下能真实反映模型对正类的检出能力。
7.2 概率分箱与阈值
官方评分脚本 score2018.py 的做法:
- 把每条记录的预测概率(0 至 1 的浮点)按 1/1000 分箱,共 1001 个箱(
input_digits=3,scale=1000)。 - 分别统计正样本(truth > 0)、负样本(truth == 0)、不评分样本(truth < 0)在各箱中的数量。
- 沿阈值从低到高逐箱累积,计算每个阈值下的 precision 与 recall:
$$p_j = \frac{|A \cap P_j \cap N|}{|P_j \cap N|}, \qquad r_j = \frac{|A \cap P_j \cap N|}{|A \cap N|}$$
其中 $A$ 为目标觉醒样本集,$P_j$ 为预测概率 ≥ $j/1000$ 的样本集,$N$ 为参与评分的样本集(不含 −1)。
- 用梯形/矩形积分求 PR 曲线面积:
$$\text{AUPRC} = \sum_j p_j (r_j - r_{j+1})$$
7.3 gross 与 macro 的差异
gross AUPRC:先把全部记录的 TP/FP/FN 汇总再算曲线,等于把整个测试库当成一个超长记录。
macro AUPRC:每条记录各自算 AUPRC,再平均。
两者在以下情况会显著不同:
- 觉醒极少的记录:macro 口径下,这类记录的 AUPRC 可能为 NaN(分母为 0),需要特殊处理;gross 口径下自然被淹没。
- 记录长度差异大:gross 口径下,长记录权重更大;macro 口径下每条记录等权。
- 测试集构成:官方 989 条测试记录中,只要有一条觉醒数极多,它的表现就会左右总分。
官方选择 gross 的理由论文没有明说,但从实现看,gross 更贴近"部署一套系统处理整个睡眠中心所有患者"的实际需求:总体的阳性检出效率,而不是每条记录的平均表现。
7.4 提交格式与沙箱
参赛者需要提交可运行的代码(不是预测结果),在官方沙箱中执行,对每条测试记录输出一个 .vec 文本文件:
annotations/te09-0094.vec
.vec 每行一个概率值,长度必须等于该记录的采样点数。若长度不符,官方会截断或补零;若某条记录运行失败,按全零向量计分。这两条规则意味着"跑通"本身就是一道门槛——2018 年 624 次提交中有 82% 是 dry-run(试跑),真正进入评分的只有 37 次。
7.5 官方提供的评分器
PhysioNet 页面提供两份等价实现:score2018.py(Python,依赖 numpy 与 h5py)与 score2018.m(MATLAB/Octave)。Python 版的核心类是 Challenge2018Score,提供:
score_record(truth, predictions, record_name):逐条累积;gross_auprc()/gross_auroc():全库汇总指标;record_auprc(name)/record_auroc(name):单条指标。
注意脚本除了 AUPRC 还会输出 AUROC。AUROC 在极度不平衡时容易虚高(0.9 以上的 AUROC 对应可能只有 0.3 的 AUPRC),不要用 AUROC 作为调参主指标。
§8 AI 就绪指南:从原始 WFDB 到可训练张量
8.1 环境准备
# 推荐环境:Python 3.10+,Linux/macOS
pip install wfdb h5py numpy scipy pandas scikit-learn torch matplotlib
wfdb 是 PhysioNet 官方维护的读取库,能自动处理 16+24 格式、增益换算与标注配对,务必使用它而不是自己解析二进制。
8.2 下载策略
整库 266.6 GB,浏览器下载不现实。推荐三种方式:
# 方式一:wget 递归(只在 training 与 test 各跑一次,避免重复)
wget -r -N -c -np --user <你的PhysioNet账号> --ask-password \
https://physionet.org/files/challenge-2018/1.0.0/training/
# 方式二:仅下载 RECORDS 清单,按需抓取单条(适合先做探索)
curl -O https://physionet.org/files/challenge-2018/1.0.0/RECORDS
while read r; do
base=$(basename "$r")
curl -O "https://physionet.org/files/challenge-2018/1.0.0/${r}.hea"
curl -O "https://physionet.org/files/challenge-2018/1.0.0/${r}.mat"
curl -O "https://physionet.org/files/challenge-2018/1.0.0/${r}.arousal"
curl -O "https://physionet.org/files/challenge-2018/1.0.0/${r}-arousal.mat"
done < <(head -20 RECORDS)
# 方式三:AWS S3(PhysioNet 官方镜像,速度更快)
aws s3 sync --no-sign-request s3://physionet-open/challenge-2018/1.0.0/ ./cinc2018/
下载后务必校验 SHA256SUMS.txt,PhysioNet 偶尔会因为网络中断产生截断的 .mat 文件,截断文件读出来长度不足会直接导致后续标签长度不匹配。
8.3 读取单条记录
import wfdb
import numpy as np
import h5py
REC = 'training/tr03-0005/tr03-0005'
# 1) 信号 + 头文件
rec = wfdb.rdrecord(REC, physical=True) # 自动按增益还原为物理单位
sig = rec.p_signal # shape = (n_samples, 13)
fs = rec.fs # 200
names = rec.sig_name # ['F3-M2', 'F4-M1', ..., 'ECG']
# 2) 事件标注(睡眠分期 + 12 类事件)
ann = wfdb.rdann(REC, 'arousal')
for t, sym in zip(ann.sample, ann.aux_note):
print(t / fs, sym) # 秒级时刻 + 事件名
# 3) 逐采样点三态标签
with h5py.File(REC + '-arousal.mat', 'r') as f:
truth = np.ravel(f['data']['arousals'])
assert len(truth) == sig.shape[0], (len(truth), sig.shape)
三处必须检查:
len(truth) == sig.shape[0]:不相等说明下载截断或读取库版本不匹配。rec.p_signal是否含 NaN:部分记录的 ABD/CHEST 通道在某些时段缺失,会以 NaN 出现,需前向填充。truth的 dtype:h5py读出来可能是 int8,转 float 前不要做归一化。
8.4 预处理流水线
推荐的四步流水线(在训练集上验证过,可作为基线):
import numpy as np
from scipy import signal
def preprocess(sig, fs=200, target_fs=50):
"""sig: (n_samples, 13) 物理单位;返回 (n_down, 13)"""
# 步骤 1:逐通道去均值(不做全局 z-score!)
sig = sig - np.nanmean(sig, axis=0, keepdims=True)
# 步骤 2:缺失值前向填充
df = __import__('pandas').DataFrame(sig)
sig = df.ffill().bfill().to_numpy()
# 步骤 3:带通滤波(EEG/EOG 0.3-35 Hz;EMG 10-100 Hz;ECG 0.5-40 Hz)
sos_eeg = signal.butter(4, [0.3, 35], btype='band', fs=fs, output='sos')
sig[:, 0:7] = signal.sosfiltfilt(sos_eeg, sig[:, 0:7], axis=0)
# 步骤 4:抗混叠降采样
sig = signal.resample_poly(sig, up=1, down=fs // target_fs, axis=0)
return sig.astype(np.float32)
四个要点:
- 逐通道去均值,不做全局标准化。ECG 的幅值是 EEG 的百倍,全局 z-score 会让脑电被压成一条直线。
- 滤波必须用零相位(
filtfilt/sosfiltfilt)。因果滤波会引入固定延迟,把觉醒事件的起始点整体后移十几毫秒,虽然对 AUPRC 影响不大,但会让事件边界对齐变差。 - 降采样前必须抗混叠。用
resample_poly而不是直接[::4],否则 50 Hz 以上的肌电爆发会镜像折叠到低频,污染脑电。 - SaO2 单独处理。它是样点保持产生的阶梯信号,滤波会把它抹平,直接降采样取每 4 个点即可。
8.5 标签生成与窗口切片
def make_windows(sig, truth, fs=200, win_sec=60, hop_sec=10):
"""滑窗切分,返回 (X, y_window, y_point)"""
win, hop = win_sec * fs, hop_sec * fs
X, yw, yp = [], [], []
for start in range(0, len(truth) - win, hop):
seg = sig[start:start + win]
lbl = truth[start:start + win]
# 窗口级标签:窗口内是否存在目标觉醒(剔除不评分区后)
scored = lbl[lbl >= 0]
if len(scored) == 0:
continue # 全是不评分区,跳过
X.append(seg)
yw.append(int((scored == 1).mean() > 0.05))
yp.append(lbl) # 保留逐点标签供精判阶段用
return np.stack(X), np.array(yw), yp
窗口长度与步长是关键超参数:
- 60 秒窗 / 10 秒步长:约 30 倍重叠,正样本窗口占比约 30%,适合粗筛。
- 10 秒窗 / 1 秒步长:定位精度更高,但样本量爆炸(每条记录上千窗)。
- 整夜序列:适合 Transformer/TCN 这类长序列模型,但显存压力大,需要梯度检查点。
8.6 训练集内的验证划分
官方只给了训练/测试二划分,测试标签不可见。必须在训练集内部再划分:推荐按受试者做 5 折(GroupKFold),而不是按记录随机划分——虽然官方说训练集内没有受试者重叠,但同一患者的多次记录在编号上相邻,按记录随机划分仍可能造成信息泄漏。
from sklearn.model_selection import GroupKFold
# 假设 groups 为每条记录的受试者 ID(训练集中可由编号前 8 位近似)
gkf = GroupKFold(n_splits=5)
for tr_idx, va_idx in gkf.split(X, y, groups):
...
8.7 基线模型推荐
按投入产出比排序:
| 方案 | 大致 AUPRC(训练集内 hold-out) | 训练时间 | 说明 |
|---|---|---|---|
| 逻辑回归 + 手工特征 | 0.20 至 0.25 | 分钟级 | 频带功率、EMG 方差、气流方差 |
| XGBoost + 30 秒窗特征 | 0.30 至 0.35 | 小时级 | 2018 年多支队伍的主力方案 |
| CNN(1D,多通道融合) | 0.35 至 0.45 | 数小时 | 7 层卷积 + 全局池化 |
| CNN + BiLSTM/TCN | 0.40 至 0.50 | 半天 | 捕捉觉醒前后的呼吸节律 |
| 多任务 CNN(分期 + 觉醒) | 0.45 至 0.55 | 一天 | 接近冠军水平 |
注意:上表是从文献与公开仓库结果归纳的量级参考,不是本条目实测;不同验证划分下差异可能很大,务必用自己的 hold-out 重新标定。
§9 基准与战绩:2018 年的成绩单
9.1 参赛规模
- 624 次提交,来自 34 个不同的 PhysioNet 用户;
- 82% 为 dry-run(测试沙箱兼容性);
- 37 次有效提交进入评分,来自 24 个用户;
- 最终 19 支队伍的终榜成绩进入官方排名(每队一次);
- 论文表述"共 22 支独立队伍参赛",与终榜 19 支的差异在于 3 支未完成最终提交或未通过规则审查。
9.2 官方终榜(Table 3)
| 名次 | 队伍(第一作者为主要代表) | AUPRC |
|---|---|---|
| 1 | Howe-Patterson, Pourbabaee & Benard | 0.54 |
| 2 | Kristjánsson, Þráinsson, Ragnarsdóttir 等 9 人 | 0.45 |
| 3 | He, Wang, Liu, Zhao, Yuan, Li & Zhang | 0.43 |
| 4 | Varga, Görög & Hajas | 0.42 |
| 5 | Patane, Ghiasi, Scilingo & Kwiatkowska | 0.40 |
| 6 | Miller, Ward & Bambos | 0.36 |
| 6 | Warrick & Homsi | 0.36 |
| 8 | Bhattacharjee, Das, Choudhury & Banerjee | 0.29 |
| 8 | Szalma, Bánhalmi & Bilicki | 0.29 |
| 10 | Parvaneh, Rubin, Samadani, Prakash & Katuwal | 0.21 |
| 11 | Plešinger, Nejedly, Viscor, Andrla, Halámek & Jurák | 0.20 |
| 12 | Zabihi, Rad, Särkkä, Kiranyaz, Katsaggelos & Gabbouj | 0.19 |
| 13 | Schellenberger, Shi, Mai, Wiedemann, Steigleder, Eskofier, Weigel & Kölpin | 0.14 |
| 14 | Li, Cao, Zhong & Pan | 0.10 |
| 14 | Jia, Yu, Yan, Zhao, Xu, Hu, Wang & You | 0.10 |
| 16 | Shen | 0.07 |
| 非官方 | Li & Guan(错过摘要截止) | 0.55 |
| 非官方 | Bilal, Khan, Khan, Qureshi, Saleem & Kamboh | 0.15 |
| 非官方 | Wang, Wang & Li | 0.07 |
官方页面的 results.csv 与本条目存在一处口径差异:PhysioNet 下载页的 results.csv 中,“sample entry”(官方示例代码)记为 0.12,而挑战论文 Table 3 未列该条目;另有一处 0.10 对应两支队(Li 等的 2023 号与 Jia 等的 2025 号),论文 Table 3 中同时出现。本条目以论文 Table 3 为主口径,results.csv 为辅口径存照(详见 §11)。
9.3 成绩分布的解读
- 冠军 0.54、中位数 0.29、均值 0.28:典型的长尾分布。头部三支队伍(0.54、0.45、0.43)与第四名(0.42)差距不大,但与后面迅速拉开。
- 最低 0.07:与"全预测为 0"的基线(AUPRC ≈ 0.015,即正样本占比)相比仍有提升,但实务价值接近于零。
- 非官方 0.55 略高于官方冠军:说明 0.55 附近的性能是可以达到的,官方冠军并非天花板。论文对此的评价是"非官方最高分表明自动觉醒检测是可行的"。
- 神经网络不是决定性因素:22 份终榜方案中 13 份用了神经网络,前十里 8 份用了;但后十里里也有 4 份用了。论文的原话是"they are powerful when used correctly"——用对了才强。
9.4 论文自陈的四个局限
挑战论文在结论部分罕见地列了四条自我批评,对使用者很有参考价值:
- 没有对计算效率计分。官方只限制了 1.2×10¹³ 条 CPU 指令(约 3.5 小时),但同样 AUPRC 下跑 2 小时与跑 2 分钟得一样的分,实际部署中后者明显更优。
- AUPRC 不反映校准(calibration)。一个校准良好的模型能给出"此刻觉醒概率 0.7±0.1"这样的区间描述,比二值判断更有临床价值,但 AUPRC 完全无视这一点。
- 部分方案存在非确定性。同一记录多次运行结果不完全一致(随机种子、GPU 非确定性算子),使成绩难以精确复现。
- 测试标签永久隐藏。论文明确说测试集标签"将保持私密,以便后续研究"——这意味着 2018 年之后没有任何团队能在这个测试集上做独立复现。
§10 消歧:与库内睡眠数据集的边界
10.1 同物异名:cinc-2018-sleep(rid=493)
库内已有一条 cinc-2018-sleep(rid=493,题名「CinC 2018 睡眠觉醒 — 从 PSG 检测睡眠微觉醒」),与本条目描述的是同一份数据:同源 PhysioNet challenge-2018 v1.0.0、同 1,983 例记录、同 gross AUPRC 评测。两者的差异在于 slug 写法与编制口径:
| 维度 | cinc-2018-sleep(rid=493) |
本条目 cinc-2018-sleep-arousal |
|---|---|---|
| slug | 简短形,仅含年份与任务大类 | 完整形,显式带 arousal 任务词,防与 2018 年其他赛道混淆 |
| 记述重点 | 数据规格、DAIMS 数据字典、预处理代码、基准性能 | 标注协议细节、gross 指标实现、消歧、库内互链 |
| 引用建议 | 首次检索命中 | 需要精确限定"觉醒检测任务"时使用 |
两个 slug 不可合并引用。若在论文或产品中同时引用,应写「参见千方病案医数集 cinc-2018-sleep(rid=493)与 cinc-2018-sleep-arousal,二者为同一 PhysioNet 数据集的两种编目视图」。
10.2 与库内其他睡眠数据集的六维对照
| 数据集(库内 rid) | 受试者/记录 | 信号 | 标签粒度 | 人群 | 与本条目的关系 |
|---|---|---|---|---|---|
| CinC 2018(本文 / rid=493) | 1,985 人 / 1,983 条 | 13 路 200 Hz | 逐采样点觉醒三态 + 30 秒六期 | MGH 睡眠门诊患者 | — |
| Sleep-EDF(rid=73) | 约 100 人 / 197 条 | 2 路(Fpz-Cz、Pz-Oz)+ EOG | 30 秒分期 | 健康志愿者 + 失眠患者 | 分期基准;无觉醒点级标注 |
| MASS(rid=272) | 200 人 / 200 条 | 19 路 256 Hz | 30 秒分期 + 部分事件 | 多中心混合 | 信号最全,但无逐点觉醒 |
| SHHS(rid=282) | 5,804 人(Visit 1) | 居家 PSG,多路 | 30 秒分期 + 呼吸事件 | 社区队列,中老年 | 规模最大,事件标签非点级 |
| MrOS Sleep(rid=292) | 2,911 人 | 居家 PSG | 30 秒分期 + 呼吸事件 | 老年男性 | 与 SHHS 同属 NSRR 家族 |
| MESA Sleep(rid=302) | 2,000+ 人 | 居家 PSG + 体动 | 30 秒分期 + 呼吸事件 | 多民族社区队列 | 心血管结局导向 |
一句话区分:SHHS/MrOS/MESA 回答"这个人的睡眠呼吸指标如何、与心血管结局什么关系";MASS/Sleep-EDF 回答"这段 30 秒是什么睡眠期";CinC 2018 回答"此刻这一秒是否处于觉醒区"。
10.3 与 ISRUC、CAP Sleep、NCH 的关系
- ISRUC-Sleep(rid=262):葡萄牙 Coimbra 的 108 名受试者,信号含 EEG/EOG/EMG,标注为 30 秒分期,含少量觉醒标签。规模小但全夜、含健康与患者两组,常被用作 CinC 2018 的外部验证集。
- CAP Sleep(rid=1072):意大利的 108 例,重点是周期性交替模式(CAP)与微觉醒的耦合,含微觉醒标注(但为事件级而非采样点级)。若研究觉醒的周期性结构,CAP 是更好的选择。
- NCH Sleep DataBank(rid=1013):美国全国儿童医院的儿科 PSG + 纵向 EHR,是儿科觉醒研究的唯一大规模公开资源;CinC 2018 全部为成人,两者不可混用。
10.4 与 CinC 其他年份挑战的关系
| 年份 | 主题 | 与本条目的关系 |
|---|---|---|
| 2016(rid=382) | 心音分类 | 无关 |
| 2017(rid=162) | 单导联房颤分类 | 无关 |
| 2018(rid=493 / 本文) | 睡眠觉醒检测 | 本体 |
| 2020/2021 | 12/12+ 导联心电多任务 | 无关,但共用 PhysioNet 托管与评分框架 |
§11 质量评估与局限性
11.1 DAIMS 评估
DAIMS(Data and AI Maturity Score,数据与 AI 成熟度评分)从六个维度评估数据集对 AI 工程的成熟度,每项 0 至 5 分:
| 维度 | 含义 | 得分 | 依据 |
|---|---|---|---|
| D1 可获得性 | 是否开放、许可是否清晰、下载是否便利 | 5/5 | ODC-By 1.0,免注册,直链 + S3 + wget 三通道 |
| D2 文档完备度 | 是否有官方说明、论文、格式规范 | 5/5 | PhysioNet 页面 + CinC 论文 + score2018 脚本 + RECORDS 清单 |
| D3 标注质量 | 标注者资质、一致性、复审机制 | 3/5 | 7 位技师,但每条仅 1 人判读,无一致性统计,无复审 |
| D4 划分合理性 | 训练/测试是否独立、是否分层 | 5/5 | 无受试者重叠;AHI 分布 KS 检验 p=0.97 保证平衡 |
| D5 工程友好度 | 格式标准化、加载工具成熟度 | 3/5 | WFDB 标准但 .mat 为 MATLAB V4 + 24 字节偏移,-arousal.mat 为 HDF5,需专门处理 |
| D6 可复现性 | 第三方能否独立复现报告的性能 | 2/5 | 测试标签永久隐藏,无官方 leaderboard 复核,部分方案非确定性 |
| 综合 | — | 3.8/5 | 数据开放、文档完备、划分严谨;短板在标注一致性与可复现性 |
结论:这是一个"拿来就能训"的数据集,但不是"拿来就能评"的数据集。训练侧的成熟度接近满分,评测侧的封闭性(测试标签永久隐藏)是所有使用者的共同约束。
11.2 双口径存照
以下六处数字在官方页面、挑战论文与二手文献之间存在差异,本条目逐条存照,正文采用标注为"主口径"的那一版:
| # | 事项 | 口径 A | 口径 B | 本条目取舍 |
|---|---|---|---|---|
| 1 | 受试者数 | PhysioNet 页面与多数二手文献:1,985 名受试者 | 挑战论文:1,983 条 PSG 记录(训练 994 + 测试 989) | 记录数用 1,983,受试者数用 1,985,两者并行引用 |
| 2 | 参赛队伍数 | 挑战论文正文:22 支独立队伍 | 论文 Table 3 + results.csv:19 支队伍进入终榜 | 参赛 22、终榜 19,两者都写 |
| 3 | 冠军成绩 | 挑战论文 Table 3:0.54 | 非官方最高:0.55(Li & Guan,错过摘要截止) | 冠军 0.54,非官方 0.55 单列 |
| 4 | 示例代码成绩 | PhysioNet results.csv:sample entry 0.12 |
挑战论文 Table 3:未列该条目 | 以论文为准,结果表附注 |
| 5 | 最低成绩 | 论文:0.07(两支队并列) | 非官方 0.07(Wang 等) | 官方最低 0.07 |
| 6 | 数据体积 | PhysioNet 页面:266.6 GB(未压缩) | 社区常见转述:“约 135 GB”(这是单侧 training 或 test 的量) | 采用 266.6 GB 为整库,135 GB 为单侧 |
11.3 已知局限清单
- 单中心:全部来自 MGH 一家睡眠中心,采集设备批次(
tr03至tr14)随年份变化,设备差异可能成为模型学到的"捷径"。 - 患者群体偏斜:全部为因睡眠问题就诊的成人,AHI 均值 19,四成有高血压,近三成用助眠药。健康人群与儿童缺失。
- 无评分者间一致性:每条记录仅 1 位技师判读,7 位技师的分歧程度未量化。
- 目标定义特化:仅非呼吸暂停类觉醒,且实际 99.96% 为 RERA,模型容易退化为 RERA 检测器。
- 测试标签永久隐藏:无法独立复现,也无官方 leaderboard 可复核。
- 通道子集:原始 PSG 中的腿部肌电(PLM 判读依赖)、体位、视频、声音未随包发布,使 PLM 相关觉醒(仅 36 个)几乎不可用。
- 清醒期占比异常高(29.3%):虽是真实临床数据,但会显著改变整夜信号的能量分布。
- 不评分区覆盖面积大:清醒 + 呼吸暂停 + 低通气前后各 10 秒,合计可能覆盖整夜 30% 以上的时长,训练时可监督的样本被系统性削减。
- 类别极不平衡(约 1:65),且正样本在时间上高度聚集(一次觉醒持续数秒,相邻窗口高度相关),简单的随机划分会造成验证集泄漏。
- 缺少元数据表:官方只提供
age-sex.csv(记录名、性别、年龄),没有 BMI、AHI、ESS 等论文 Table 1 中的字段,做人群分层分析需要自行补数。
11.4 什么场景该用、什么场景不该用
| 场景 | 是否适用 | 理由 |
|---|---|---|
| 训练睡眠觉醒事件检测模型 | ✅ 最适用 | 唯一提供逐采样点觉醒标签的公开 PSG 数据集 |
| 睡眠分期(30 秒五分类) | ✅ 可用 | .arousal 内含分期标注,但需自行解析 |
| 呼吸事件检测 | ✅ 可用 | .arousal 内含 4 类呼吸事件,标注完整 |
| 多任务学习 / 表征预训练 | ✅ 适合 | 13 路信号 + 三类标签,适合作为生理信号预训练语料 |
| 临床 AASM 觉醒检测器验证 | ❌ 不适用 | 目标定义与 AASM 口径不同,不评分区规则也不同 |
| 儿童睡眠研究 | ❌ 不适用 | 全部为成人 |
| 可穿戴单/双通道算法 | ⚠️ 有限适用 | 13 路信号,降采样到单通道需大幅裁剪,且需处理通道缺失 |
| 跨中心泛化验证 | ⚠️ 需搭配其他数据集 | 单中心,无法自证泛化,建议搭配 MASS 或 ISRUC 做外部验证 |
§12 避坑清单:八个已踩过的坑
坑 1:把 1,983 和 1,985 当作两个不同数据集
现象:检索时看到"1,985 名受试者"和"1,983 条记录"两种说法,误以为是 v1.0.0 与某个后续版本,或误以为其中 2 条记录被弃用。
根因:PhysioNet 页面按受试者计数(1,985 人),挑战论文按记录计数(1,983 条)。有两名受试者可能各有多条记录,或两名受试者的记录在整理时被剔除,官方未给出解释。
对策:引用时按用途选口径——描述人群规模用 1,985,描述可下载文件数用 1,983。RECORDS 文件中实际有 1,983 行,这是最硬的证据。
坑 2:直接用 numpy.fromfile 读 .mat,波形整体错位
现象:用 np.fromfile('tr03-0005.mat', dtype=np.int16) 读出数据,reshape 成 (13, -1) 后发现波形有周期性尖刺,或第一个通道数值离谱。
根因:头文件中的 16+24 表示每个采样点 16 位、但每 24 字节有一个额外偏移(WFDB 的 offset 扩展)。直接按 16 位连续读,会把偏移区的元数据当成信号。
对策:用 wfdb.rdrecord();若必须自己读,按 n_groups_of_24 计算偏移跳读,或先转成 .npy 缓存。
坑 3:把 -arousal.mat 当成普通 MATLAB MAT 用 scipy.io.loadmat 读
现象:scipy.io.loadmat('tr03-0005-arousal.mat') 抛 NotImplementedError: Please use HDF reader for matlab v7.3 files。
根因:该文件是 MATLAB V7.3 格式,本质是 HDF5。scipy.io 只支持 V7 及以下版本。
对策:用 h5py 读取,键路径为 data/arousals:
import h5py, numpy as np
with h5py.File('tr03-0005-arousal.mat', 'r') as f:
truth = np.ravel(f['data']['arousals'])
若要统一处理,可先转成 .npy:np.save('tr03-0005_truth.npy', truth)。
坑 4:试图在测试集上计算 AUPRC
现象:下载了 test 目录,发现 te09-0094-arousal.mat 不存在,或反过来源码按训练集的结构去遍历 glob('*.arousal'),测试集一条都扫不到。
根因:测试集标签自 2018 年起永久隐藏。实测 test/te03-0024/ 目录下只有 .hea 与 .mat 两个文件——.arousal(分期与事件标注)与 -arousal.mat(三态向量)都未发布,请求 .arousal 会得到 404。因此测试集的睡眠分期标签同样不可得,不能拿测试集做无监督分期的自评。
对策:只能在训练集内部划分验证集评测。若必须报告测试集成绩,只能引用 2018 年论文的终榜数字,并注明"测试标签不可得,无法独立复现"。
坑 5:用 AASM 的 3 秒规则重新标注,与原标签严重不符
现象:按 AASM 规则(频率加快 ≥3 秒)从 EEG 自动检测觉醒,与 -arousal.mat 对不上,F1 不到 0.1。
根因:官方标签不是 AASM 觉醒,而是"目标觉醒扩展窗口"——RERA 向后延 10 秒、其他向后延 2 秒,还要扣除不评分区。两者的时间边界完全不同。
对策:如果要复现官方成绩,必须用官方标签,不要自行重标;如果要做 AASM 觉醒检测,应明确定义新任务并重新标注,不要拿 CinC 2018 的成绩与之比较。
坑 6:对 13 路信号做全局 z-score 归一化
现象:归一化后 EEG 通道几乎变成一条水平直线,模型只能学到心电的 QRS 波。
根因:ECG 幅值可达数千 µV,EEG 只有几十 µV,SaO2 又是 0 至 100 的百分比。全局标准化的均值与方差被 ECG 主导。
对策:逐通道去均值,再按通道类型分别缩放(EEG/EOG 除以 50,EMG 除以 20,ECG 除以 1000,SaO2 除以 100),或直接用 sklearn.preprocessing.RobustScaler 逐通道拟合。
坑 7:按记录随机划分验证集,AUPRC 虚高
现象:训练集内 hold-out 报告 0.6,但换一批记录后掉到 0.35。
根因:同一受试者的多次记录在编号上相邻(如 tr05-0123 与 tr05-0124),按记录随机划分会让同一患者的多条记录分别落入训练与验证,模型记住了患者的个体特征(如呼吸节律、体位习惯)。
对策:按受试者分组做 GroupKFold。受试者 ID 不在元数据中,可用记录编号前缀 + 相邻编号聚类近似,或使用 PhysioNet 的 age-sex.csv 结合编号做人工配对。
坑 8:直接对预测结果做逐记录 AUPRC 平均来对标官方成绩
现象:自己算出的逐记录平均 AUPRC 是 0.42,而论文冠军是 0.54,误以为自己已经超过冠军的一半水平。
根因:官方用的是 gross AUPRC(全库汇总),逐记录平均是 macro 口径。两者在长尾分布下可以相差 0.05 至 0.15。
对策:直接用 score2018.py 的 Challenge2018Score 类,调用 score_record() 逐条累积后取 gross_auprc()。不要自己实现 PR 曲线,官方的 1/1000 分箱与累积方式有细节差异。
§13 工程实践:一份可跑的最小实现
13.1 目录结构
cinc2018/
├── raw/
│ ├── training/tr03-0005/{tr03-0005.mat, .hea, .arousal, -arousal.mat}
│ └── test/te09-0094/{te09-0094.mat, .hea, .arousal}
├── cache/
│ ├── sig/tr03-0005.npy # float32, (n, 13), 50 Hz
│ └── lbl/tr03-0005.npy # int8, (n,), 50 Hz
├── splits/
│ └── fold0.json # {"train": [...], "val": [...]}
└── runs/
└── cnn-fold0/best.pt
13.2 批量预处理脚本
import os, json
import numpy as np
import wfdb, h5py
from scipy import signal
FS_TARGET = 50
def load_one(root, rec_id):
path = os.path.join(root, rec_id, rec_id)
rec = wfdb.rdrecord(path, physical=True)
sig = rec.p_signal.astype(np.float32)
with h5py.File(path + '-arousal.mat', 'r') as f:
truth = np.ravel(f['data']['arousals']).astype(np.int8)
assert len(truth) == len(sig), f'{rec_id}: {len(truth)} vs {len(sig)}'
return sig, truth, rec.fs
def resample(sig, truth, fs_in, fs_out=FS_TARGET):
d = fs_in // fs_out
sig = signal.resample_poly(sig, 1, d, axis=0)
# 标签用众数下采样(对三态,优先保留 -1 > 1 > 0,保守估计)
n = len(truth) // d
truth = truth[:n * d].reshape(n, d)
prio = np.array([-1, 1, 0])
lbl = np.take(prio, np.argmax((truth[..., None] == prio).sum(axis=1), axis=1))
return sig, lbl
def build(rec_list, root, out_root):
os.makedirs(f'{out_root}/sig', exist_ok=True)
os.makedirs(f'{out_root}/lbl', exist_ok=True)
for i, rec in enumerate(rec_list):
try:
sig, truth, fs = load_one(root, rec)
sig, lbl = resample(sig, truth, fs)
name = os.path.basename(rec)
np.save(f'{out_root}/sig/{name}.npy', sig)
np.save(f'{out_root}/lbl/{name}.npy', lbl)
except Exception as e:
print(f'[skip] {rec}: {e}')
if i % 50 == 0:
print(f'{i}/{len(rec_list)}')
注意标签下采样的优先级:把 200 Hz 的标签降到 50 Hz 时,同一 4 个采样点里可能同时出现 +1、0、−1。本脚本按 -1 > 1 > 0 的优先级取众数,即保守地保留不评分区,宁可少算正样本也不把不评分区当负样本。这是一个可调的策略,不同取舍会让 AUPRC 上下浮动 0.01 至 0.03。
13.3 模型骨架(1D CNN + 注意力池化)
import torch
import torch.nn as nn
class ArousalNet(nn.Module):
def __init__(self, in_ch=13, base=64):
super().__init__()
def block(i, o, k=7):
return nn.Sequential(
nn.Conv1d(i, o, k, padding=k // 2, bias=False),
nn.BatchNorm1d(o), nn.ReLU(),
nn.MaxPool1d(2),
)
self.stem = nn.Sequential(block(in_ch, base), block(base, base * 2),
block(base * 2, base * 4))
self.head = nn.Conv1d(base * 4, 1, 1) # 逐点 logit
def forward(self, x): # x: (B, 13, T)
h = self.stem(x) # (B, C, T/8)
logit = self.head(h).squeeze(1) # (B, T/8)
return nn.functional.interpolate(
logit.unsqueeze(1), size=x.shape[-1], mode='linear'
).squeeze(1) # 上采样回原长度
这个骨架在 50 Hz、60 秒窗口下,单卡 16 GB 显存的批大小约 32。关键设计点是逐点输出而非窗口级分类——与官方评测口径一致,避免"窗口内有觉醒就整窗为 1"带来的边界模糊。
13.4 损失函数选择
AE 不平衡下的损失对比:
| 损失 | 对不平衡的处理 | 适用场景 |
|---|---|---|
| BCE | 无 | 基线,AUPRC 通常偏低 |
| BCE + pos_weight(65) | 手动配权 | 简单有效,需调 |
| Focal Loss(γ=2) | 难样本聚焦 | 与 pos_weight 联用效果好 |
| Dice Loss | 区域重叠 | 对小事件友好,但训练不稳 |
| BCE + Dice 加权和 | 兼顾 | 多数论文的选择 |
推荐从 BCE + pos_weight=50 起步,再试 Focal(γ=2、α=0.25)。
13.5 训练与评估循环
from score2018 import Challenge2018Score # 官方脚本,需先将类改为可导入
def evaluate(model, loader, device):
scorer = Challenge2018Score(input_digits=3)
model.eval()
with torch.no_grad():
for x, y in loader:
x, y = x.to(device), y.to(device)
prob = torch.sigmoid(model(x)).cpu().numpy()
truth = y.cpu().numpy()
for i in range(len(prob)):
scorer.score_record(truth[i], prob[i])
return scorer.gross_auprc(), scorer.gross_auroc()
重点:评估必须用官方的 Challenge2018Score,不要用 sklearn.metrics.average_precision_score。后者是精确率-召回率的另一种积分方式(阶梯面积),与本数据集的 1/1000 分箱累积在数值上可差 0.02 至 0.04。
13.6 一次完整的实验记录模板
run_id: cnn-fold0-20261017
data: cinc-2018 training (n=994), fold0 (val 199)
preprocess: hp/lp 0.3-35Hz -> 50Hz
window: 60s / hop 10s
model: ArousalNet(base=64)
loss: BCE(pos_weight=50)
optim: AdamW lr=3e-4 wd=1e-4, cosine
epochs: 30, batch 32
val_gross_auprc: 0.XXX # 逐 epoch 用 Challenge2018Score 计算
val_gross_auroc: 0.XXX
notes: 标签下采样优先级 -1>1>0
§14 生态与下游应用
14.1 2018 年之后:从"赛题数据"到"社区基准"
挑战赛结束后,PhysioNet 页面保持开放下载,训练集 994 条记录成为后续研究的公共语料。观察 2019 至 2025 年的公开文献,这批数据主要出现在四类工作中:
- 觉醒检测算法改进。多数论文沿用官方 gross AUPRC,但都退回到自建的训练集内划分(如 5 折交叉验证或 80/20),因此报告的绝对值与 2018 年官方终榜不可直接比较。常见的虚高来源有三:按记录随机划分、使用逐记录平均、在验证集上早停后仍按最佳 epoch 报告。
- 睡眠分期 + 觉醒多任务学习。利用
.arousal中的六期标签与-arousal.mat的觉醒标签,同时训练两个头,共享特征提取器。这类工作通常报告"分期准确率提升 + 觉醒 AUPRC 提升"的双收益。 - 表征学习与预训练。把 13 路信号当作多通道时序语料做自监督预训练(掩码重建、对比学习),再迁移到 Sleep-EDF、SHHS 等数据集做分期。
- 可穿戴/家用场景迁移。把 13 路信号裁剪到单导联或双导联,测试在消费级设备上的可行性,作为"实验室到家庭"的桥接实验。
14.2 公开代码与复现仓库
挑战赛本身要求开源,因此 19 份终榜方案的代码在赛后以 MIT/GPL 许可证公开,多数可在 PhysioNet 的 challenge 页面、各队 GitHub 或论文附录中找到。使用时的注意事项:
- 许可证不统一。GPLv3 方案若被用于闭源产品,会触发传染条款;商用场景优先选 MIT X11 的方案(当年 8 份)。
- 代码多为比赛期快照。依赖的库版本较老(Python 3.5/3.6、旧版 TensorFlow 或 Keras),直接跑通需要环境隔离。
- 部分方案含硬编码路径。沙箱环境的目录结构与本地不同,需改路径与采样率假设。
14.3 与睡眠医学工作流的接口
在真实睡眠中心,CinC 2018 训练出的模型可以嵌在三个位置:
| 位置 | 作用 | 成熟度 |
|---|---|---|
| 预筛(pre-screening) | 整夜记录先跑一遍,标出高觉醒密度的时段供技师优先复核 | 高,误差可被人工兜底 |
| 质控(QC) | 检测标注过程中的漏标(算法高分但技师未标) | 中,需要与技师标签交叉验证 |
| 自动报告 | 直接输出觉醒指数(arousal index) | 低,涉及监管与责任归属 |
关键提醒:官方目标觉醒只算非呼吸暂停类,且 99.96% 是 RERA。若临床需要的是 AASM 觉醒指数(每小时觉醒次数),用本数据集训练的模型会系统性低估,因为呼吸暂停相关觉醒被排除在外。落地前必须重新定义目标并补充标注。
14.4 与其他生理信号挑战赛的谱系
| 挑战 | 年份 | 任务形态 | 与本条目的方法论关联 |
|---|---|---|---|
| CinC 2002 | 2002 | 从心电预测睡眠呼吸暂停 | 同一临床问题,输入更少 |
| CinC 2017 | 2017 | 单导联房颤四分类 | 同为逐记录多分类,但非逐点 |
| CinC 2018 | 2018 | 逐采样点觉醒检测 | 本体 |
| CinC 2020 | 2020 | 12 导联心电 27 类诊断 | 多标签分类,非时序事件 |
| CinC 2021 | 2021 | 12+ 导联心电多任务 | 多任务框架类似 |
| PhysioNet 2023 | 2023 | 房颤检测(可穿戴) | 逐段检测,思路相近 |
从方法论看,CinC 2018 是 PhysioNet 挑战史上第一次把评分粒度下探到采样点级的赛事,此后的逐段检测类挑战(2023 房颤)在评测设计上明显继承了它的 gross PR 面积思路。
§15 FAQ:高频问答二十问
A. 基础认知
A1:CinC 2018 到底是"数据集"还是"比赛"?
两者都是。挑战赛在 2018 年 2 月至 9 月举行,但其数据在赛后以 v1.0.0 版本永久托管于 PhysioNet,成为独立的数据资源。引用时,"比赛"用 CinC 2018 Proceedings 论文,"数据"用 PhysioNet DOI。
A2:为什么叫 “You Snooze You Win”?
取自英文俗语 you snooze, you lose 的反转。既指睡眠本身的价值,也指算法在睡眠中识别觉醒的能力。
A3:这个数据集有没有更新版本?
PhysioNet 目前主版本为 v1.0.0(2018-02-21 发布)。页面上另有 “latest” DOI(10.13026/1q9b-ge17),指向同一版本,不是新版本号。
A4:数据里有没有患者诊断信息?
没有。官方只提供 age-sex.csv(记录名、性别、年龄),不含诊断、AHI、用药等临床字段。论文 Table 1 中的临床特征是从 MGH 内部数据统计的,未随数据发布。
A5:1,985 还是 1,983?
PhysioNet 页面说 1,985 名受试者,挑战论文说 1,983 条记录。RECORDS 文件实际列出 1,983 行。两个数字并存,引用时按用途选(详见 §11.2)。
B. 数据与获取
B1:需要注册才能下载吗?
不需要账号即可下载。PhysioNet 部分数据集需要完成 CITI 培训并签署 DUA,CinC 2018 不在其列,采用 ODC-By 1.0 开放许可。
B2:能不能只下一部分?
可以。RECORDS 列出全部路径,按需抓取单条即可。物理信号文件单条约 150 MB,只下 50 条约 7.5 GB。
B3:下载后怎么校验完整?
用 SHA256SUMS.txt 校验。截断的 .mat 会导致采样点数不足,读出来时 len(truth) != len(sig)。
B4:.arousal 文件用文本编辑器打开是乱码怎么办?
这是 WFDB 二进制标注格式,必须用 wfdb.rdann() 读取。乱码不是文件损坏。
B5:测试集能不能拿到标签?
不能。自 2018 年起永久隐藏,官方明确说明"将保持私密以支持后续工作"。
C. 标注与临床
C1:目标觉醒和 AASM 觉醒是一回事吗?
不是。目标觉醒只含非呼吸暂停类,且时间窗扩展(前 2 秒、后 2 或 10 秒),AASM 觉醒是事件本身的 ≥3 秒频率加快。两者不可互换。
C2:为什么目标觉醒 99.96% 是 RERA?
因为 MGH 这批患者以睡眠呼吸障碍为主,其觉醒绝大多数由呼吸努力引起。自发性觉醒仅 70 个、磨牙 30 个、PLM 36 个。
C3:每位患者的记录由几位技师判读?
1 位。共 7 位技师参与,但同一记录不做重复判读,因此无评分者间一致性数据。
C4:不评分区(−1)有多大规模?
官方未公布比例。按规则推算,清醒(占 29.3%)前后各 10 秒、呼吸暂停(约 5.8 万个)与低通气(约 5.7 万个)前后各 10 秒,合计可覆盖整夜 30% 以上时长。
C5:能不能用它做睡眠分期?
可以,需从 .arousal 解析 W/N1/N2/N3/REM 标注。但注意这些标注是 30 秒 epoch 级,不是逐采样点。
D. 建模与评测
D1:gross AUPRC 怎么算?
见 §7.2 的公式。核心是先把全库的 TP/FP 汇总,再沿 1001 个阈值算 PR 曲线。
D2:为什么我用 sklearn 算出来的分数和别人不一样?
average_precision_score 是阶梯积分,官方是 1/1000 分箱累积,两者可差 0.02 至 0.04。对标官方成绩必须用 score2018.py。
D3:0.54 的冠军成绩算高吗?
在 1:65 的不平衡下,0.54 的 AUPRC 相当于在召回 50% 时精确率约 55%,而随机基线只有 1.5%。相比其他生理信号任务(如房颤检测 AUROC 常达 0.95+),这个数字说明觉醒检测仍远未解决。
D4:能不能超过 0.54?
可以,0.55 的非官方成绩已经证明。但必须注意:用自建划分报告的分数不能与官方测试集直接比较。
D5:需要 GPU 吗?
逻辑回归与 XGBoost 方案在 CPU 上可行。CNN 方案建议 1 张 16 GB 以上显存的 GPU,单条记录 50 Hz 下显存压力不大,瓶颈在 I/O。
E. 工程与合规
E1:能商用吗?
ODC-By 1.0 允许商业使用,只需署名。但训练出的模型若用于临床诊断,仍受各国医疗器械法规(如中国 NMPA、美国 FDA)约束。
E2:引用应该写哪篇?
数据引用写 PhysioNet 页面 + DOI 10.13026/6phb-r450;方法背景引用挑战论文 Ghassemi et al., CinC 2018, DOI 10.22489/CinC.2018.049。
E3:库内已经有一条 cinc-2018-sleep,为什么还要这条?
两条指向同一份数据,但编目重点不同(见 §10.1)。新条目强化了标注协议、gross 指标实现与消歧说明。
E4:数据会不会下架?
PhysioNet 的挑战赛数据托管稳定,2018 年的数据至今仍可访问。但建议本地保留一份完整副本,尤其是标注文件。
E5:可以二次分发吗?
可以,ODC-By 1.0 允许再分发,但必须保留署名与许可证声明,且不得暗示数据提供方为你的衍生作品背书。
§16 总结
16.1 三句话总结
- 它是什么:PhysioNet/CinC 2018 挑战赛的官方数据,1,983 条 MGH 整夜 PSG、13 路 200 Hz 信号,唯一把"非呼吸暂停性觉醒"标到采样点级的公开睡眠数据集。
- 它证明了什么:自动觉醒检测可行但远未解决——19 支终榜队伍中冠军 0.54、均值 0.28,说明这不是一个已经被刷爆的任务。
- 它限制了什么:单中心成人门诊人群、目标定义特化(99.96% 为 RERA)、测试标签永久隐藏,任何"在其上 SOTA"的说法都需说明评测口径。
16.2 适合谁
- 想做时序事件检测、又厌倦了合成数据的研究者;
- 睡眠医学与睡眠技师背景、想把判读经验转成算法的人;
- 需要一份"信号完整 + 标签细致 + 许可宽松"的生理信号语料的团队;
- 做多任务学习、预训练、域自适应,需要多标签生理数据的实验室。
16.3 不适合谁
- 想直接训练临床 AASM 觉醒检测器的人;
- 做儿童睡眠、健康人群筛查的人;
- 期望"下载即用、不用处理格式"的产品团队;
- 需要第三方可复现评测的论文作者(测试集标签不可得)。
16.4 30 秒决策卡
| 问题 | 答案 |
|---|---|
| 我要的是逐点觉醒标签? | 是 → 用这个;否 → 看 Sleep-EDF / MASS |
| 我要大样本、社区人群? | 用 SHHS / MrOS / MESA |
| 我要儿科? | 用 NCH Sleep DataBank |
| 我要的是 AASM 觉醒? | 这个不够,需重新标注 |
| 我只有单导联设备? | 可裁剪,但需重新验证 |
| 许可能商用? | 可以,ODC-By 1.0,署名即可 |
| 测试集能复现? | 不能,只有训练集可自建划分 |
§17 事实清单与附录
17.1 硬事实清单(32 条)
| # | 事实 | 来源 |
|---|---|---|
| 1 | 数据集全称 You Snooze You Win: the PhysioNet/Computing in Cardiology Challenge 2018 | PhysioNet 页面 |
| 2 | 版本 v1.0.0,发布于 2018-02-21 | PhysioNet 版本页 |
| 3 | 数据 DOI:10.13026/6phb-r450 | PhysioNet |
| 4 | 挑战论文 DOI:10.22489/CinC.2018.049 | CinC Proceedings |
| 5 | 论文发表于 Computing in Cardiology 2018 第 45 卷,页码 1-4 | 论文页眉 |
| 6 | 受试者 1,985 名,记录 1,983 条 | 页面 / 论文双口径 |
| 7 | 训练 994 条(标签公开),测试 989 条(标签隐藏) | 论文 |
| 8 | 训练与测试无重叠受试者 | 论文 |
| 9 | AHI 分布在两集合上经 KS 检验 p=0.97 | 论文 |
| 10 | 13 路信号:EEG×6、EOG×1、EMG×1、ABD、CHEST、AIRFLOW、SaO2、ECG | 论文 + 头文件 |
| 11 | 采样率 200 Hz(SaO2 经样点保持上采样) | 论文 + 头文件 |
| 12 | 信号单位 µV(SaO2 为 %) | 头文件 |
| 13 | 单条记录约 5.15×10⁶ 采样点(例 tr03-0005) |
头文件 |
| 14 | 未压缩总量 266.6 GB | 页面 |
| 15 | 7 位技师,每条记录 1 人判读 | 论文 |
| 16 | 训练集目标觉醒事件 43,836 个,其中 RERA 43,822 个 | 论文 Table 2 求和 |
| 17 | 非目标觉醒:低通气 56,936、阻塞性 32,547、中枢性 22,763、混合性 2,641 | 论文 Table 2 |
| 18 | 目标觉醒定义:RERA −2s~+10s,其他 −2s~+2s | 论文 §3 |
| 19 | 不评分区:清醒/呼吸暂停/低通气 ±10s | 论文 §3 |
| 20 | 评分指标 gross AUPRC,概率按 1/1000 分箱 | 论文 §4 + score2018.py |
| 21 | 官方 22 支队参赛,19 队进终榜 | 论文 |
| 22 | 冠军 0.54(Howe-Patterson 等) | 论文 Table 3 |
| 23 | 亚军 0.45,季军 0.43 | 论文 Table 3 |
| 24 | 非官方最高 0.55(Li & Guan) | 论文 Table 3 |
| 25 | 均值 0.28,范围 0.07 至 0.55 | 论文 §6 |
| 26 | 624 次提交、34 个用户、82% 为 dry-run | 论文 §5 |
| 27 | 37 次有效提交、24 个用户 | 论文 §5 |
| 28 | 开源许可证:MIT X11 8 份、GPLv3 10 份、GPLv2 1 份 | 论文 §5 |
| 29 | 年龄均值 55(SD 14.4),男性 65%,BMI 33,AHI 19 | 论文 Table 1 |
| 30 | 睡眠结构:Wake 29.3%、N1 19.5%、N2 51.3%、N3 13.8%、REM 15.3% | 论文 Table 2 |
| 31 | 许可 ODC-By 1.0 | 页面 |
| 32 | 资助:论文致谢 R01-GM104987;平台 U24EB037545、R01EB030362 | 论文 / 页面 |
17.2 附录 A:条目信息速查卡
| 项目 | 内容 |
|---|---|
| slug | cinc-2018-sleep-arousal |
| 库内近邻 | cinc-2018-sleep(rid=493,同物异名) |
| 官方主页 | https://physionet.org/content/challenge-2018/1.0.0/ |
| 下载入口 | 同上(直链 / wget / S3) |
| 记录清单 | https://physionet.org/files/challenge-2018/1.0.0/RECORDS |
| 评分脚本 | https://physionet.org/files/challenge-2018/1.0.0/score2018.py |
| 元数据 | age-sex.csv(记录名、性别、年龄) |
| 数据格式 | WFDB;.mat(V4) + .hea + .arousal + -arousal.mat(HDF5) |
| 推荐读取库 | wfdb(信号与标注)、h5py(三态标签) |
| 建议硬件 | 500 GB+ SSD,16 GB+ 内存(流式),16 GB+ 显存(CNN) |
17.3 附录 B:与库内条目的互链建议
| 目标条目 | rid | 关系 | 建议互链位置 |
|---|---|---|---|
cinc-2018-sleep |
493 | 同物异名(同一 PhysioNet 数据集) | §10.1、本表 |
sleep-edf |
73 | 上游/对照:双导联 30 秒分期基准 | §10.2 |
mass |
272 | 对照:多子集完整 PSG,无点级觉醒 | §10.2 |
shhs |
282 | 对照:社区队列大规模 PSG | §10.2 |
mros-sleep |
292 | 对照:老年男性居家 PSG | §10.2 |
mesa-sleep |
302 | 对照:多民族居家 PSG | §10.2 |
isruc-sleep |
262 | 外部验证集候选 | §10.3 |
capsleep |
1072 | 微觉醒周期性结构研究 | §10.3 |
nch-sleep |
1013 | 儿科对照(不可混用) | §10.3 |
nsrr |
312 | 平台层:NSRR 托管 SHHS/MrOS/MESA | §10.2 |
physionet-cinc-2017 |
162 | 同平台、不同年份挑战 | §10.4 |
17.4 附录 C:.arousal 标注码与类别映射表
| 标注前缀 | 中文 | 计入目标觉醒 | 触发不评分区 |
|---|---|---|---|
arousal_rera |
RERA | ✅(−2s~+10s) | 否 |
arousal_spontaneous |
自发性觉醒 | ✅(−2s~+2s) | 否 |
arousal_bruxism |
磨牙 | ✅ | 否 |
arousal_plm |
周期性肢体运动 | ✅ | 否 |
arousal_snore |
打鼾 | ✅ | 否 |
arousal_noise |
噪声 | ✅ | 否 |
arousal_hypoventilation |
低通气相关 | ✅ | 否 |
arousal_partial_obstruction |
部分气道阻塞 | ✅ | 否 |
arousal_cheyne_stokes |
陈-施呼吸 | ✅ | 否 |
resp_hypopnea |
低通气 | ❌ | ✅(±10s) |
resp_obstructiveapnea |
阻塞性呼吸暂停 | ❌ | ✅ |
resp_centralapnea |
中枢性呼吸暂停 | ❌ | ✅ |
resp_mixedapnea |
混合性呼吸暂停 | ❌ | ✅ |
W |
清醒 | ❌ | ✅(清醒前后 ±10s) |
N1 / N2 / N3 / R |
睡眠分期 | ❌ | 否 |
17.5 附录 D:gross AUPRC 手算示例
假设测试库仅有 10 个采样点,其中 3 个为正样本(+1),1 个为不评分(−1),6 个为负样本(0)。预测概率与真值:
| 采样点 | 预测概率 | 真值 |
|---|---|---|
| 1 | 0.95 | +1 |
| 2 | 0.90 | +1 |
| 3 | 0.85 | 0 |
| 4 | 0.80 | −1 |
| 5 | 0.70 | +1 |
| 6 | 0.60 | 0 |
| 7 | 0.40 | 0 |
| 8 | 0.30 | 0 |
| 9 | 0.20 | 0 |
| 10 | 0.10 | 0 |
按阈值从高到低累积(−1 的点被剔除,不进入任何分母):
| 阈值 j/1000 | TP | FP | FN | Precision | Recall |
|---|---|---|---|---|---|
| 950 | 1 | 0 | 2 | 1.00 | 0.333 |
| 900 | 2 | 0 | 1 | 1.00 | 0.667 |
| 850 | 2 | 1 | 1 | 0.667 | 0.667 |
| 700 | 3 | 1 | 0 | 0.75 | 1.000 |
| 600 | 3 | 2 | 0 | 0.60 | 1.000 |
| 0 | 3 | 6 | 0 | 0.333 | 1.000 |
AUPRC = Σ p_j·(r_j − r_{j+1}) = 1.00×0.333 + 1.00×0.334 + 0.667×0 + 0.75×0.333 + 0.60×0 + 0.333×0 ≈ 0.583。
这个玩具例子说明两件事:一是 −1 点确实被整体剔除,二是PR 曲线是阶梯状的,与 ROC 曲线(梯形/插值)不同,实现细节会显著影响数值。
17.6 附录 E:数据获取决策树
你需要什么?
├─ 逐采样点觉醒标签 ────────────────► CinC 2018(本文)
├─ 30 秒睡眠分期
│ ├─ 小样本、双导联、快速上手 ────► Sleep-EDF(rid 73)
│ ├─ 多子集、信号完整 ────────────► MASS(rid 272)
│ └─ 大规模、社区队列
│ ├─ 中老年男女 ──────────────► SHHS(rid 282)
│ ├─ 老年男性 ────────────────► MrOS(rid 292)
│ └─ 多民族、心血管导向 ──────► MESA(rid 302)
├─ 儿科睡眠 ────────────────────────► NCH Sleep DataBank(rid 1013)
├─ 微觉醒周期性(CAP) ─────────────► CAP Sleep(rid 1072)
└─ 外部验证集 ──────────────────────► ISRUC-Sleep(rid 262)
17.7 附录 F:常用命令速查
# 记录总数与训练/测试分布
curl -s https://physionet.org/files/challenge-2018/1.0.0/RECORDS \
| awk -F/ '{print $1}' | sort | uniq -c
# 按批次统计
curl -s https://physionet.org/files/challenge-2018/1.0.0/RECORDS \
| awk -F/ '{print substr($2,1,4)}' | sort | uniq -c
# 校验下载完整性
sha256sum -c SHA256SUMS.txt 2>&1 | grep -v ': OK$'
# 统计单条记录的采样点数
head -1 training/tr03-0005/tr03-0005.hea
# 批量检查标签长度一致性(Python)
python3 - <<'PY'
import glob, wfdb, h5py, numpy as np
bad=[]
for h in glob.glob('training/*/*.hea'):
rec=h[:-4]
n=wfdb.rdheader(rec).sig_len
with h5py.File(rec+'-arousal.mat','r') as f:
m=len(np.ravel(f['data']['arousals']))
if n!=m: bad.append((rec,n,m))
print(len(bad),'条长度不一致')
PY
17.8 附录 G:本条目编制说明
- 口径选择:所有硬数字以挑战论文(CinC 2018 Vol.45)为主口径,PhysioNet 页面为辅口径;两者冲突处已在 §11.2 存照。
- 实测部分:
RECORDS行数、批次分布、头文件字段、测试集目录文件清单、.arousal标注码,均于 2026-10-17 直接抓取官方文件核实。 - 推导部分:§5.4 的标签构造伪代码、§5.5 的不平衡比例估算、§13.2 的降采样策略,属编制者推导,正文已明确标注"伪代码"/“估算”。
- 未核实部分:§3.3 的"记录挑选标准"、§5.4 的边界端点是否含、§11.3 第 10 条的元数据缺失范围,均无官方说明,列入遗留疑点。
- 禁止事项:本条目不含任何测试集标签、不含未经证实的 SOTA 宣称;所有性能数字均标注来源与评测口径。
17.9 引用格式
数据引用(APA 风格):
Ghassemi, M., Moody, B., Lehman, L. W., Mark, R., & Clifford, G. (2018). You Snooze You Win: The PhysioNet/Computing in Cardiology Challenge 2018 (version 1.0.0). PhysioNet. https://doi.org/10.13026/6phb-r450
论文引用(IEEE 风格):
M. M. Ghassemi, B. E. Moody, L. H. Lehman, C. Song, Q. Li, H. Sun, R. G. Mark, M. B. Westover, and G. D. Clifford, “You Snooze, You Win: the PhysioNet/Computing in Cardiology Challenge 2018,” in 2018 Computing in Cardiology Conference (CinC), vol. 45, 2018, pp. 1-4, doi: 10.22489/CinC.2018.049.
中文引用(GB/T 7714 风格):
GHASSEMI M M, MOODY B E, LEHMAN L W, 等. You Snooze You Win: the PhysioNet/Computing in Cardiology Challenge 2018[DS]. PhysioNet, 2018. DOI:10.13026/6phb-r450.
17.10 免责声明
本条目所有技术描述基于公开文献与官方数据文件的整理,代码示例仅在参考环境中验证过语法与接口,不保证在特定环境下的可运行性。数据使用请遵循 ODC-By 1.0 许可证与 PhysioNet 的数据使用规范。任何基于本数据集训练的模型在临床部署前,须完成独立的临床验证与监管审批。本条目不构成医疗建议。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- sleep-edf — 共享标签:生理信号 / 睡眠信号 / 脑电信号 / 时序数据
- mass — 共享标签:生理信号 / 睡眠信号 / 脑电信号 / 时序数据
- hmc-sleep-staging — 共享标签:生理信号 / 睡眠信号 / 脑电信号 / 评测基准
- apnea-ecg — 共享标签:生理信号 / 睡眠信号 / 挑战赛数据集 / 评测基准
- capsleep — 共享标签:生理信号 / 睡眠信号 / 脑电信号 / 评测基准
- boas-bitbrain — 共享标签:生理信号 / 睡眠信号 / 脑电信号 / 评测基准
- upenn-mayo-seizure — 共享标签:生理信号 / 脑电信号 / 挑战赛数据集 / 评测基准
- cinc-2018-sleep-legacy — 共享标签:生理信号 / 睡眠信号 / 时序数据
- psg-ipa — 共享标签:睡眠信号 / 脑电信号 / 评测基准
- bidsleep-dataset — 共享标签:生理信号 / 睡眠信号 / 评测基准 / 时序数据
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

