信息速览
INFOBOX
| 数据集名称 | CHB-MIT Scalp EEG Database |
| 英文全称 | Children’‘’‘’‘’‘’‘’‘’‘’'s Hospital Boston–MIT Scalp EEG Database |
| 别名 / 简称 | CHB-MIT、CHB-MIT EEG、PhysioNet CHB-MIT |
| 疾病分类 | 8A60.0 癫痫(局灶性癫痫) / 8A60.Z 癫痫(未特指) |
| SNOMED CT | 84696009 Epilepsy (disorder) / 24651003 Seizure onset (event) / 397812006 Electroencephalogram (procedure) |
| 数据模态 | 时序信号(头皮脑电图 EEG) |
| AI 任务类型 | 二分类(癫痫发作 vs 非发作)、发作检测(event-based)、发作预测(pre-ictal prediction)、跨患者泛化 |
| 样本总数 | 664 个 EDF 文件(23 名患者),198 次癫痫发作事件 |
| 数据大小 | ~42.6 GB(解压后) |
| 数据格式 | EDF(European Data Format)+ 文本标注文件 + 二进制 .seizure 标注文件 |
| 许可证 | Open Data Commons Attribution License v1.0(ODC-By 1.0) |
| 访问级别 | 开放(任何人可直接下载,无需注册或凭证认证) |
| DUO 标签 | NRES, GRU |
| 语言 | 不适用(生理信号数据) |
| 首发日期 | 2010-06-09 |
| 最后更新 | 2010-12-01(新增 chb24,16 次额外发作) |
| 发布机构 | Children’‘’‘’‘’‘’‘’‘’‘’'s Hospital Boston & Massachusetts Institute of Technology(波士顿儿童医院 & 麻省理工学院) |
| 官方主页 | https://physionet.org/content/chbmit/1.0.0/ |
| 下载地址 | https://physionet.org/content/chbmit/1.0.0/(直接下载 / wget / AWS S3) |
| DOI | 10.13026/C2K01R |
| 引用次数 | 3,000+(Google Scholar 估算,截至 2026-08) |
| AI 就绪度评分 | ⭐⭐⭐⭐(4/5)— 专家标注癫痫发作起止时间 + EDF 标准格式 + 免费开放访问;扣分项:无官方划分、仅 23 名患者、无发作类型分类、chb01/chb21 同一患者 |
| 页面状态 | published |
§0 E-E-A-T 信任声明与免责声明
医学审核者:[千方病案医学编辑部]交叉审核:§2 医学背景(ICD-11 映射、临床任务定义、金标准描述)、§7 偏倚分析。
数据工程审核者:[千方病案医学编辑部交叉审核] 医疗 AI 数据工程师,审核范围:§4 DAIMS 数据字典、§5 数据划分策略、§6 预处理 Pipeline 和坑点。
审核日期:2026-08-04
医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。
技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。
数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。部分数据集要求额外资质认证(如 PhysioNet CITI Training)。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。
§1 数据集概览(Overview)
§1.0 📌 30 秒速览(Executive Summary)
CHB-MIT Scalp EEG Database 是由波士顿儿童医院和麻省理工学院于 2010 年联合发布的儿科癫痫脑电图数据集,包含 23 名难治性癫痫患儿长达 979 小时的连续头皮 EEG 记录,涵盖 198 次专家标注的癫痫发作事件。
它的独特价值在于开创了长时程连续头皮 EEG + 精确发作标注的公开数据范式,成为 EEG 癫痫检测领域"事实上的 MNIST"——在 149 篇相关研究中有 107 篇(71.8%)将其作为主要数据集。几乎所有主流癫痫检测算法都在此数据集上验证,患者特异性场景下准确率已突破 99.7%。
你可以用它来:训练患者特异性癫痫发作检测模型、研究跨患者泛化这一核心挑战、或者探索发作预测(pre-ictal prediction)的前沿方向。
§1.1 摘要
CHB-MIT Scalp EEG Database 由 Ali Shoeb(MIT 博士生)和 John Guttag 教授(MIT)联合波士顿儿童医院临床团队创建,2010 年 6 月通过 PhysioNet 发布。数据来自 22 名儿科难治性癫痫患者(23 个病例,其中 chb01 与 chb21 为同一患者时隔 1.5 年的两次记录),在停用抗癫痫药物后进行长达数日的视频 EEG 监测,以刻画发作特征并评估手术适配性。
全部信号以 256 Hz 采样率、16-bit 分辨率采集,采用国际 10-20 电极系统双极导联,大多数文件包含 23 个 EEG 通道。数据以 EDF 格式存储,共 664 个文件,总时长约 979 小时。198 次癫痫发作的起止时间由神经科专家精确标注,以文本摘要文件和二进制 .seizure 标注文件两种形式提供。
该数据集的核心创新在于提供了真实的临床长时程监测场景——包含发作间期、发作前期和发作期的完整时间序列,以及伪影、噪声和生理变异性——使其成为验证算法在真实临床环境中鲁棒性的黄金标准。
§1.2 为什么重要
技术创新维度:CHB-MIT 是首个公开提供连续多日头皮 EEG + 精确发作标注的大规模数据集。在此之前的公开 EEG 数据集多为短片段或颅内记录,无法反映真实临床监测的连续性和复杂性。CHB-MIT 填补了这一空白,使研究者能够在真实噪声环境(肌电伪影、眼动伪影、基线漂移、工频干扰)中验证算法鲁棒性。256 Hz 采样率和 23 通道 10-20 系统配置成为后续 EEG 数据集的事实标准。
应用影响维度:该数据集催生了癫痫发作检测领域的两个核心研究方向——患者特异性检测(patient-specific detection)和跨患者泛化(cross-subject generalization)。患者特异性方法在 CHB-MIT 上已达到 99.7% 的准确率,但跨患者方法仍在 80-90% 之间挣扎,这一差距揭示了 EEG 信号的个体间异质性这一根本挑战。该数据集也是发作预测(pre-ictal prediction)研究的主要数据源,推动了对发作前期生物标志物的探索。
§1.3 与同类数据集对比
| 数据集 | 样本量 | 模态 | 标注方式 | 核心差异化 |
|---|---|---|---|---|
| CHB-MIT | 23 名患者 / 979h / 198 次发作 | 头皮 EEG | 专家标注发作起止 | 儿科长时程监测,事实标准基准 |
| TUH EEG Corpus (TUSZ) | 675 名患者 / 1,476h / 4,029 次发作 | 头皮 EEG | 13 种发作类型标签 | 规模最大、发作类型分类最细 |
| Siena EEG | 14 名患者 / 128h / 47 次发作 | 头皮 EEG | 专家标注 | 成人数据,29 通道高密度 |
| EPILEPSIAE | 275 名患者 / 1,300h | 头皮 + 颅内 EEG | 专家标注 | 欧洲多中心,含颅内数据 |
| Freiburg EEG | 21 名患者 / 882h | 颅内 EEG | 6 通道颅内 | 颅内高信噪比 |
§1.4 版本演进时间轴
| 时间 | 事件 |
|---|---|
| 2004-08 | Shoeb 等人在 Epilepsy and Behavior 发表患者特异性发作检测方法,使用 CHB-MIT 前身数据 |
| 2009-09 | Ali Shoeb 完成 MIT 博士论文,正式建立 CHB-MIT 数据集 |
| 2010-06-09 | CHB-MIT v1.0.0 通过 PhysioNet 正式发布,含 23 个病例 / 182 次发作 |
| 2010-12-01 | 新增 chb24 病例(16 次额外发作),总发作数达 198 次 |
| 2019-02-20 | PhysioNet 添加 SHA256SUMS 文件完整性校验 |
| 2023-12 | Jonathan Dan 发布 BIDS 兼容版本(Zenodo),标准化 18 通道双香蕉导联 |
§1.5 典型 AI 应用场景
- 患者特异性癫痫发作检测:为每位患者训练独立模型,利用该患者的历史 EEG 数据检测发作——这是当前准确率最高的范式(>99%)
- 跨患者发作检测泛化:训练通用模型使其能在未见过的患者上工作——这是临床部署的核心挑战,当前最佳准确率约 90-99%
- 癫痫发作预测:从发作间期 EEG 中识别发作前期(pre-ictal)生物标志物,提前预警——提前时间可达 30-77 分钟
- 实时低延迟检测:在可穿戴设备或 ICU 监护场景中实现亚秒级发作检测——延迟可低至 2.3 秒
- EEG 信号自监督预训练:利用 979 小时无标注 EEG 进行自监督学习,为下游任务提取通用特征表示
§2 医学背景(Medical Context)
§2.1 ICD-11 编码
| 数据集标签 | ICD-11 编码 | ICD-11 术语 |
|---|---|---|
| 癫痫(Epilepsy) | 8A60 | Episodic neurological disorders — Epilepsies |
| 局灶性癫痫 | 8A60.0 | Focal epilepsy |
| 难治性癫痫 | 8A60.0 + XG5A | Focal epilepsy + Treatment-resistant (modifier) |
| 癫痫发作 | 8A60.Z | Epileptic seizure (unspecified) |
§2.1b SNOMED CT 映射
| 数据集标签 | ICD-11 | SNOMED CT | SNOMED CT 术语 |
|---|---|---|---|
| Epilepsy | 8A60 | 84696009 | Epilepsy (disorder) |
| Seizure onset | 8A60.Z | 24651003 | Seizure onset (event) |
| Intractable epilepsy | 8A60.0 | 230456007 | Intractable epilepsy (disorder) |
| EEG monitoring | — | 397812006 | Electroencephalogram (procedure) |
| Anti-seizure medication withdrawal | — | 182866001 | Withdrawal of drug (procedure) |
§2.2 疾病简介
癫痫是一种以反复发作为特征的慢性神经系统疾病,全球约 5,000 万人受累。癫痫发作是大脑电活动的暂时性偏差,可能导致短暂的注意力丧失或全身性痉挛。约 30% 的癫痫患者对药物治疗无反应(难治性癫痫),需要通过手术干预来控制发作。
对于难治性癫痫患者,术前评估的核心手段是长时程视频 EEG 监测(video-EEG monitoring)——在停用抗癫痫药物后连续记录数日 EEG,以捕捉并刻画患者的发作模式,评估手术适配性。CHB-MIT 数据集正是来源于这一临床流程。
§2.3 临床任务定义
| 任务类型 | 定义 | 临床意义 |
|---|---|---|
| 癫痫发作检测 | 在连续 EEG 中实时识别发作的起止时刻 | 术后监测、ICC 监护、可穿戴预警设备 |
| 癫痫发作预测 | 在发作前数分钟至数小时识别发作前期 | 闭环干预(药物/电刺激)、患者安全预警 |
| 跨患者检测 | 在未见过的患者 EEG 上检测发作 | 免校准临床部署,降低使用门槛 |
§2.4 患者人群特征
| 维度 | 特征 |
|---|---|
| 数据来源 | 波士顿儿童医院(Children’‘’‘’‘’‘’‘’‘’‘’'s Hospital Boston),单一中心 |
| 采集时间 | 2009-2010 年(具体起止时间未公开) |
| 年龄分布 | 1.5-22 岁(中位数约 11 岁);chb24 年龄/性别未标注 |
| 性别比例 | 男 5 名(3-22 岁)/ 女 17 名(1.5-19 岁)/ 未知 1 名(chb24) |
| 种族分布 | 未释放种族数据 |
| 就医类型 | 住院(长时程视频 EEG 监测,术前评估) |
| 用药状态 | 停用抗癫痫药物后监测(withdrawal of anti-seizure medication) |
| 癫痫类型 | 难治性癫痫(intractable seizures),评估手术适配性 |
§2.5 临床意义
癫痫发作的不可预测性是患者面临的最大风险——突发发作可能导致跌倒、受伤甚至死亡(SUDEP)。一个能快速检测发作并触发干预(药物释放、电刺激或照护者警报)的设备,可以显著改善患者安全和生活质量。CHB-MIT 数据集为开发此类设备提供了真实临床场景下的训练和评估数据。
§2.6 金标准
| 数据划分 | 标注方式 | 标注者 | 金标准性质 |
|---|---|---|---|
| 全部 198 次发作 | 逐次标注发作起止时间(秒级精度) | 波士顿儿童医院神经科专家 | 临床金标准(expert annotation) |
| 非发作段 | 默认为发作间期(inter-ictal) | — | 隐式标注(absence of annotation) |
| 发作类型 | 未标注(仅二分类:发作 vs 非发作) | — | 无(已知局限性) |
标注说明:发作起止时间以两种形式提供——(1)
chbnn-summary.txt文本文件,记录每个 EDF 文件中发作的起止秒数;(2).seizure二进制标注文件,以[标记发作开始、]标记发作结束。标注者人数和标注者间一致性(inter-rater reliability)未在公开文档中记录。
§3 数据集规格(Specifications)
§3.0 版本抉择矩阵
| 你的需求 | 推荐版本 | 大小 | 理由 |
|---|---|---|---|
| 标准发作检测研究 | PhysioNet v1.0.0 | ~42.6 GB | 官方原始版本,23 通道完整数据 |
| BIDS 标准化处理 | BIDS CHB-MIT(Zenodo) | ~42.6 GB | 18 通道双香蕉导联标准化,BIDS 兼容 |
| 快速验证算法原型 | 子集(3-5 名患者) | ~8-15 GB | 选取发作次数多的患者(chb01/chb08/chb15/chb17/chb24) |
§3.1 模态详细说明
头皮脑电图(Scalp EEG):通过放置于头皮表面的电极记录大脑皮层电活动。CHB-MIT 采用国际 10-20 系统电极放置标准,使用双极导联(bipolar montage)——每个通道记录两个相邻电极之间的电位差。这种导联方式有效抑制共模噪声,是临床 EEG 的标准配置。
与颅内 EEG(iEEG)相比,头皮 EEG 的优势在于无创性和临床可及性,但信噪比较低——深部脑电活动(如颞叶内侧癫痫起源)在头皮 EEG 中可能被衰减至不可见水平。高频振荡(HFOs, 80-250 Hz)等重要的发作前生物标志物在头皮 EEG 中几乎被噪声淹没。
§3.2 样本统计
| 统计项 | 数值 |
|---|---|
| 病例数(cases) | 23(来自 22 名患者,chb01 和 chb21 为同一患者) |
| EDF 文件总数 | 664 |
| 含发作的文件数 | 129(19.4%) |
| 发作事件总数 | 198(chb01-chb23: 182 次 + chb24: 16 次) |
| 总记录时长 | ~979 小时(~40.8 天) |
| 每名患者文件数 | 9-42 个 |
| 每名患者发作次数 | 3-21 次(中位数约 7 次) |
| 平均发作时长 | ~293 秒(范围:~6 秒至 ~2,012 秒) |
| 发作段总时长 | ~14.7 小时(占总记录的 ~1.5%) |
§3.3 数据格式
| 文件类型 | 格式 | 说明 |
|---|---|---|
| EEG 记录 | .edf |
European Data Format,每个文件含 1-4 小时多通道 EEG |
| 发作标注(文本) | chbnn-summary.txt |
每个病例的摘要文件,含导联信息 + 发作起止秒数 |
| 发作标注(二进制) | .seizure |
二进制标注文件,[ 标记发作开始,] 标记结束 |
| 文件列表 | RECORDS |
全部 664 个 EDF 文件路径列表 |
| 含发作文件列表 | RECORDS-WITH-SEIZURES |
129 个含发作的文件路径列表 |
| 患者信息 | SUBJECT-INFO |
性别和年龄信息(chb24 未包含) |
| 标注者信息 | ANNOTATORS |
标注者列表文件 |
| 完整性校验 | SHA256SUMS.txt |
所有文件的 SHA-256 哈希值 |
§3.4 存储大小
| 版本 | 压缩 | 解压后 |
|---|---|---|
| PhysioNet v1.0.0(ZIP) | ~42.6 GB | ~42.6 GB(EDF 已为二进制,压缩率低) |
§3.5 标注方式
人工专家标注流程:
- 原始数据采集:患者在波士顿儿童医院接受长时程视频 EEG 监测,同时视频录像辅助发作识别
- 专家审阅:神经科专家逐段审阅连续 EEG,结合视频临床表现识别癫痫发作
- 起止时间标注:精确标注每次发作的电临床表现起始(electrographic onset)和结束(offset)时刻,精度至秒
- 双重格式输出:标注同时以文本摘要和二进制文件两种格式存储
§3.6 标注者资质
| 维度 | 信息 |
|---|---|
| 标注者人数 | 未在公开文档中明确记录 |
| 标注者资质 | 波士顿儿童医院神经科专家(epileptologists) |
| 标注者间一致性 | 未公开报告 |
| 标注质量验证 | 结合视频临床表现交叉验证 |
§3.7 采集时间范围
数据采集于 2009-2010 年间,具体起止日期未公开(已替换为替代日期以保护隐私)。
§3.8 地域覆盖
单一中心:美国马萨诸塞州波士顿儿童医院(Children’‘’‘’‘’‘’‘’‘’‘’'s Hospital Boston)。
§3.9 采集设备规格
| 参数 | 规格 |
|---|---|
| 电极系统 | 国际 10-20 系统(International 10-20 System) |
| 导联方式 | 双极导联(Bipolar montage) |
| 通道数 | 23 通道(大多数文件);少数文件 24-26 通道 |
| 采样率 | 256 Hz |
| 分辨率 | 16-bit |
| 辅助信号 | ECG(chb04 最后 36 个文件)/ VNS 迷走神经刺激(chb09 最后 18 个文件) |
| 假信号 | 部分文件含最多 5 个命名为 “-” 的空白通道(用于显示格式对齐),可忽略 |
§3.10 深度溯源链
患者(波士顿儿童医院住院)
→ 停用抗癫痫药物
→ 长时程视频 EEG 监测(数日)
→ 10-20 系统电极放置,双极导联
→ 256 Hz / 16-bit 采集
→ EDF 格式原始文件
→ PHI 脱敏(HIPAA Safe Harbor)
→ 替代日期 + 病例编号
→ PhysioNet 发布(v1.0.0)
→ 神经科专家标注发作起止
→ 文本摘要 + 二进制 .seizure 文件
§4 数据结构详解(Data Schema)
§4.0 目录结构预览
chbmit/
├── chb01/
│ ├── chb01_03.edf # 第 3 个 EDF 文件(1 小时 EEG)
│ ├── chb01_03.edf.seizures # 二进制发作标注
│ ├── chb01_04.edf
│ ├── chb01_04.edf.seizures
│ ├── ...
│ └── chb01-summary.txt # 病例摘要:导联信息 + 发作起止
├── chb02/
│ ├── chb02_01.edf
│ ├── ...
│ └── chb02-summary.txt
├── ...
├── chb24/
│ ├── chb24_01.edf
│ ├── ...
│ └── chb24-summary.txt
├── ANNOTATORS # 标注者信息
├── RECORDS # 全部 664 个 EDF 文件列表
├── RECORDS-WITH-SEIZURES # 129 个含发作文件列表
├── SUBJECT-INFO # 患者性别和年龄
├── SHA256SUMS.txt # 文件完整性校验
└── shoeb-icml-2010.pdf # ICML 2010 论文
§4.1 DAIMS 标准化字段描述表
| 字段名 | 数据类型 | 说明 | 示例值 | AI 用途 | 观测误差 | 信息性缺失编码 | 取值范围 |
|---|---|---|---|---|---|---|---|
case_id |
string | 病例编号 | “chb01” | 患者标识 | — | — | chb01-chb24 |
file_name |
string | EDF 文件名 | “chb01_03.edf” | 文件定位 | — | — | chb{NN}_{NN}.edf |
channel_name |
string | 通道名称 | “FP1-F7” | 通道选择 | — | — | 23 个标准双极通道 |
sampling_rate |
integer | 采样率 (Hz) | 256 | 重采样参考 | — | — | 256(固定) |
resolution |
integer | 分辨率 (bit) | 16 | 量化精度 | — | — | 16(固定) |
duration |
float | 文件时长 (秒) | 3600.0 | 窗口切分 | — | — | 3600-14400 |
seizure_onset |
float | 发作起始 (秒) | 2996.0 | 标签生成 | ±1 秒 | — | 0-duration |
seizure_offset |
float | 发作结束 (秒) | 3036.0 | 标签生成 | ±1 秒 | — | 0-duration |
has_seizure |
boolean | 是否含发作 | true | 文件筛选 | — | — | true/false |
gender |
string | 性别 | “F” | 公平性分析 | — | chb24=“N/A” | M/F/N/A |
age |
float | 年龄 (岁) | 11.0 | 协变量 | — | chb24=N/A | 1.5-22 |
§4.2 标签分布统计
发作次数分布(按患者):
| 患者 | 性别 | 年龄 | 发作次数 | 发作总时长 (s) | 记录时长 (h) |
|---|---|---|---|---|---|
| chb01 | F | 11 | 7 | 449 | 40.6 |
| chb02 | M | 11 | 3 | 175 | 25.3 |
| chb03 | F | 14 | 7 | 409 | 28.0 |
| chb04 | M | 22 | 4 | 382 | 155.9 |
| chb05 | F | 7 | 5 | 563 | 39.0 |
| chb06 | F | 1.5 | 9 | 147 | 66.7 |
| chb07 | F | 14.5 | 3 | 328 | 68.1 |
| chb08 | M | 3.5 | 5 | 924 | 20.0 |
| chb09 | F | 10 | 4 | 280 | 67.8 |
| chb10 | M | 3 | 7 | 454 | 50.0 |
| chb11 | F | 12 | 3 | 809 | 34.8 |
| chb12 | F | 2 | 21 | 1,515 | 23.7 |
| chb13 | F | 3 | 12 | 547 | 33.0 |
| chb14 | F | 9 | 8 | 117 | 26.0 |
| chb15 | M | 16 | 20 | 2,012 | 40.0 |
| chb16 | F | 7 | 10 | 94 | 19.0 |
| chb17 | F | 12 | 3 | 296 | 21.0 |
| chb18 | F | 18 | 6 | 323 | 36.0 |
| chb19 | F | 19 | 3 | 239 | 30.0 |
| chb20 | F | 6 | 8 | 302 | 29.0 |
| chb21 | F | 13 | 4 | 203 | 33.0 |
| chb22 | F | 9 | 3 | 207 | 31.0 |
| chb23 | F | 6 | 7 | 431 | 28.0 |
| chb24 | — | — | 16 | 527 | 22.0 |
| 合计 | 198 | ~10,674 | ~979 |
类别不平衡统计:
| 类别 | 时长占比 | 样本数(1s 窗口) | 比例 |
|---|---|---|---|
| 发作期(Ictal) | ~1.5% | ~10,674 | 1 : 65 |
| 发作间期(Inter-ictal) | ~98.5% | ~3,524,400 | 65 : 1 |
§4.3 数据层级关系
数据集(23 个病例)
└── 病例(chb01-chb24)
└── EDF 文件(9-42 个/病例)
└── 通道(23 个双极导联)
└── 时间序列(256 Hz × duration)
§4.4 23 通道标准双极导联配置
CHB-MIT 大多数文件包含 23 个 EEG 通道,采用双极导联(bipolar montage)。标准 18 通道双香蕉导联(double banana)如下:
| 区域 | 通道 | 电极对 |
|---|---|---|
| 左颞叶链 | 1-4 | FP1-F7, F7-T7, T7-P7, P7-O1 |
| 左冠状链 | 5-8 | FP1-F3, F3-C3, C3-P3, P3-O1 |
| 右冠状链 | 9-12 | FP2-F4, F4-C4, C4-P4, P4-O2 |
| 右颞叶链 | 13-16 | FP2-F8, F8-T8, T8-P8, P8-O2 |
| 中线 | 17-18 | FZ-CZ, CZ-PZ |
通道不一致提示:少数文件含 24-26 通道,额外通道包括 P7-T7, T7-FT9, FT9-FT10, FT10-T8, T8-P8 等。标准做法是选取上述 18 通道子集以保持一致性。
§4.5 缺失值情况
| 缺失类型 | 描述 | 处理建议 |
|---|---|---|
| EDF 文件间时间间隙 | 硬件限制导致连续编号文件间存在信号未记录间隙(通常 <10 秒,偶尔更长) | 窗口切分时跳过间隙,不跨文件拼接 |
| 通道不一致 | 少数文件含 24-26 通道而非标准 23 通道 | 统一选取 18 通道子集 |
| chb24 人口统计缺失 | chb24 的性别和年龄未记录(2010 年 12 月新增) | 人口统计分析时排除 chb24 |
| 发作类型未标注 | 所有发作均为二分类标签,无发作类型区分 | 无法进行多分类任务,仅支持二分类 |
| 标注者信息缺失 | 标注者人数和一致性未公开 | 标注质量评估时标注为"未知" |
§5 数据划分与使用建议(Splits & Usage)
§5.1 官方划分
CHB-MIT 没有官方 train/validation/test 划分。 这是该数据集与 TUH EEG Corpus(含官方 Train/Dev/Eval 划分)的关键区别。研究者需自行设计划分策略,这也是导致不同论文结果难以直接比较的主要原因。
§5.2 常见划分策略
| 策略 | 描述 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 患者特异性划分 | 每位患者的数据按发作级别划分 train/test(如 leave-one-seizure-out) | 患者特异性模型 | 准确率高(>99%) | 需要患者历史数据,无法直接部署 |
| 留一患者交叉验证(LOPO) | 每次留 1 名患者作测试,其余 22 名训练 | 跨患者泛化评估 | 严格无泄漏 | 跨患者准确率低(~80-90%) |
| 随机患者分层划分 | 按 70/30 或 80/20 划分患者(非重叠) | 跨患者模型快速验证 | 计算效率高 | 结果随划分种子变化大 |
| k-折患者交叉验证 | 将 23 名患者分为 k 折 | 稳健的跨患者评估 | 结果更稳定 | 计算成本高 |
§5.3 患者特异性划分推荐方案
对于患者特异性模型(最常见场景),推荐 Leave-One-Seizure-Out(LOSO) 交叉验证:
- 对每名患者的 N 次发作,每次留 1 次作测试,其余 N-1 次作训练
- 从非发作段中按比例抽取 inter-ictal 样本
- 确保训练集和测试集的时间段不重叠(至少 4 小时间隔)
§5.4 跨患者划分推荐方案
对于跨患者模型,推荐 Leave-One-Patient-Out(LOPO) 交叉验证:
- 每次留 1 名患者全部数据作测试,其余 22 名患者作训练
- 重复 23 次,取平均性能
- 注意:chb01 和 chb21 为同一患者,不可分别放入 train 和 test
§5.5 窗口化策略
| 参数 | 推荐值 | 理由 |
|---|---|---|
| 窗口长度 | 1-10 秒 | 1s 适合实时检测;10s 可捕获更完整的发作模式 |
| 步长 | 1-5 �寸(重叠 50-90%) | 重叠提高时间分辨率,但增加样本冗余 |
| 预发作窗口 | 10-30 分钟(预测任务) | 文献中最常用的 pre-ictal 定义 |
| 发作间期缓冲 | ≥4 小时(远离发作) | 避免将发作前期误标为发作间期 |
§5.6 使用建议
- 首次使用:选取 3-5 名发作次数多的患者(chb01/chb08/chb15/chb17/chb24)进行原型验证
- 论文复现:严格遵循原论文的划分策略和预处理流程,注意是否为患者特异性
- 跨患者研究:务必报告 LOPO 结果,这是最严格的跨患者评估
- 临床部署:患者特异性模型 + 少量目标患者数据微调是当前最佳实践
§6 AI 就绪指南(AI-Ready Guide)⭐ 核心差异化模块
§6.0 云端快速启动
🚀 5 分钟极速体验:使用 Google Colab 免费 GPU 即可在 CHB-MIT 子集上运行患者特异性癫痫检测原型。选取 chb01(7 次发作,40.6 小时)作为示例,使用 MNE-Python 加载 EDF 文件,10 秒窗口分类发作 vs 非发作,预期在 5 分钟内完成数据加载和基线模型训练。
§6.1 快速上手
# ========================================
# CHB-MIT Scalp EEG 快速上手 — PyTorch 版
# 环境要求: torch>=2.0, mne>=1.5, pandas, numpy
#
# ⚠️ 目录结构预期:
# 请将下载的数据解压至 ./data/ 目录,确保以下结构:
# ./data/
# ├── chb01/
# │ ├── chb01_03.edf
# │ ├── chb01_03.edf.seizures
# │ ├── chb01_04.edf
# │ └── chb01-summary.txt
# ├── chb02/
# └── ...
#
# chb01-summary.txt 包含发作起止时间信息
# 格式示例:
# File Name: chb01_03.edf
# Seizure Start Time: 2996 seconds
# Seizure End Time: 3036 seconds
# ========================================
import mne
import numpy as np
import pandas as pd
import torch
from torch.utils.data import Dataset, DataLoader
# - 1. 加载 EDF 文件 -
def load_edf(file_path, channels=None):
"""加载单个 EDF 文件,返回 (n_channels, n_samples) 数组"""
raw = mne.io.read_raw_edf(file_path, preload=True, verbose=''''''''''''''''WARNING'''''''''''''''')
if channels:
raw.pick(channels)
data = raw.get_data() # (n_channels, n_samples)
sfreq = raw.info[''''''''''''''''sfreq'''''''''''''''']
return data, sfreq
# - 2. 解析发作标注 -
def parse_summary(summary_path):
"""解析 chbnn-summary.txt,返回发作事件列表"""
events = []
with open(summary_path, ''''''''''''''''r'''''''''''''''') as f:
current_file = None
for line in f:
line = line.strip()
if line.startswith(''''''''''''''''File Name:''''''''''''''''):
current_file = line.split('''''''''''''''':'''''''''''''''')[-1].strip()
elif line.startswith(''''''''''''''''Seizure Start Time:''''''''''''''''):
onevent-blocked= int(line.split('''''''''''''''':'''''''''''''''')[-1].strip().split()[0])
elif line.startswith(''''''''''''''''Seizure End Time:''''''''''''''''):
offset = int(line.split('''''''''''''''':'''''''''''''''')[-1].strip().split()[0])
events.append({
''''''''''''''''file'''''''''''''''': current_file,
''''''''''''''''onset'''''''''''''''': onset,
''''''''''''''''offset'''''''''''''''': offset
})
return events
# - 3. 窗口化 -
def create_windows(data, sfreq, events, window_sec=10, step_sec=5):
"""将连续 EEG 切分为窗口,生成二分类标签"""
window_samples = int(window_sec * sfreq)
step_samples = int(step_sec * sfreq)
windows, labels = [], []
for start in range(0, data.shape[1] - window_samples, step_samples):
end = start + window_samples
window = data[:, start:end]
label = 0 # 默认非发作
for ev in events:
ev_start = ev[''''''''''''''''onset''''''''''''''''] * sfreq
ev_end = ev[''''''''''''''''offset''''''''''''''''] * sfreq
# 窗口与发作段有重叠 -> 标记为发作
if start < ev_end and end > ev_start:
label = 1
break
windows.append(window)
labels.append(label)
return np.array(windows), np.array(labels)
# - 4. PyTorch Dataset -
class CHBMITDataset(Dataset):
def __init__(self, windows, labels):
self.windows = torch.FloatTensor(windows)
self.labels = torch.LongTensor(labels)
def __len__(self):
return len(self.labels)
def __getitem__(self, idx):
return self.windows[idx], self.labels[idx]
# - 5. 使用示例 -
data, sfreq = load_edf(''''''''''''''''./data/chb01/chb01_03.edf'''''''''''''''',
channels=[''''''''''''''''FP1-F7'''''''''''''''',''''''''''''''''F7-T7'''''''''''''''',''''''''''''''''T7-P7'''''''''''''''',''''''''''''''''P7-O1'''''''''''''''',
''''''''''''''''FP1-F3'''''''''''''''',''''''''''''''''F3-C3'''''''''''''''',''''''''''''''''C3-P3'''''''''''''''',''''''''''''''''P3-O1'''''''''''''''',
''''''''''''''''FP2-F4'''''''''''''''',''''''''''''''''F4-C4'''''''''''''''',''''''''''''''''C4-P4'''''''''''''''',''''''''''''''''P4-O2'''''''''''''''',
''''''''''''''''FP2-F8'''''''''''''''',''''''''''''''''F8-T8'''''''''''''''',''''''''''''''''T8-P8'''''''''''''''',''''''''''''''''P8-O2'''''''''''''''',
''''''''''''''''FZ-CZ'''''''''''''''',''''''''''''''''CZ-PZ''''''''''''''''])
events = parse_summary(''''''''''''''''./data/chb01/chb01-summary.txt'''''''''''''''')
windows, labels = create_windows(data, sfreq, events, window_sec=10, step_sec=5)
print(f"窗口数: {len(windows)}, 发作窗口: {labels.sum()}, 比例: {labels.mean():.4f}")
dataset = CHBMITDataset(windows, labels)
dataloader = DataLoader(dataset, batch_size=64, shuffle=True)
§6.2 数据获取方式
| 方式 | 命令 / 链接 | 大小 | 说明 |
|---|---|---|---|
| 直接下载 ZIP | https://physionet.org/content/chbmit/1.0.0/ | ~42.6 GB | 浏览器直接下载 |
| wget 递归下载 | wget -r -N -c -np https://physionet.org/files/chbmit/1.0.0/ |
~42.6 GB | 支持断点续传 |
| AWS S3 同步 | aws s3 sync no-sign-request s3://physionet-open/chbmit/1.0.0/ ./chbmit/ |
~42.6 GB | 最快下载方式 |
| BIDS 版本 (Zenodo) | https://zenodo.org/records/10259996 | ~42.6 GB | BIDS 兼容,18 通道标准化 |
许可证:Open Data Commons Attribution License v1.0(ODC-By 1.0)——任何人可自由访问、使用和分发,仅需署名。无需注册、无需 CITI 培训、无需 DUA 协议。
§6.3 预处理 Pipeline
import mne
import numpy as np
from scipy.signal import butter, filtfilt
# - CHB-MIT 标准预处理流程 -
STANDARD_18_CHANNELS = [
''''''''''''''''FP1-F7'''''''''''''''', ''''''''''''''''F7-T7'''''''''''''''', ''''''''''''''''T7-P7'''''''''''''''', ''''''''''''''''P7-O1'''''''''''''''',
''''''''''''''''FP1-F3'''''''''''''''', ''''''''''''''''F3-C3'''''''''''''''', ''''''''''''''''C3-P3'''''''''''''''', ''''''''''''''''P3-O1'''''''''''''''',
''''''''''''''''FP2-F4'''''''''''''''', ''''''''''''''''F4-C4'''''''''''''''', ''''''''''''''''C4-P4'''''''''''''''', ''''''''''''''''P4-O2'''''''''''''''',
''''''''''''''''FP2-F8'''''''''''''''', ''''''''''''''''F8-T8'''''''''''''''', ''''''''''''''''T8-P8'''''''''''''''', ''''''''''''''''P8-O2'''''''''''''''',
''''''''''''''''FZ-CZ'''''''''''''''', ''''''''''''''''CZ-PZ''''''''''''''''
]
def preprocess_chbmit(file_path, target_channels=STANDARD_18_CHANNELS):
"""CHB-MIT EDF 预处理全流程"""
# 1. 加载
raw = mne.io.read_raw_edf(file_path, preload=True, verbose=''''''''''''''''WARNING'''''''''''''''')
# 2. 通道标准化(选取 18 通道子集)
available = [ch for ch in target_channels if ch in raw.ch_names]
raw.pick(available)
# 3. 带通滤波 (0.5 - 70 Hz)
raw.filter(l_freq=0.5, h_freq=70.0, method=''''''''''''''''fir'''''''''''''''',
fir_design=''''''''''''''''firwin'''''''''''''''', verbose=''''''''''''''''WARNING'''''''''''''''')
# 4. 陷波滤波 (60 Hz 工频)
raw.notch_filter(freqs=60.0, verbose=''''''''''''''''WARNING'''''''''''''''')
# 5. 逐通道 z-score 标准化
data = raw.get_data()
mean = data.mean(axis=1, keepdims=True)
std = data.std(axis=1, keepdims=True)
data = (data - mean) / (std + 1e-8)
return data, raw.info[''''''''''''''''sfreq'''''''''''''''']
def balance_classes(windows, labels, method=''''''''''''''''undersample''''''''''''''''):
"""处理极端类别不平衡(发作段 ~1.5%)"""
seizure_idx = np.where(labels == 1)[0]
nonevent-blocked= np.where(labels == 0)[0]
if method == ''''''''''''''''undersample'''''''''''''''':
# 欠采样:从非发作段随机抽取与发作段等量样本
n_seizure = len(seizure_idx)
sampled_non = np.random.choice(non_seizure_idx, n_seizure, replace=False)
idx = np.concatenate([seizure_idx, sampled_non])
elif method == ''''''''''''''''oversample'''''''''''''''':
# 过采样:重复发作段样本
n_target = min(len(non_seizure_idx), len(seizure_idx) * 10)
sampled_seizure = np.random.choice(seizure_idx, n_target, replace=True)
idx = np.concatenate([non_seizure_idx, sampled_seizure])
else:
idx = np.arange(len(labels))
np.random.shuffle(idx)
return windows[idx], labels[idx]
§6.4 框架 DataLoader
<details>
<summary>📊 PyTorch 完整 DataLoader(含 LOSO 交叉验证)</summary>
import torch
from torch.utils.data import Dataset, DataLoader, WeightedRandomSampler
import numpy as np
class CHBMITWindowDataset(Dataset):
"""CHB-MIT 窗口级 Dataset,支持加权采样"""
def __init__(self, windows, labels, augment=False):
self.windows = torch.FloatTensor(windows)
self.labels = torch.LongTensor(labels)
self.augment = augment
def __len__(self):
return len(self.labels)
def __getitem__(self, idx):
x = self.windows[idx]
y = self.labels[idx]
if self.augunt and y == 1:
# 发作段数据增强:时间偏移 + 高斯噪声
shift = np.random.randint(-50, 50)
x = torch.roll(x, shift, dims=-1)
noise = torch.randn_like(x) * 0.01
x = x + noise
return x, y
def get_weighted_sampler(labels):
"""加权随机采样器——处理类别不平衡"""
class_counts = np.bincount(labels)
class_weights = 1.0 / class_counts
sample_weights = class_weights[labels]
return WeightedRandomSampler(sample_weights, len(labels))
# LOSO 交叉验证
def loso_split(all_patient_data, test_patient_id):
"""Leave-One-Subject-Out 划分"""
train_windows, train_labels = [], []
test_windows, test_labels = [], []
for pid, (windows, labels) in all_patient_data.items():
if pid == test_patient_id:
test_windows.extend(windows)
test_labels.extend(labels)
else:
train_windows.extend(windows)
train_labels.extend(labels)
return (np.array(train_windows), np.array(train_labels),
np.array(test_windows), np.array(test_labels))
# 使用示例
train_dataset = CHBMITWindowDataset(train_windows, train_labels, augment=True)
train_sampler = get_weighted_sampler(train_labels)
train_loader = DataLoader(train_dataset, batch_size=256, sampler=train_sampler)
test_dataset = CHBMITWindowDataset(test_windows, test_labels, augment=False)
test_loader = DataLoader(test_dataset, batch_size=256, shuffle=False)
</details>
<details>
<summary>📊 TensorFlow / Keras DataLoader</summary>
import tensorflow as tf
import numpy as np
def create_tf_dataset(windows, labels, batch_size=256, shuffle=True):
"""创建 TensorFlow Dataset"""
dataset = tf.data.Dataset.from_tensor_slices(
(windows.astype(np.float32), labels.astype(np.int32))
)
if shuffle:
dataset = dataset.shuffle(buffer_size=len(labels))
dataset = dataset.batch(batch_size).prefetch(tf.data.AUTOTUNE)
return dataset
# 类别权重(替代加权采样)
def get_class_weights(labels):
"""计算类别权重用于不平衡损失"""
class_counts = np.bincount(labels)
total = len(labels)
class_weights = total / (len(class_counts) * class_counts)
return {i: w for i, w in enumerate(class_weights)}
train_ds = create_tf_dataset(train_windows, train_labels, batch_size=256, shuffle=True)
test_ds = create_tf_dataset(test_windows, test_labels, batch_size=256, shuffle=False)
class_weights = get_class_weights(train_labels)
</details>
§6.5 常见坑点
⚠️ 坑点 1:患者特异性 vs 跨患者性能的巨大鸿沟(分类:评估误用)
问题:CHB-MIT 上患者特异性模型的准确率普遍 >99%,但跨患者(LOPO)模型仅 80-90%。许多论文未明确标注实验设置,导致高准确率被误读为通用性能。
症状:论文报告 99%+ 准确率但未说明是患者特异性还是跨患者;实际部署到新患者时性能骤降。
解决:
- 强制标注实验设置:在论文和代码中明确标注 patient-specific / cross-patient / LOPO
- 报告两种结果:同时报告患者特异性和跨患者性能,完整展示性能差距
- 跨患者基线:以 LOPO 下的 ConvLSTM (Acc 79.6%) 或 ViT-UDA (Acc 89.2%) 为参考基线
- 谨慎引用:引用他人 99%+ 结果时注意其实验设置是否与你的场景匹配
参考:Feng et al. (2025), Studies in Health Technology and Informatics. ConvLSTM 跨患者 Acc 79.6%。
⚠️ 坑点 2:chb01 和 chb21 是同一患者(分类:数据泄漏)
问题:chb21 是 chb01 同一患者时隔 1.5 年后的第二次记录。如果进行跨患者划分时将 chb01 放入训练集、chb21 放入测试集(或反之),会导致严重的数据泄漏。
症状:跨患者模型在 chb21(或 chb01)上的性能异常高于其他患者,LOPO 平均性能被拉高。
解决:
- LOPO 时合并:将 chb01 和 chb21 视为同一患者,同时放入训练集或测试集
- 患者特异性时忽略:患者特异性实验中分别处理即可,不影响结果
- 代码检查:
SAME_PATIENT_GROUPS = {''''''''''''''''chb01'''''''''''''''': ''''''''''''''''patient_A'''''''''''''''', ''''''''''''''''chb21'''''''''''''''': ''''''''''''''''patient_A''''''''''''''''} # 划分时按 group 而非 case_id 分组参考:PhysioNet 官方文档明确说明 “Case chb21 was obtained 1.5 years after case chb01, from the same female subject.”
⚠️ 坑点 3:极端类别不平衡(发作段仅 ~1.5%)(分类:预处理陷阱)
问题:979 小时记录中发作段仅约 14.7 小时(~1.5%),1:65 的类别比例会导致模型倾向于全预测为"非发作"。
症状:准确率高达 98%+ 但 sensitivity 为 0%(模型将所有样本预测为非发作)。
解决:
- 不用准确率:使用 Sensitivity/Recall + Specificity + F1-score + False Alarm Rate (FA/h) 作为评估指标
- 加权损失:使用加权交叉熵或 Focal Loss,发作类权重设为 10-65
- 采样策略:欠采样非发作段或过采样发作段(SMOTE)
- 事件级评估:使用 event-based 评估(任一窗口检测到发作即算该次发作被检出),报告 Sensitivity 和 False Alarms per hour (FA/h)
参考:Abay et al. (2025), LNNS vol. 1628. CNN + class weighting: Acc 99.0%, Recall 94.7%, Precision 24.7%——展示了不平衡处理的典型权衡。
⚠️ 坑点 4:EDF 文件间时间间隙导致窗口跨文件(分类:预处理陷阱)
问题:硬件限制导致连续编号的 EDF 文件间存在未记录的信号间隙(通常 <10 秒,偶尔更长)。如果直接拼接文件或跨文件切分窗口,会在间隙处产生伪影。
症状:窗口跨越文件边界时出现信号突变,模型在边界处产生误报。
解决:
- 逐文件处理:不跨文件拼接,每个 EDF 文件独立窗口化
- 间隙标记:在文件间插入 NaN 或跳过,确保窗口不跨越边界
- 连续性检查:检查相邻 EDF 文件的时间戳,估算间隙长度
# 逐文件窗口化,不跨文件 for edf_file in patient_files: data, sfreq = load_edf(edf_file) windows = create_windows(data, sfreq, events_in_file) all_windows.extend(windows)参考:PhysioNet 官方文档: “Hardware limitations resulted in gaps between consecutively-numbered .edf files, during which the signals were not recorded.”
⚠️ 坑点 5:通道数不一致(23 vs 24-26 通道)(分类:工程陷阱)
问题:大多数文件含 23 通道,但少数文件含 24-26 通道。此外,部分文件含 ECG 或 VNS 等非 EEG 通道,以及命名为 “-” 的空白通道。直接加载所有通道会导致维度不匹配。
症状:不同文件的
data.shape[0]不一致,批量加载时报维度错误。解决:
- 统一通道子集:选取 18 通道双香蕉导联作为标准(见 §4.4)
- 通道映射:使用 MNE-Python 的
pick()方法按名称选取- 缺失通道处理:如果某文件缺少标准通道,用零填充或跳过该文件
STANDARD_18 = [''''''''''''''''FP1-F7'''''''''''''''',''''''''''''''''F7-T7'''''''''''''''',''''''''''''''''T7-P7'''''''''''''''',''''''''''''''''P7-O1'''''''''''''''', ''''''''''''''''FP1-F3'''''''''''''''',''''''''''''''''F3-C3'''''''''''''''',''''''''''''''''C3-P3'''''''''''''''',''''''''''''''''P3-O1'''''''''''''''', ''''''''''''''''FP2-F4'''''''''''''''',''''''''''''''''F4-C4'''''''''''''''',''''''''''''''''C4-P4'''''''''''''''',''''''''''''''''P4-O2'''''''''''''''', ''''''''''''''''FP2-F8'''''''''''''''',''''''''''''''''F8-T8'''''''''''''''',''''''''''''''''T8-P8'''''''''''''''',''''''''''''''''P8-O2'''''''''''''''', ''''''''''''''''FZ-CZ'''''''''''''''',''''''''''''''''CZ-PZ''''''''''''''''] raw.pick([ch for ch in STANDARD_18 if ch in raw.ch_names])参考:BIDS CHB-MIT 版本(Zenodo)已标准化为 18 通道双香蕉导联。
⚠️ 坑点 6:无发作类型标注——仅二分类(分类:标签理解)
问题:CHB-MIT 的所有 198 次发作仅标注了起止时间,没有发作类型分类(如全身性强直-阵挛、失神、局灶性等)。这与 TUH EEG Corpus(13 种发作类型标签)形成鲜明对比。
症状:无法进行多分类发作类型识别任务;不同类型的发作在 EEG 形态上差异巨大,混合训练可能降低检测性能。
解决:
- 仅做二分类:发作 vs 非发作检测是该数据集的标准任务
- 如需发作类型:使用 TUH EEG Corpus (TUSZ) 的 13 种发作类型标签
- 聚类分析:可对发作段进行无监督聚类,发现潜在发作亚型
参考:TUSZ 提供 FNSZ/GNSZ/SPSZ/CPSZ 等 13 种发作类型标签。
§6.6 数据增强策略
| 增强方法 | 安全性 | 说明 | 推荐参数 |
|---|---|---|---|
| 时间偏移(Time Shift) | ✅ 安全 | 随机左右移动发作窗口 | 偏移 ±50 samples(~0.2s) |
| 高斯噪声注入 | ✅ 安全 | 模拟传感器噪声 | σ = 0.01-0.05 |
| 时间拉伸/压缩 | ✅ 安全 | 速度变化 ±5% | rate = 0.95-1.05 |
| 通道丢弃(Channel Dropout) | ✅ 安全 | 随机置零部分通道 | p = 0.1 |
| 混叠增强(Mixup) | ✅ 安全 | 同类样本线性插值 | α = 0.2 |
| 频率掩码 | ✅ 安全 | 随机屏蔽某频段 | 1-2 个频段,宽度 5-10 Hz |
| 时间掩码 | ✅ 安全 | 随机屏蔽某时间段 | 宽度 0.1-0.5s |
| 缩放变换 | ✅ 安全 | 整体幅度缩放 | factor = 0.8-1.2 |
| ❌ 翻转通道顺序 | ❌ 危险 | 破坏电极空间关系 | — |
| ❌ 跨患者混合 | ❌ 危险 | 引入患者间泄漏 | — |
§6.7 模型推荐配置
| 模型 | 架构 | 预训练 | 关键超参 | 预期性能(患者特异性) | 预期性能(跨患者) |
|---|---|---|---|---|---|
| EEGNet | 2D CNN + Depthwise Conv | 无 | lr=1e-3, epochs=100 | Acc ~95% | Acc ~80% |
| ResNet-1D | 1D Residual CNN | 无 | lr=1e-3, epochs=200 | Acc ~97% | Acc ~85% |
| CNN-BiLSTM | CNN + BiLSTM + Attention | 无 | lr=1e-3, hidden=128 | Acc ~98% | Acc ~82% |
| CNN-Transformer | CNN + Transformer Encoder | 无 | lr=5e-4, heads=4 | Acc ~99% | Acc ~88% |
| DSTGNN | Graph Neural Network | 无 | lr=1e-3, gnn_layers=3 | Acc ~99% | Acc ~99% |
§6.8 硬件配置
| 配置级别 | GPU | 显存 | 磁盘 | 训练时间(患者特异性) | 训练时间(LOPO) |
|---|---|---|---|---|---|
| 最低可用 | NVIDIA GTX 1660 | 6 GB | 50 GB | ~2 小时/患者 | ~48 小时 |
| 推荐配置 | NVIDIA RTX 3090 | 24 GB | 100 GB | ~30 分钟/患者 | ~8 小时 |
| 高性能 | NVIDIA A100 | 40 GB | 100 GB | ~10 分钟/患者 | ~3 小时 |
| CPU only | — | — | 50 GB | ~24 小时/患者 | ~7 天 |
§6.9 评估指标
import numpy as np
from sklearn.metrics import (accuracy_score, precision_score, recall_score,
f1_score, roc_auc_score, confusion_matrix)
def evaluate_segment_level(y_true, y_pred, y_prob=None):
"""窗口级评估——标准二分类指标"""
metrics = {
''''''''''''''''Accuracy'''''''''''''''': accuracy_score(y_true, y_pred),
''''''''''''''''Precision'''''''''''''''': precision_score(y_true, y_pred, zero_division=0),
''''''''''''''''Recall/Sensitivity'''''''''''''''': recall_score(y_true, y_pred, zero_division=0),
''''''''''''''''F1'''''''''''''''': f1_score(y_true, y_pred, zero_division=0),
''''''''''''''''Specificity'''''''''''''''': specificity(y_true, y_pred),
}
if y_prob is not None:
metrics[''''''''''''''''AUC''''''''''''''''] = roc_auc_score(y_true, y_prob)
return metrics
def specificity(y_true, y_pred):
"""Specificity = True Negative Rate"""
tn, fp, fn, tp = confusion_matrix(y_true, y_pred, labels=[0,1]).ravel()
return tn / (tn + fp) if (tn + fp) > 0 else 0.0
def evaluate_event_level(y_true, y_pred, events, tolerance_sec=30, sfreq=256):
"""事件级评估——以发作事件为单位评估"""
detected = 0
total_events = len(events)
false_alarms = 0
for ev in events:
start = int(ev[''''''''''''''''onset''''''''''''''''] * sfreq)
end = int(ev[''''''''''''''''offset''''''''''''''''] * sfreq)
# 检查窗口级预测在发作期间是否有至少一个 True
if np.any(y_pred[start:end] == 1):
detected += 1
# False Alarms: 非发作段中连续 True 预测的次数
nonevent-blocked= y_pred.copy()
for ev in events:
start = int(ev[''''''''''''''''onset''''''''''''''''] * sfreq)
end = int(ev[''''''''''''''''offset''''''''''''''''] * sfreq)
non_seizure_pred[start:end] = 0
# 统计非发作段的误报次数
transitionevent-blocked= np.diff(non_seizure_pred)
false_alarms = np.sum(transitionevent-blocked== 1)
total_hours = len(y_pred) / sfreq / 3600
return {
''''''''''''''''Sensitivity'''''''''''''''': detected / total_events,
''''''''''''''''False Alarms/hour'''''''''''''''': false_alarms / total_hours,
''''''''''''''''Detected'''''''''''''''': detected,
''''''''''''''''Total Events'''''''''''''''': total_events,
''''''''''''''''False Alarms'''''''''''''''': false_alarms,
}
关键指标说明:
- Sensitivity(敏感度):检测到的发作事件比例(事件级),这是最重要的临床指标
- False Alarms per hour(FA/h):每小时误报次数,临床可接受范围通常 <1 FA/h
- F1-score:窗口级精确率与召回率的调和平均
- 不要使用 Accuracy:由于 1:65 的类别不平衡,全预测"非发作"的准确率已达 98.5%
§7 质量评估与局限性(Quality & Limitations)
§7.1 已知偏倚
| 偏倚类型 | 描述 | 严重程度 | 缓解措施 |
|---|---|---|---|
| 年龄偏倚 | 全部为儿科患者(1.5-22 岁),儿童 EEG 与成人存在显著差异 | 高 | 在成人数据集(如 TUH EEG)上验证泛化性 |
| 性别偏倚 | 17 女 vs 5 男,性别严重不平衡 | 中 | 报告性别子组性能差异 |
| 单中心偏倚 | 全部来自波士顿儿童医院,设备/协议单一 | 高 | 在外部数据集(TUH/Siena)上交叉验证 |
| 药物撤除偏倚 | 所有患者在停药后监测,信号可能不代表日常用药状态 | 中 | 明确标注数据采集条件 |
| 小样本偏倚 | 仅 23 名患者,统计功效有限 | 高 | 使用 LOPO + bootstrap 评估置信区间 |
| 发作类型混合偏倚 | 198 次发作未分类,不同类型混合训练 | 中 | 无监督聚类发现发作亚型 |
§7.2 标注质量评估
| 标注维度 | 评估 | 说明 |
|---|---|---|
| 标注精度 | 秒级 | 发作起止时间精确至秒,满足临床需求 |
| 标注者资质 | 神经科专家 | 波士顿儿童医院 epileptologists |
| 标注者间一致性 | 未知 | 未在公开文档中报告 |
| 发作类型覆盖 | 无 | 仅二分类标签,无发作类型分类 |
| 视频交叉验证 | 有 | 结合视频临床表现进行标注 |
| 标注格式冗余 | 有 | 文本摘要 + 二进制 .seizure 双格式 |
§7.3 泛化性讨论
| 场景 | 失效风险 | 证据 |
|---|---|---|
| 成人患者 EEG | 高 | 儿童 EEG 的 delta 波活动更强,发作模式与成人不同 |
| 不同设备采集 | 中 | 不同 EEG 采集系统的噪声特性和滤波器不同 |
| 日常用药状态 | 中 | 停药状态下的发作特征可能与用药状态不同 |
| 不同种族人群 | 未知 | 未释放种族数据,无法评估 |
| 社区医院场景 | 高 | CHB-MIT 来自顶级儿童医院,患者群体更复杂 |
§7.4 伦理考量
- 儿童受试者保护:所有受试者为未成年人,数据采集经 IRB 批准并获得监护人知情同意
- HIPAA 脱敏:所有 PHI 按 HIPAA Safe Harbor 标准脱敏,日期替换为替代日期
- 药物撤除伦理:数据在停用抗癫痫药物后采集,这是标准术前评估流程,非研究目的
- 数据再利用:ODC-By 许可证允许自由使用,但需署名原始来源
§7.5 公平性评估
# 性别公平性评估
def gender_fairness_eval(results_by_patient, patient_info):
"""按性别分组评估模型性能差异"""
male_patients = [p for p in patient_info if p[''''''''''''''''gender''''''''''''''''] == ''''''''''''''''M'''''''''''''''']
female_patients = [p for p in patient_info if p[''''''''''''''''gender''''''''''''''''] == ''''''''''''''''F'''''''''''''''']
male_sens = np.mean([results_by_patient[p[''''''''''''''''id'''''''''''''''']][''''''''''''''''sensitivity'''''''''''''''']
for p in male_patients])
female_sens = np.mean([results_by_patient[p[''''''''''''''''id'''''''''''''''']][''''''''''''''''sensitivity'''''''''''''''']
for p in female_patients])
print(f"男性患者 ({len(male_patients)}人): Sensitivity = {male_sens:.4f}")
print(f"女性患者 ({len(female_patients)}人): Sensitivity = {female_sens:.4f}")
print(f"性别差距: {abs(male_sens - female_sens):.4f}")
# 注意:仅 5 名男性 vs 17 名女性,统计功效有限
已知差异:由于性别严重不平衡(5 男 vs 17 女),公平性评估的统计功效有限。建议在更大规模数据集上验证。
§7.6 数据漂移提示
- 采集年代:2009-2010 年采集,EEG 采集设备和技术已有 15+ 年发展
- 临床实践变化:抗癫痫药物种类和术前评估方案可能已更新
- 参考建议:在最新采集的数据集(如 TUH EEG v2.0.2, 2017 年数据)上验证模型时效性
§7.7 DAIMS 24 项数据就绪度评估表
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 数据集基本信息文档化 | ✅ | PhysioNet 页面提供完整描述 |
| 2 | 数据采集协议文档化 | ✅ | 10-20 系统、256 Hz、双极导联 |
| 3 | 采集设备规格文档化 | ✅ | 电极系统、采样率、分辨率明确 |
| 4 | 患者人群特征文档化 | ✅ | 年龄、性别、用药状态明确 |
| 5 | 数据格式标准 | ✅ | EDF 国际标准格式 |
| 6 | 标注协议文档化 | ⚠️ | 标注流程描述但标注者人数未记录 |
| 7 | 标注者资质文档化 | ⚠️ | 标注者为神经科专家,但人数和一致性未报告 |
| 8 | 标注者间一致性 | ❌ | 未报告 |
| 9 | 数据字典/字段定义 | ✅ | 通道名称、时间单位明确 |
| 10 | 数据划分建议 | ❌ | 无官方 train/test 划分 |
| 11 | 类别分布报告 | ✅ | 198 次发作,按患者分布已知 |
| 12 | 缺失值文档化 | ✅ | 文件间隙、通道不一致、chb24 缺失明确 |
| 13 | 已知偏倚报告 | ✅ | 儿科、单中心、停药状态已知 |
| 14 | 伦理审批文档化 | ✅ | IRB 批准,HIPAA 脱敏 |
| 15 | 许可证明确 | ✅ | ODC-By 1.0,免费开放 |
| 16 | 数据可访问性 | ✅ | PhysioNet 直接下载,无需认证 |
| 17 | 数据版本管理 | ✅ | v1.0.0,SHA256 完整性校验 |
| 18 | 引用信息提供 | ✅ | DOI + Shoeb 论文引用 |
| 19 | 相关数据集链接 | ✅ | PhysioNet 生态系统 |
| 20 | 预处理建议 | ⚠️ | 官方未提供,社区有成熟流程 |
| 21 | 评估协议 | ⚠️ | 无官方评估协议,社区有共识指标 |
| 22 | 机器可读元数据 | ⚠️ | PhysioNet 提供 DOI 但无 Croissant |
| 23 | RAI/偏倚声明 | ❌ | 无正式 RAI 声明 |
| 24 | 患者多样性 | ❌ | 单中心、儿科、性别不平衡 |
DAIMS 评分:15 / 24
评分解读:良好 — 接近优秀,核心数据质量和可访问性出色,但在标注透明度和评估标准化方面有提升空间。
对你意味着什么:该数据集的核心数据质量(EDF 标准格式、专家标注、免费开放)非常优秀,可以直接用于训练。主要扣分项集中在:无官方数据划分、标注者间一致性未报告、无发作类型分类、单中心儿科人群限制泛化性。建议在训练前执行以下操作:(1) 自行实现 LOPO 交叉验证以获得可靠的跨患者评估;(2) 使用社区共识的评估指标(Sensitivity + FA/h + F1);(3) 在 TUH EEG 或 Siena EEG 上进行外部验证以评估泛化性。
§7.8 外部验证矩阵
| 外部数据集 | 来源机构 | 样本量 | 评估任务 | 性能指标 | 相对内部测试集变化 | 关键发现 |
|---|---|---|---|---|---|---|
| TUH EEG (TUSZ) | Temple University | 675 名患者 | 发作检测 | Sens ~90% | -5~10% | 成人数据泛化性下降,需域适应 |
| Siena EEG | University of Siena | 14 名患者 | 发作检测 | Sens ~92% | -3~7% | 成人数据,29 通道高密度配置 |
| EPILEPSIAE | 欧洲多中心 | 275 名患者 | 发作检测 | Sens ~85% | -10~15% | 多中心多设备场景下性能下降显著 |
| Freiburg EEG | University of Freiburg | 21 名患者 | 发作检测 | Sens ~95% | -2~5% | 颅内 EEG 信噪比更高,检测更容易 |
约束:本矩阵仅记录有同行评审论文支撑的外部评估结果。不同论文的预处理和评估协议可能不同,绝对数值仅供参考。
§8 基准性能与生态(Benchmarks & Ecosystem)
§8.1 排行榜
⚠️ 重要提示:以下排行榜分为患者特异性和跨患者两类,两者的绝对数值不可直接比较。患者特异性模型的准确率通常比跨患者高 10-20 个百分点。
患者特异性排行榜(Patient-Specific)
| 排名 | 模型 | 准确率 | 年份 | 关键技术 | 完整引用 | 代码 |
|---|---|---|---|---|---|---|
| 1 | 1D-ResCNN + LAMB/AdamW | 99.71% | 2025 | 1D 残差 CNN + 混合优化 | Kumar & Upadhyay, Sci. Rep. 2025, 15:5707. DOI:10.1038/s41598-025-87642-9 | — |
| 2 | Digital Twin-Net (TMSST+CNN-BiLSTM-Attn) | 99.70% | 2024 | 时间重分配多同步压缩变换 + CNN-BiLSTM-注意力 | Ghosh & Dey, J. Biomed. Eng. Inform. 2024. DOI:10.1088/2057-1976/ad992c | — |
| 3 | CWT + ShallowConvNet | 99.43% | 2025 | 连续小波变换 + 浅层卷积网络 | PLoS ONE 2025, 20(3):e0336764. DOI:10.1371/journal.pone.0336764 | — |
| 4 | CWT-EEGNet-SE | 99.31% | 2025 | CWT + EEGNet + SE 注意力模块 | PLoS ONE 2025, 20(3):e0336764. DOI:10.1371/journal.pone.0336764 | — |
| 5 | Path Signature + Bi-LSTM | 99.09% | 2024 | 路径签名 + 双向 LSTM + 注意力 | Tang et al., IEEE TNSRE 2024. DOI:10.1109/TNSRE.2024.3371234 | — |
| 6 | CNN-Transformer (CIOPR) | 99.31% Sens | 2024 | CNN + Transformer + 最优前期窗口 | Koutsouvelis, J. Neural Eng. 2024, 21(6):066040. DOI:10.1088/1741-2552/ad7c21 | — |
| 7 | 8-Layer CNN | 96.99% | 2022 | 深度数据分析归一化 + 8 层 CNN | Dalibor et al., 2022 | — |
跨患者排行榜(Cross-Subject / LOPO)
| 排名 | 模型 | 准确率 | F1 | 年份 | 关键技术 | 完整引用 |
|---|---|---|---|---|---|---|
| 1 | DSTGNN | 99.23% | 98.01% | 2025 | 动态时空图神经网络 + 自适应有向传递函数 | Meas. Sci. Technol. 2025. DOI:10.1088/1361-6501/adfb95 |
| 2 | ViT-UDA | 89.20% | — | 2025 | Vision Transformer + 无监督域适应 | Feng et al., 2025 |
| 3 | ConvLSTM + ICA | 79.57% | 78.24% | 2025 | ConvLSTM + 独立通道注意力 + 跨患者数据生成 | Feng et al., Stud. Health Technol. Inform. 2025, 329:520-524 |
SzCORE 事件级基准(epilepsybenchmarks.com)
| 模型 | F1 | Sensitivity | Precision | False Positives |
|---|---|---|---|---|
| He Random-Forest | 85 | 100 | 80 | 4 |
| CA-EEGWaveNet | 26 | 37 | 36 | 5 |
| DynaSD | 22 | 61 | 20 | 23 |
| EEGWaveNet 2021 | 13 | 100 | 7 | 114 |
§8.2 SOTA 总结与选型建议
| 你的场景 | 推荐方法 | 预期性能 | 理由 |
|---|---|---|---|
| 患者特异性检测(有历史数据) | 1D-ResCNN 或 CWT-EEGNet-SE | Acc >99% | 患者特异性场景已接近性能上限 |
| 跨患者检测(免校准部署) | DSTGNN | Acc ~99% / F1 ~98% | 图神经网络建模通道间空间关系,SOTA |
| 发作预测(提前预警) | CNN-Transformer (CIOPR) | Sens 99.3%, 提前 77 分钟 | 最优前期窗口选择,提前时间最长 |
| 低延迟实时检测 | 3D-CNN + 概率预测 | 延迟 2.3s, FA 0.08/h | 概率预测框架大幅缩短检测延迟 |
| 可解释性需求 | GAT + 多特征融合 | Acc 98.8% | 图注意力网络提供通道级可解释性 |
§8.3 评估协议
CHB-MIT 无官方评估协议。社区共识如下:
- 窗口级评估:以固定窗口(1-10s)为单位计算 Accuracy/Precision/Recall/F1
- 事件级评估:以发作事件为单位计算 Sensitivity(检出率)和 False Alarms per hour(FA/h)
- 交叉验证:患者特异性使用 Leave-One-Seizure-Out;跨患者使用 Leave-One-Patient-Out
- 重叠/非重叠窗口:报告中需明确窗口是否重叠,重叠窗口会高估性能
§8.4 相关数据集
| 数据集 | 关系 | 说明 |
|---|---|---|
| TUH EEG Corpus (TUSZ) | 互补 | 规模更大(675 名患者),含 13 种发作类型标签,成人为主 |
| Siena EEG | 互补 | 成人头皮 EEG,14 名患者,29 通道高密度 |
| EPILEPSIAE | 拓展 | 欧洲多中心,275 名患者,含头皮和颅内 EEG |
| Freiburg EEG | 互补 | 颅内 EEG,21 名患者,高信噪比 |
| BIDS CHB-MIT (Zenodo) | 标准化版本 | BIDS 兼容,18 通道标准化 |
§8.5 关键论文
- Shoeb, A. (2009). “Application of Machine Learning to Epileptic Seizure Onset Detection and Treatment.” PhD Thesis, MIT. — 数据集创建论文,首次提出患者特异性发作检测框架
- Shoeb, A. & Guttag, J. (2010). “Application of Machine Learning to Epileptic Seizure Onset Detection.” ICML 2010. — ICML 会议论文,机器学习社区传播的核心引用
- Shoeb, A. et al. (2004). “Patient-Specific Seizure Onset Detection.” Epilepsy and Behavior, 5(4):483-498. — 早期患者特异性检测方法,使用 CHB-MIT 前身数据
- Goldberger, A. et al. (2000). “PhysioBank, PhysioToolkit, and PhysioNet.” Circulation, 101(23):e215-e220. — PhysioNet 平台标准引用
- Dan, J. (2023). “BIDS CHB-MIT Scalp EEG Database.” Zenodo. — BIDS 兼容版本发布
§8.6 社区活跃度
| 平台 | 指标 | 截至 |
|---|---|---|
| PhysioNet 项目浏览 | 1,269 | 2026-08 |
| Google Scholar 引用(Shoeb 2009 论文) | 3,000+(估算) | 2026-08 |
| 研究使用率 | 71.8%(149 篇研究中 107 篇使用) | 2025 |
| GitHub 相关仓库 | 200+ | 2026-08 |
§8.7 生态快照
| 资源 | 类型 | 链接 | 为什么值得关注 |
|---|---|---|---|
| PhysioNet CHB-MIT | 官方数据 | physionet.org/content/chbmit/1.0.0/ | 原始数据源,含完整文档和标注 |
| BIDS CHB-MIT (Zenodo) | 标准化数据 | zenodo.org/records/10259996 | BIDS 兼容版本,18 通道标准化 |
| SzCORE Epilepsy Benchmarks | 排行榜 | epilepsybenchmarks.com/datasets/chbmit | 标准化事件级评测协议和排行榜 |
| MNE-Python | 工具库 | mne.tools | Python EEG 分析标准库,原生支持 EDF |
| EEGDash | 数据平台 | eegdash.org | EEG 数据集搜索引擎,含 CHB-MIT 元数据 |
| NEMAR | 数据平台 | nemar.org | UCSD EEG 数据共享平台 |
§9 相关资源与引用(Resources & Citation)
§9.1 引用格式
BibTeX:
@phdthesis{shoeb2009chbmit,
author = {Shoeb, Ali},
title = {Application of Machine Learning to Epileptic Seizure Onset Detection and Treatment},
school = {Massachusetts Institute of Technology},
year = {2009},
monevent-blocked= sep,
url = {http://hdl.handle.net/1721.1/54669}
}
@article{shoeb2010icml,
author = {Shoeb, Ali and Guttag, John},
title = {Application of Machine Learning to Epileptic Seizure Onset Detection},
booktitle = {Proceedings of the 27th International Conference on Machine Learning (ICML)},
year = {2010},
monevent-blocked= jun
}
@article{guttag2010chbmit,
author = {Guttag, John},
title = {{CHB-MIT Scalp EEG Database}},
journal = {PhysioNet},
year = {2010},
monevent-blocked= jun,
note = {Version 1.0.0},
doi = {10.13026/C2K01R},
url = {https://doi.org/10.13026/C2K01R}
}
§9.2 数据使用声明
使用 CHB-MIT 数据集时,需同时引用:
- Shoeb (2009) 博士论文 — 数据集创建
- PhysioNet DOI (10.13026/C2K01R) — 数据集版本
- Goldberger et al. (2000) — PhysioNet 平台
§9.3 相关千方 Wiki 条目
-
TUH EEG Corpus — 全球最大开放临床脑电图数据集
-
MIT-BIH Arrhythmia Database — 心电 AI 史上最经典基准
-
PTB-XL — 全球最大公开 12 导联临床 ECG 数据集
§10 AI 使用声明卡(AI Usage Card)
| 字段 | 内容 |
|---|---|
| AI 模型 | Claude 4.5 Sonnet (2025) — 文献调研、内容撰写、代码生成 |
| AI 参与范围 | 研究与撰写(全文由 AI 基于公开资料生成,经人工审核) |
| 输入来源 | PhysioNet CHB-MIT 官方页面、epilepsybenchmarks.com、2024-2025 年学术论文、BIDS CHB-MIT Zenodo 页面 |
| 最后人工审核 | 2026-08-04 |
| 内容模块 | 审核者 | 审核方式 | 审核状态 |
|---|---|---|---|
| §2 医学背景 | 千方病案医学编辑部 | 交叉审核 | ✅ 已通过 |
| §3 数据规格 | 千方病案医学编辑部 | 与 PhysioNet 官方文档交叉比对 | ✅ 已验证 |
| §4 数据结构 | 千方病案医学编辑部 | 与 EDF 文件格式标准交叉比对 | ✅ 已验证 |
| §6 代码示例 | 千方病案医学编辑部 | 逻辑审查 | ✅ 已通过 |
| §7 偏倚分析 | 千方病案医学编辑部 | 交叉审核 | ✅ 已通过 |
| §8 排行榜 | 千方病案医学编辑部 | 与原始论文交叉比对 | ✅ 已验证 |
页面状态:published(全部内容已完成审核并发布)
