信息速览

Chapman-Shaoxing ECG Database — 12 导联心律失常 ECG AI-Ready Wikipedia
INFOBOX
| 字段 | 内容 |
|---|---|
| 数据集名称 | Chapman-Shaoxing ECG Database |
| 英文全称 | Chapman University, Shaoxing People’s Hospital 12-Lead ECG Database |
| 别名/简称 | ChapmanECG;Chapman-Shaoxing;SXPH;扩展版官方名称 A large scale 12-lead electrocardiogram database for arrhythmia study(PhysioNet ecg-arrhythmia) |
| 疾病分类(ICD-11) | BC81.3 心房颤动;BC81.2 心房扑动;BC80.1 窦性心动过缓;BC81.Z 室上性快速性心律失常;BC81.0 房性心动过速(见 §2.1) |
| SNOMED CT | 164889003(房颤)、426783006(正常窦律)、4951005(窦缓)、164890007(房扑)等,见 §2.1b |
| 数据模态 | 12 导联静息体表心电图(一维时序电压信号) |
| AI 任务类型 | 心律失常多分类(11 类节律 / 4 类合并 / SNOMED 多标签)、信号降噪、表征学习、跨库域适应 |
| 样本总数 | 10,646 例(figshare 首发版);45,152 例(PhysioNet 扩展版) |
| 数据大小 | 约 2.8 GB(figshare 六文件);2.3 GB zip / 解压 5.1 GB(PhysioNet WFDB) |
| 数据格式 | CSV(微伏整数,5,000 行 × 12 列)+ XLSX 标注;扩展版 WFDB(.mat + .hea) |
| 许可证 | CC BY 4.0 |
| 访问级别 | 开放(官网直接下载,无需注册或申请审核) |
| 语言 | 英语(文档、标签与代码注释) |
| 首发日期 | 2019(figshare 收录);数据论文 2020-02-12 刊于 Scientific Data |
| 最后更新 | 2022-08-24(PhysioNet v1.0.0 扩展版) |
| 发布机构 | Chapman University(美国加州 Orange)+ 绍兴市人民医院(浙江大学医学院附属绍兴医院);扩展版含宁波市第一医院 |
| 官方主页 | PhysioNet ecg-arrhythmia / figshare collection |
| 下载地址 | figshare 六文件;PhysioNet Files |
| DOI | 10.1038/s41597-020-0386-x(数据论文);10.13026/wgex-er52(扩展版);10.6084/m9.figshare.c.4560497.v2(figshare) |
| 引用次数 | 496+(Semantic Scholar,截至 2026-09) |
| AI 就绪度评分 | ⭐⭐⭐⭐(4/5)— 格式统一、标注齐全、开源转换与降噪工具,但无官方 train/test 划分文件,CSV 微伏格式需自建 DataLoader(扣分项:划分与 DL 管道需手工实现) |
| 页面状态 | published |
§0 医学与技术审核声明
医学审核者:千方病案医学编辑部,交叉审核:§2 医学背景(ICD-11/SNOMED CT 映射、心律失常流行病学)、§7 偏倚分析。
数据工程审核者:千方病案医学编辑部交叉审核(医疗 AI 数据工程师),审核范围:§4 DAIMS 数据字典、§5 数据划分策略、§6 预处理 Pipeline 和坑点。
审核日期:2026-09-05
医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。
技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。
数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。Chapman-Shaoxing 以 CC BY 4.0 许可开放发布(绍兴市人民医院伦理委员会批准并豁免知情同意,去标识化后公开共享),通过 PhysioNet 与 figshare 直接下载,无需签署数据使用协议。引用时请遵守 CC BY 4.0 的署名要求并规范引用原始论文。
§1 数据集概览
§1.0 📌 30 秒速览
这是什么? Chapman-Shaoxing 是由美国 Chapman University 与中国绍兴市人民医院联合发布的 12 导联静息心电图公开数据库。首发版收录 10,646 名患者,每人一条 10 秒、500 Hz 采样的标准 12 导联 ECG,信号以微伏为单位存为 CSV,配一份标注表(节律诊断 + 附加心脏状况 + 年龄性别 + 自动测量参数)。2022 年扩展为含宁波第一医院队列的 45,152 例 PhysioNet 版本。每条记录的节律标签由持证医师标注、第二名医师复核、资深医师终裁,是开放 ECG 数据中标注流程最规范者之一。
为什么重要? 心电图是应用最广的无创心脏检查,房颤等心律失常的自动识别是医疗 AI 最成熟的落地场景之一,而算法训练需要大规模、标注可信的公开数据。Chapman-Shaoxing 在开放 ECG 数据稀缺的年代(2019-2020 年)第一个把"上万人规模 + 12 导联 + 500 Hz + 专家标注"凑齐,与德国的 PTB-XL、中国的 CPSC 2018 并列为心律失常分类论文最常引用的三大基准,也是 PhysioNet/CinC Challenge 2021 的官方训练数据源之一。
我能用它做什么? 训练和公平对比心律失常分类模型(11 类节律或官方推荐的 4 类合并)、做多导联 ECG 表征学习与自监督预训练、研究信号降噪(官方同时提供原始与降噪两版信号)、或者做跨数据库泛化与域适应研究(与 PTB-XL/CPSC/Georgia 组合)。注意:它没有逐搏标注,不适合做心搏级定位任务;训练前请先读 §6.5 的 8 个坑点,尤其是双发布渠道重叠与标签体系不一致问题。
§1.1 摘要
Chapman-Shaoxing 的数据生产链路是:受试者在绍兴市人民医院接受标准 12 导联静息 ECG 检查(10 秒,500 Hz),信号存入 GE MUSE 心电管理系统;持证医师在 MUSE 中标注节律与附加状况,第二名医师复核,分歧由资深医师终裁;随后数据经 GE 私有编码的 XML 导出,由团队自研的开源工具 ECGConverter(参考 van Ettinger 的 C# ECG Toolkit)转为 CSV,2022 年 PhysioNet 版再转为 WFDB 格式。首发版 10,646 例覆盖 11 种节律,其中最常见的窦性心动过缓占 36.53%,最罕见的窦房至房游走心律仅 7 例;患者年龄 4-98 岁(均值 51.19 ± 18.03),男性 55.95%。官方同时发布降噪版信号(Butterworth 低通 → 稳健 LOESS 去基线 → 非局部均值)与 230 个可解释特征的 XGBoost 基线(4 类 10 折交叉验证 F1 0.965)。扩展版 45,152 例将诊断映射为 SNOMED CT 多标签(60 余种状况),直接对接 PhysioNet 生态与 Challenge 2021 评分协议。原始论文刊于 Scientific Data(2020),Semantic Scholar 引用 496+(截至 2026-09)。
摘要的关键读点:这是一条"临床判读优先"的数据管线——标签在信号导出之前就已经在 MUSE 系统内由医师完成并固化,因此 Rhythm 标签的权威性等同于医院心电报告,但代价是标签与信号的对应完全依赖文件名主键,且中间没有任何机器质量关卡。这一"一次性判读、终身有效"的设计,既解释了它标注质量高的原因,也解释了它为什么没有逐搏标注与质量标志位。
§1.2 战略价值分析
三个维度的价值判断:对基准使用者、对方法研究者、对数据工程师,本库提供的核心资产各不相同。
基准统一维度:在 Chapman-Shaoxing 出现之前,开放 12 导联 ECG 要么规模小(MIT-BIH 仅 48 条 Holter 记录)、要么采样率与时长不统一(CPSC 2018 记录 6-144 秒不等)。Chapman-Shaoxing 用"一人一条 + 恒定 500 Hz × 10 秒 + 恒定 12 导联"的刚性规格,为社区提供了一个变量被最大程度锁定的公平擂台。此后大量论文同时报告"PTB-XL + CPSC + Chapman-Shaoxing"三库成绩,使跨论文对比第一次有了共同坐标系——这也是它成为 PhysioNet/CinC Challenge 2021 官方训练数据源的直接原因。
中欧合作与方法学维度:该数据集由中美团队(Chapman University 计算与数据科学学院 + 绍兴市人民医院心内科)合作完成,其三级医师标注协议(标注 → 复核 → 终裁)在开放 ECG 数据集中标注透明度领先,姊妹论文(Scientific Reports 2020,40,258 人库)记载 22 名心脏科/医师专家参与标注。同时,官方开源了从 GE MUSE 私有 XML 到标准格式的完整转换与降噪工具链(ECGConverter、ECGDenoisingTool),为"医院信息系统数据如何变成 AI-Ready 数据集"提供了一个可复用的工程范本,其方法论影响了后续 2022 年 SNOMED CT 标准化的扩展版。
数据工程教学维度:本库是极少数把"生产链路全程摊开"的医疗数据集——GE MUSE 系统的私有 XML 编码如何解析、微伏整数如何存储、降噪三级流水线如何参数化、标注表如何与信号主键对齐,全部有开源代码与论文细节对应。对医疗 AI 数据工程师而言,它可以当作"医院数据 → 公开发布"完整生命周期的参考实现;对研究者而言,这意味着从原始数据到可发表结果的每一步都可以被审计和复现,而不必信任一个不透明的预处理黑箱。
§1.3 同类数据集横向对比
| 数据集 | 规模 | 模态与规格 | 标注 | 与 Chapman-Shaoxing 的差异化 |
|---|---|---|---|---|
| Chapman-Shaoxing(本库) | 10,646 例 / 10,646 患者(扩展版 45,152) | 12 导联,500 Hz,恒定 10 秒 | 11 类节律单标签 + 56 种附加状况(扩展版 SNOMED 多标签 60+) | 规格刚性统一,医师三级核验,双版本同源发布 |
| PTB-XL | 21,837 条 / 18,885 患者 | 12 导联,500 Hz(另有 100 Hz 版),10 秒 | SCP-ECG 标准五大类 40+ 诊断,最多两次医师复核 | 德国单国人群;标签体系为 SCP-ECG,与本项目不互通 |
| CPSC 2018 | 6,877 条 | 12 导联,500 Hz,6-144 秒不等 | 9 类诊断 | 规模小、时长不统一;长记录适合节律段分析 |
| Georgia 12-lead(G12EC) | 10,344 条公开 | 12 导联,500 Hz,5-10 秒 | SNOMED CT 多标签(Challenge 2020) | 美国东南部人群,与 Challenge 协议绑定 |
| MIT-BIH Arrhythmia | 48 条 | Holter 2 导联,360 Hz,约 30 分钟 | 逐搏标注 | 逐搏粒度(本库无),但规模小且仅 2 导联 |
| MIMIC-IV-ECG | 约 80 万条 | 12 导联,500 Hz,10 秒 | 诊断级 ICD/文字映射 | 体量最大但标注为计费诊断而非心电专业标注 |
读表要点:本库的核心卖点是规格刚性——在对比表中唯一做到"一人一条 + 恒定时长 + 恒定采样率 + 专业心电标注"四项同时成立的公开库;PTB-XL 在规模与标签标准上更胜,但其 SCP-ECG 体系与本库自编缩写/SNOMED 体系不互通;MIT-BIH 与本库是粒度互补而非替代关系。
§1.4 版本时间轴
| 时间 | 版本/事件 | 说明 |
|---|---|---|
| 2019 | figshare 收录(v2,DOI 10.6084/m9.figshare.c.4560497.v2) | 首发版四部分:ECGData、ECGDataDenoised、Diagnostics.xlsx、AttributesDictionary.xlsx |
| 2020-02-12 | Scientific Data 论文发表(DOI 10.1038/s41597-020-0386-x) | 10,646 例规模、11 类节律、XGBoost 基线正式确立 |
| 2020 | PhysioNet/CinC Challenge 2020 采用同源数据格式 | Georgia/Chapman 系 SNOMED CT 评分协议成型 |
| 2021 | PhysioNet/CinC Challenge 2021 训练集收录 | chapman-shaoxing 10,247 条 + ningbo 34,905 条,全部 500 Hz |
| 2022-08-24 | PhysioNet ecg-arrhythmia v1.0.0(DOI 10.13026/wgex-er52) | 扩展至 45,152 例(绍兴 + 宁波),WFDB 格式,SNOMED CT 多标签 |
时间轴的使用提示:引用与复现实验时,先确定目标文献使用的版本(§3.0 版本抉择矩阵),再把时间轴上的对应事件写入你的数据声明——2019/2020 与 2022 两个版本在标签体系、格式与规模上完全不同,混引是审稿意见的高频来源。
§1.5 典型应用场景
- 心律失常分类基准复现与对比:按官方 4 类合并(AFIB/GSVT/SB/SR)或 11 类细粒度训练分类器,与论文基线 F1 0.965(10 折 CV)直接对标。
- ECG 自监督/基础模型预训练:45,152 例扩展版(5.1 GB)体量适中、规格统一,适合作为多库混合预训练的中国人群分量。
- 信号降噪方法研究:官方同时提供原始与降噪版本及降噪代码,可对照研究 Butterworth+LOESS+NLM 流程对诊断特征的影响。
- 跨数据库泛化与域适应:与 PTB-XL(欧洲人群、SCP-ECG 标签)、CPSC 2018(时长可变)组合,评估模型跨人群、跨标签体系的迁移能力。
- 教学与可复现工程实践:完整的"医院系统 → XML → CSV/WFDB → 公开发布"链路与开源工具,是医疗数据工程课程的理想案例。
场景选择的最短路径:如果你只记得住一句话——做分类基准用 figshare 版 + 4 类协议,做预训练用扩展版 + SNOMED 标签,两者都先跑质量筛查。剩下的细节(单位、划分、泄漏检查)都在 §6 的代码里。
§2 医学背景
§2.1 ICD-11 编码映射
11 类节律标签对应 WHO ICD-11 心律失常章节(BC60-BD1Z)如下:
| 标签代码 | 心律名称(中) | ICD-11 编码 | ICD-11 名称 |
|---|---|---|---|
| SB | 窦性心动过缓 | BC80.1 | 窦性心动过缓 |
| SR | 正常窦性心律 | 非疾病(正常) | 不适用 |
| AFIB | 心房颤动 | BC81.3 | 心房颤动 |
| ST | 窦性心动过速 | BC81.6 | 不适当窦性心动过速(近似) |
| SVT | 室上性心动过速 | BC81.Z | 室上性快速性心律失常,未特指 |
| AF | 心房扑动 | BC81.2 | 大折返性房性心动过速(典型房扑 BC81.20) |
| SI | 窦性心律不齐 | BC80.0(近似) | 窦性心律失常 |
| AT | 房性心动过速 | BC81.0 | 异位房性心动过速 |
| AVNRT | 房室结折返性心动过速 | BC81.8 | 房室结折返性心动过速 |
| AVRT | 房室折返性心动过速 | BC81.7 | 房室折返性心动过速 |
| SAAWR | 窦房至房游走心律 | BC80.Z(近似) | 窦性起源异常,未特指 |
映射说明:SR 为正常所见而非疾病,在 ICD-11 中无编码,多标签研究时可作为"阴性类"处理;标"近似"的三行(ST、SI、SAAWR)是本库自编缩写在 ICD-11 中无一一对应实体时的最近似映射,做标准化上报时需由临床团队确认等效性,本表不构成编码决定。
§2.1b SNOMED CT 映射
PhysioNet 扩展版官方提供 ConditionNames_SNOMED-CT.csv 映射表;主要代码如下(与 PhysioNet/CinC Challenge 2021 评分码一致):
| 标签代码 | SNOMED CT | 术语名称 |
|---|---|---|
| SR | 426783006 | Sinus rhythm(正常窦性心律) |
| AFIB | 164889003 | Atrial fibrillation(心房颤动) |
| AF | 164890007 | Atrial flutter(心房扑动) |
| SB | 4951005 | Sinus bradycardia(窦性心动过缓) |
| ST | 427084000 | Sinus tachycardia(窦性心动过速) |
| SVT | 6456007 | Supraventricular tachycardia(室上性心动过速) |
| AT | 6971005 | Ectopic atrial tachycardia(异位房性心动过速) |
| 1AVB(附加状况) | 270492004 | First degree atrioventricular block(一度房室传导阻滞) |
| LBBB(附加状况) | 164909002 | Left bundle branch block(左束支阻滞) |
| RBBB(附加状况) | 59118001 | Right bundle branch block(右束支阻滞) |
| APB(附加状况) | 284470004 | Atrial premature beats(房性期前收缩) |
| PVC(附加状况) | 427172004 | Premature ventricular contractions(室性期前收缩) |
SNOMED 映射的实用提示:扩展版 .hea 中的 #Dx 是逗号分隔的多码列表(可含形态学 + 节律 + 传导障碍混合诊断),做单标签任务时社区约定取首码(即主节律);Challenge 2021 的评分码表(dx_mapping_scored.csv)只覆盖其中 24+ 个"可评分"码,其余码在 Challenge 协议下不计分——这解释了为什么同一份 #Dx 在不同论文里"有效标签数"不同。
§2.2 疾病简介与流行病学
心电图反映心肌除极(P 波 = 房、QRS 波 = 室)与复极(T 波)的电活动序列;心律失常即心跳的速率或节律出现异常的一大类疾病,临床表现从无症状到晕厥、猝死不等,典型表现包括 SB、AT、PVC 等数十种各有形态学特征的类型(PhysioNet 官方页 Background)。静息 12 导联 ECG 是其一线无创检查手段,医师通过判读波形形态与间期(PR、ST、QT)给出节律诊断;这一过程产生海量数据,自动判读的直接价值就是把这部分人力从重复判读中释放出来。
本库覆盖的 11 类节律可归为三组:窦房结起源异常(SB、SR、ST、SI、SAAWR)、房性与房室折返性快速性心律失常(AFIB、AF、SVT、AT、AVNRT、AVRT)。其中房颤是临床上最重要的类型:官方 PhysioNet 页面指出房颤"与严重心功能障碍和卒中风险的显著升高相关",是基层与心内科筛查量最大的心律失常,这也是无创 ECG 自动诊断被列为公共卫生优先事项的原因(PhysioNet 官方页)。在本库内部,房颤 1,780 例(16.72%)+ 房扑 445 例(4.18%),合计约五分之一,且房颤组平均年龄 73.36 岁显著高于全库 51.19 岁,与房颤患病率随年龄增长的流行病学规律一致。窦性心动过缓占比 36.53% 居首,反映的是医院转诊人群特征(见 §7.1 偏倚分析),不代表一般人群患病率。
从建模角度还需注意三组临床鉴别边界的难易差异:AFIB 与 AF 的鉴别(P 波消失 vs 锯齿状 F 波)在 10 秒条带上形态学区分度较好,因此两类各自的样本量(1,780 与 445)足以支撑细粒度训练;SB 与 ST 的定义以心率为界,模型需要学会"数心率"而非记住形态;而 SVT/AT/AVNRT/AVRT 四类窄 QRS 心动过速在体表 ECG 上的形态经常重叠,这正是官方推荐把它们合并进 GSVT 组的临床原因——体表判读本身就不追求在条带层面强分机制。
§2.3 临床任务定义
- 筛查:从静息 12 导联 ECG 中自动识别节律异常,标记需人工复核的记录。对应任务形态是整条记录的多分类/多标签分类——这正是本库标签的设计粒度。
- 诊断分型:区分 AFIB 与 AF(抗凝策略不同)、SVT 与窦速(处理路径完全不同),对应 11 类细粒度任务。临床难点在于 AVNRT 与 AVRT 的机制鉴别通常需要腔内电生理检查(见坑点 4)。
- 附加状况识别:束支阻滞(LBBB/RBBB)、房室传导阻滞(1AVB)、期前收缩(APB/PVC)等形态学状况以附加编码形式存在,对应多标签分类任务。
- 质量与测量:GE MUSE 自动输出的心率、QRS 时限、QT/QTc、电轴等 11 项测量可用于回归任务或模型可解释性研究,但其机器自动判读的性质决定了它不是金标准(见坑点 8)。
任务-数据对齐检查(设计实验前自问四个问题):任务标签是条级的吗(是 → 匹配)?需要逐搏输出吗(否 → 匹配)?标签空间能落在 11 类 + 56 状况或 SNOMED 映射内吗(是 → 匹配)?结论依赖采集时间吗(否 → 匹配)?四问全过再进入建模,任何一问不过都应回到 §1.3 重新选库,而不是改数据迁就问题。
§2.4 患者人群
两版人群构成分列如下;扩展版的逐条人口学存于 .hea 头文件,无集中表格。
| 维度 | figshare 首发版 | PhysioNet 扩展版 |
|---|---|---|
| 来源机构 | 绍兴市人民医院(浙江大学医学院附属绍兴医院) | 绍兴市人民医院 + 宁波市第一医院 |
| 采集地点 | 中国浙江绍兴 | 中国浙江绍兴、宁波 |
| 规模 | 10,646 人(一人一条) | 45,152 人(一人一条) |
| 年龄 | 51.19 ± 18.03 岁,范围 4-98 岁 | .hea 头文件含 #Age(逐条记录) |
| 性别 | 男 5,956(55.95%)/ 女 4,690(44.05%) | .hea 头文件含 #Sex |
| 种族 | 未披露 | 未披露 |
| 就医类型 | 医院就诊人群(论文未细分门诊/住院) | 同左 |
| 异常比例 | 83% 至少一种异常,17% 正常窦性心律 | 主节律 SB 15,807 / SR 7,882 / AF 5,609 / ST 5,383 / AFIB 1,779(ECGBench 重算) |
人群表的两点解读:其一,17% 正常窦律意味着本库天然偏向"异常样本",这与筛查场景(异常率低)的真实分布相反,直接把库内先验带到筛查产品会系统性高报异常;其二,扩展版把 #Age/#Sex 放进每条 .hea 头文件而非集中表格,做人口学分析前需要先遍历 45,152 个头文件构建元数据表(ECGBench 的 ecgbench_metadata.csv 即此产物),这是两个版本在数据工程成本上的实质差异。
§2.5 临床价值
对本库标注协议(标注 → 复核 → 终裁)的信任,本质上是信任"三份独立医师判读收敛到单标签"这一过程对常见节律的可靠性——对 AFIB、SB、SR 等高患病率类别,医师间一致性通常很高。这使本库适合承担两类临床相关任务:一是作为"初筛 + 人工复核"工作流的训练源,模型负责把 80% 的高置信记录过滤掉,让医师聚焦疑难条目;二是作为可解释性研究的试验床——官方 230 特征 XGBoost 基线(F1 0.965)证明纯形态学统计特征即可达到接近专家的水平,这为"模型输出可被医师审计"的需求提供了起点。但对 AVNRT/AVRT 这类机制性鉴别和罕见节律,模型输出必须降级为"提示"而非"诊断"(见 §7.3)。
从卫生系统视角看,本库支持的第二层价值是可迁移的评测基础设施:由于标签体系已在扩展版完成 SNOMED CT 标准化,任何在本库上验证过的新方法都可以在不改标签管线的情况下接入 Challenge 2021 评分协议,与其他机构的方法在同一坐标系下比较。这种"数据集即基础设施"的属性,是它区别于一般单院数据集、也是各国团队持续引用它的深层原因。
§2.6 金标准对照
下表把本库标注与三级金标准概念(临床惯例、电生理机制、逐搏真值)放在同一张表里对照,目的是划清"本库标签能支撑什么、不能支撑什么"的边界。
| 维度 | 本库的标注方式 | 金标准定义 |
|---|---|---|
| 划分 | 整条 10 秒记录一个 Rhythm 主标签(单标签) | 体表节律判定以 10-30 秒条带人工判读为临床惯例,粒度一致 |
| 标注方式 | GE MUSE 系统内人工标注 + 三级核验 | 电生理检查为机制金标准(本库不具备) |
| 标注者 | 持证医师初标 + 第二医师复核 + 资深医师终裁(姊妹论文记载 22 名专家参与) | 多名资深心脏科医师独立判读一致性 |
| 性质 | 条级临床判读(非逐搏、非腔内) | 逐搏标注需 Holter 数据库(如 MIT-BIH);机制标注需腔内电图 |
对照结论:本库在"条带节律判读"这一临床惯例粒度上是合格的金标准代理,但在"机制鉴别"与"逐搏定位"两个更高精度维度上存在结构性缺口。设计研究时,应把研究问题显式对齐到本库具备的粒度——想做机制研究,请用含电生理随访的队列;想做逐搏定位,请用 MIT-BIH 系 Holter 库。
§3 数据集规格
§3.0 版本抉择矩阵
本数据集存在三个正式发布渠道,选错渠道是社区最高频的错误(详见坑点 1)。三渠道的数据本体同源但标签体系、格式与子集口径不同,先对表选择再动手下载:
| 你的需求 | 推荐渠道 | 大小 | 理由 |
|---|---|---|---|
| 复现心律失常分类论文、与既有文献直接对比 | figshare 首发版(10,646 例) | 约 2.8 GB | 11 类节律与论文 Table 2 完全对齐;几乎所有已发表基线基于此版 |
| 大规模预训练、多标签分类、SNOMED 标准化研究 | PhysioNet 扩展版(45,152 例) | 2.3 GB zip / 5.1 GB 解压 | 含宁波队列,WFDB 格式,SNOMED CT 多标签,接入 PhysioNet 生态 |
| 混合多库竞赛式训练(Challenge 协议) | CinC 2021 训练包内 chapman-shaoxing 文件夹(10,247 条) | 随 Challenge 包 | 与 Challenge 评分码对齐;注意较 figshare 少 399 条且官方未说明筛选规则 |
| 降噪算法研究(需要干净对照) | figshare 首发版(含 ECGDataDenoised) | 约 2.8 GB | 唯一同时提供 Raw + Denoised 双版本的渠道 |
§3.1 模态详情
单一模态:12 导联静息体表心电图。导联顺序为标准 I、II、III、aVR、aVL、aVF、V1-V6;信号由 GE MUSE 系统存储后经 32-bit A/D 数字化(每 A/D bit 对应 4.88 µV),幅值单位微伏,上限 32,767、下限 −32,768(PhysioNet 官方页)。每条记录恒定 10 秒、500 Hz,即 5,000 个采样点。注意 12 导联物理上仅 8 路独立信号(肢体导联满足 Einthoven/Goldberger 线性关系),见坑点 8。官方另提供一版降噪信号:Butterworth 低通(通带 50 Hz、阻带 60 Hz、正反向零相位)→ 稳健 LOESS(6 倍 MAD 外零权重)去基线漂移 → 非局部均值(NLM)平滑,代码开源(ECGDenoisingTool)。
工程上的三个推论值得写进你的数据加载器设计文档:第一,微伏整数存储意味着信号量化步长 4.88 µV,任何低于该尺度的幅值比较(如低幅 P 波检测阈值)必须考虑量化噪声;第二,±32,767 µV 的截幅边界约相当于 ±32.8 mV,正常静息 ECG 远达不到,但电极接触不良的记录会贴边,这是免费的坏记录探测器;第三,恒定 5,000 点长度使整库可以缓存为一个 (10646, 12, 5000) 的 float32 数组(mV 下约 2.5 GB),无需在训练时逐条读盘。
§3.2 按发布渠道的样本数
| 渠道 / 子集 | 记录数 | 说明 |
|---|---|---|
| figshare ECGData | 10,646 | 绍兴队列,每患者一个 CSV |
| figshare ECGDataDenoised | 10,646 | 与上表同名文件一一对应的降噪副本 |
| PhysioNet WFDBRecords(绍兴 JS00001-JS10646) | 10,646 | 与 figshare 同队列同源 |
| PhysioNet WFDBRecords(宁波 JS10647-JS45551) | 34,506 | 扩展新增队列(合计 45,152) |
| CinC 2021 训练包 chapman-shaoxing | 10,247 | 较 figshare 少 399 条,官方未说明筛选规则 |
| CinC 2021 训练包 ningbo | 34,905 | 与 PhysioNet 宁波子集口径不同,注意对齐 |
两个"数字对不上"都是官方口径而非数据错误:CinC 包的 10,247 与 figshare 的 10,646 相差 399 条,Challenge 官方页未给出筛选原因,因此任何声称"在完整 Chapman-Shaoxing 上训练"的 Challenge 系论文实际用的都是这个子集;ningbo 的 34,905 与 PhysioNet 版宁波段(34,506)同样存在口径差,跨渠道复用记录 ID 时必须以实际文件清单而非论文数字为准。
§3.3 数据格式
三套格式服务于三个时代的读取习惯:CSV 是 2019 年"任何人都能打开"的朴素选择;WFDB 是 PhysioNet 生态的标准(配套 30 年的工具积累与信号健康检查);Challenge 包的 g# 分层是竞赛组织方的随机化产物,不代表任何语义分组。跨格式迁移时唯一的风险点是标签位置——figshare 的标签在集中式 xlsx,WFDB 的标签在分布式 .hea,没有单一位置能看到"全部标签",做全局统计前必须先跑一遍头文件扫描。
| 渠道 | 信号格式 | 标注格式 | 读取工具 |
|---|---|---|---|
| figshare | CSV,每患者一文件,5,000 行 × 12 列(带导联名表头),微伏整数 | Diagnostics.xlsx(一行一患者)+ AttributesDictionary.xlsx(56 缩写字典) | pandas 直接读取 |
| PhysioNet | WFDB:.mat(MATLAB v4 二进制)+.hea(头文件含 #Age/#Sex/#Dx) | SNOMED CT 逗号分隔多标签存于 .hea;ConditionNames_SNOMED-CT.csv 映射表 | wfdb-python、scipy.io.loadmat |
| CinC 2021 | WFDB(同上),g# 子文件夹每夹 1,000 条 | .hea 内 #Dx 为 Challenge SNOMED 评分码 | Challenge 官方 python-classifier-2021 |
§3.4 存储大小
figshare 集合六文件合计约 2.8 GB(ECGData 与 ECGDataDenoised 各约 1.4 GB 量级);PhysioNet 版 zip 2.3 GB、解压后 5.1 GB(来源:PhysioNet 与 ECGBench 数据卡)。
容量规划参考:单一渠道数据本体 5.1 GB 以内,任何主流工作站均可全量缓存内存;真正需要规划的是派生数据——预处理副本(.npy 缓存约 2.5 GB × 版本数)、特征表与训练日志的留存策略,建议在项目目录设计中预留 10 倍于源数据的派生空间。
§3.5 标注方式
两级标注体系:Rhythm 主标签(11 类单标签,标注整条 10 秒记录的节律)与 Beat 附加状况列(56 种缩写的空格分隔多标签,如 1AVB、APB、LBBB、RBBB、PVC、WPW、MI 等,官方明确说明这些附加状况"作用于整条记录而非特定心搏")。此外 Diagnostics.xlsx 含 11 项 GE MUSE 机器自动测量(心率、QRS 时限、QT/QTc、电轴等)与人口学字段。注意标注流程为医师在 MUSE 系统内完成判读后导出,因此 Rhythm 标签是"医师判读结果"而非"机器自动分类"。
两处官方文档不一致需要使用者在脚本中容错:其一,附加状况种类数在论文 Abstract 中写 67 种、Background 中写 56 种,而 Online-only Table 1 实际列出 56 个缩写,ECGBench 在 Beat 列实测到 57 个代码——稳妥做法是构建映射表时以数据文件实测值为准,不要硬编码论文中的枚举数;其二,Diagnostics 的 Gender 列女性值为 “FEMAL”(原文如此),清洗规则需显式包含该拼写(坑点 8)。
§3.6 标注者资质与一致性
持证医师初标 → 第二名持证医师二级验证 → 分歧由资深医师终裁(PhysioNet 官方页)。姊妹论文(Scientific Reports 10:2898,40,258 人库)记载 22 名心脏科/医师专家参与标注。官方未发布标注者间一致性统计(如 Cohen’s κ),这是标注质量的已知信息缺口;Challenge 2021 官方也声明混合训练集中"部分数据与标签可能存在错误"。使用时应将标签视为"多名医师收敛后的共识"而非绝对真值。
对本缺口的一个低成本补救:在正式实验前,从测试集中按 11 类分层抽取 110-220 条,请一名心内科医师独立复标,估算每类的"本地标签噪声率",并在结果表中与模型错误率并排报告——若某类医师复标一致率仅 90%,则该类模型 F1 的上限就是 0.90 左右,继续调参没有意义。
§3.7 采集周期
论文未披露精确的采集起止时间。间接证据:项目受 2018 年绍兴市医药卫生研究基金(2018C30070)资助,数据 2019 年即收录 figshare、2020 年发表(PMC7016169),可推断首发版采集窗口约在 2018 年课题立项前后至 2019 年发布之间;扩展版发布于 2022-08-24。凡需要时间维度结论(如年度漂移)的研究应将"无时间戳"列为硬约束(见 §7.6)。
一个可行的部分替代方案:文件名中的日期片段(如 MUSE_20180111_... 的 20180111)暗示了采集日期的线索,社区有工作据此近似重建时间轴——但这属于文件命名惯例而非官方承诺,基于它的任何时间序列分析都必须在方法部分声明该假设并做敏感性检验,不建议作为严谨结论的依据。
§3.8 地域覆盖
中国浙江省绍兴市(首发版)与宁波市(扩展版)两家三甲医院;合作分析方为美国加州 Chapman University。单地域、单民族占绝对主导的队列(种族未披露),跨地域泛化见 §7.3。
地域覆盖的具体含义:绍兴与宁波同属浙北吴语区,饮食结构、人口老龄化程度与就医习惯高度同质,两院数据合并不构成实质意义上的多地域多样性;与中国其他大区(华南、西南、西北)乃至欧美人群相比,本库的地域代表性等于"单点"。计划做跨省或多国部署的团队,应把本库定位为"原型验证集"而非"训练全集"。
§3.9 设备规格
存储与管理系统:GE MUSE 心电管理系统。心电图机具体型号论文未披露,致谢中提及设备支持方 Zhejiang Cachet Jetboom Medical Devices CO., LTD。数字化参数:A/D 32-bit 分辨率、4.88 µV/bit、幅值范围 −32,768 至 32,767 µV、500 Hz 采样、10 秒记录(PhysioNet 官方页)。导出链路:GE MUSE → GE 私有命名规则 XML → ECGConverter(开源,参考 van Ettinger C# ECG Toolkit)→ CSV → WFDB(扩展版)。
对设备敏感型研究的提示:MUSE 是存储与判读工作站而非采集前端,同一 MUSE 系统可接入多型号心电图机,论文未按机型分层数据——这意味着"设备效应"在本库内不可控也无法度量。若你的方法对采集设备敏感(如高频 QRS 分析),应把这一不可控性写进 limitations。
§3.10 深度溯源链
受试者(绍兴/宁波医院就诊人群)
└─ 12 导联静息 ECG 检查(10 s,500 Hz)→ GE MUSE 系统存储
└─ 持证医师标注 Rhythm + 附加状况 → 第二医师复核 → 资深医师终裁
└─ GE MUSE 导出(GE 私有编码 XML)
└─ ECGConverter(开源)→ CSV(µV,5,000×12)+ Diagnostics.xlsx
├─ figshare 首发版(2019,v2)+ ECGDenoisingTool 降噪副本
└─ WFDB 转换 → PhysioNet ecg-arrhythmia v1.0.0(2022,45,152 例,SNOMED CT)
溯源链的每一环都有对应的开源实现或论文段落:GE XML 解析见 ECGConverter 源码,医师标注协议见 PhysioNet 官方页 Methods,降噪三级流水线见 ECGDenoisingTool 与论文 Methods——审计任何一环都不需要联系作者。
§4 数据结构
§4.0 目录树
figshare 首发版解压后(四部分 / 六文件):
chapman-shaoxing/
├── ECGData/ # 原始信号:每患者一个 CSV(µV)
│ ├── MUSE_20180111_120326_00001.csv # 5,000 行 × 12 列,首行为导联名
│ ├── MUSE_20180111_120351_00002.csv
│ └── ...(共 10,646 个文件)
├── ECGDataDenoised/ # 官方降噪版:与 ECGData 同名一一对应
│ ├── MUSE_20180111_120326_00001.csv
│ └── ...(共 10,646 个文件)
├── Diagnostics.xlsx # 标注主表:一行一患者(10,646 行 × 16 列)
└── AttributesDictionary.xlsx # 附加状况字典:56 个缩写的中英文名
树形图中的三处工程要点:文件名即主键(MUSE_日期_时间_序号),字符串排序近似等于采集顺序但官方未确认该语义;Denoised 与 Raw 同名但内容不同,Python 中容易因相对路径写错而静默混用;Diagnostics.xlsx 为 xlsx 格式,读取依赖 openpyxl,将其转为 CSV/Parquet 存入数据版本控制是一次性值得做的动作。
PhysioNet 扩展版解压后:
ecg-arrhythmia/1.0.0/
├── WFDBRecords/ # 两级数字文件夹索引(46×10)
│ ├── 01/
│ │ └── 0101/
│ │ ├── JS00001.mat # MATLAB v4 信号(12 导联 × 5,000 采样)
│ │ ├── JS00001.hea # 头文件:#Age/#Sex/#Dx(SNOMED CT 逗号分隔)
│ │ └── ...
│ └── ...(共 45,152 对 .mat/.hea)
├── ConditionNames_SNOMED-CT.csv # 缩写 → SNOMED CT 映射表
└── LICENSE.txt # CC BY 4.0
§4.1 DAIMS 字段字典(Diagnostics.xlsx 核心表)
下表覆盖 Diagnostics.xlsx 全部 16 列中的核心部分,按"主键 → 标签 → 人口学 → 机器测量"的业务顺序排列。"观测误差/陷阱"列是该字段在实际使用中已报告的问题,"信息性缺失编码"列说明该字段为空时的语义。
| 字段名 | 类型 | 说明 | 示例值 | AI 用途 | 观测误差/陷阱 | 信息性缺失编码 | 取值范围 |
|---|---|---|---|---|---|---|---|
| FileName | text | 患者 ECG 文件名(全局唯一主键,与 CSV 文件名一致) | MUSE_20180111_120326_00001 | 关联信号与标签 | 无 | 无 | 10,646 个唯一值 |
| Rhythm | text | 主节律标签(11 类,单标签) | AFIB | 分类目标 | 论文个别表格计数排版错误(见坑点 3) | 无 | SB/SR/AFIB/ST/SVT/AF/SI/AT/AVNRT/AVRT/SAAWR |
| Beat | text | 附加状况多标签,空格分隔(56 缩写) | 1AVB LVHV | 多标签任务 | 作用于整条而非具体心搏;解析陷阱见坑点 8 | NONE = 无附加状况 | 57 码组合,均值 0.84 码/条 |
| PatientAge | int | 年龄(岁) | 73 | 人口学偏倚分析、特征 | Challenge 重分发中 89 岁以上编码为 92 | 无 | 4-98 |
| Gender | text | 性别 | MALE | 公平性分析 | 女性拼写为 “FEMAL”(原文 sic) | 无 | MALE / FEMAL |
| VentricularRate | int | MUSE 自动心室率(bpm) | 47 | 心率相关特征 | 机器自动测量,非人工复核(坑点 8) | 无 | 约 20-250 |
| AtrialRate | int | MUSE 自动心房率(bpm) | 300 | 房扑/房颤鉴别特征 | AF 时值不可靠 | 无 | 约 40-350 |
| QRSDuration | int | QRS 波时限(ms) | 96 | 束支阻滞特征 | 机器测量 | 无 | 约 40-300 |
| QTInterval | int | QT 间期(ms) | 426 | 复极特征 | 机器测量 | 无 | 约 200-700 |
| QTCorrected | int | Bazett 校正 QT(ms) | 454 | 长 QT 筛查特征 | AF/房颤心律下 Bazett 校正失真(坑点 8) | 无 | 约 250-700 |
| RAxis | int | R 波电轴(度) | −25 | 电轴偏转特征 | 无 | 无 | −179 至 180 |
| TAxis | int | T 波电轴(度) | 47 | 复极方向特征 | 无 | 无 | −179 至 181 |
| QRSCount | int | 条带内 QRS 计数 | 8 | 节律稳定性特征 | 无 | 无 | 约 3-30 |
| QOnset / QOffset / TOffset | int | QRS 起止与 T 波终点索引(采样点) | 2520 | 形态学分段 | 机器测量 | 无 | 0-4,999 |
字段字典使用注意:① FileName 是连接信号文件与标注行的唯一主键,任何合并操作前先断言其唯一性;② VentricularRate/AtrialRate 等机器测量在异常节律下的语义会漂移(如房颤时"心房率"由算法估算),把它们当特征可以、当回归目标需要按节律分层(坑点 8);③ QOnset/QOffset/TOffset 是采样点索引(500 Hz 下 1 ms = 0.5 点),与 5,000 点信号数组直接下标对应,可用于从原始信号裁剪形态学片段。
§4.2 标签分布
三张分布表依次给出:figshare 版 11 类(与论文对齐的权威口径)、官方 4 类合并(与论文基线可比的口径)、扩展版主节律(PhysioNet 生态口径)。三表不可混用。
figshare 版 11 类节律分布(论文 Table 2 口径,与 ECGBench 从 Diagnostics.xlsx 重算一致,合计 10,646):
| 代码 | 心律 | n | 占比 | 年龄 Mean±SD | 男性 n |
|---|---|---|---|---|---|
| SB | 窦性心动过缓 | 3,889 | 36.53% | 58.34±13.95 | 2,481 |
| SR | 窦性心律 | 1,826 | 17.15% | 54.35±16.33 | 1,024 |
| AFIB | 心房颤动 | 1,780 | 16.72% | 73.36±11.14 | 1,041 |
| ST | 窦性心动过速 | 1,568 | 14.73% | 54.57±21.06 | 799 |
| SVT | 室上性心动过速 | 587 | 5.51% | 55.62±18.53 | 308 |
| AF | 心房扑动 | 445 | 4.18% | 71.07±13.5 | 257 |
| SI | 窦性心律不齐 | 399 | 3.75% | 34.75±23.03 | 223 |
| AT | 房性心动过速 | 121 | 1.14% | 65.72±19.3 | 64 |
| AVNRT | 房室结折返性心动过速 | 16 | 0.15% | 57.88±17.34 | 12 |
| AVRT | 房室折返性心动过速 | 8 | 0.07% | 57.5±16.84 | 5 |
| SAAWR | 窦房至房游走心律 | 7 | 0.07% | 51.14±31.83 | 6 |
官方 4 类合并方案(医生建议,论文 Table 5 口径,计数已按 Table 2 修正):AFIB 组 = AFIB + AF = 2,225;GSVT 组 = SVT + AT + SAAWR + ST + AVNRT + AVRT = 2,307;SB 组 = 3,889;SR 组 = SR + SI = 2,225。
PhysioNet 扩展版主节律分布(ECGBench 重算,按首列 #Dx):SB 15,807 / SR 7,882 / AF 5,609 / ST 5,383 / AFIB 1,779 / SA(窦性心律不齐)1,294 / APB 975 / 其余 71 个主诊断合计 6,423。
两个版本分布对比的一处警示:figshare 版中 AFIB(1,780)多于 AF(445),而 PhysioNet 扩展版主诊断中 AF(5,609)远多于 AFIB(1,779)——两版的主标签判定与队列构成不同,任何"合并两版数据"的做法都会引入不可控的标签口径冲突,这也是 §6.5 坑点 1 强调锁定单一渠道的又一依据。
§4.3 关键统计
除标签分布外的核心数字在此汇总,供引用与容量规划快速取用;每条带来源,快照日期为 2026-09。
- 信号:每条 5,000 采样点 × 12 导联,微伏整数存储;A/D 精度 4.88 µV/bit。
- Beat 附加状况:均值 0.84 码/条;5,419 条记录为 NONE(无附加状况)——Rhythm 与 Beat 是两个独立量纲,不能相加(ECGBench 数据卡)。
- 人口学:年龄 51.19 ± 18.03(4-98 岁),高发段 51-60 岁(19.82%)、61-70 岁(24.38%)、71-80 岁(16.90%)。
- 质量审计(社区):ECGBench 标记 figshare 版 38 条幅值离群 + 49 条平导联问题(clean 版 10,607 条,通过率 99.6%);PhysioNet 版排除 2,243 条(多为完全平导联,通过率 95.0%)。
统计数据的另一面值得注意:扩展版 95.0% 的通过率意味着约每 20 条就有 1 条被社区审计剔除,而官方从未发布过任何质量指标——把这两个数字并置,就能理解为什么本页在 §6.3 把质量筛查放在预处理流程第一步:这不是防御性编程,而是该数据集使用中的必要环节。
§4.4 数据层级
患者(10,646 名,一人一条,无重复受检)
└─ 记录(10 秒 12 导联静息 ECG,FileName 全局唯一)
├─ 信号(12 列导联 × 5,000 采样点)
└─ 标注(Rhythm 单标签 + Beat 多标签 + 11 项自动测量 + 年龄/性别)
一人一条的设计意味着:患者级分组防泄漏(GroupKFold)天然满足,普通分层划分即可;但代价是无法研究同一患者的节律演变。
这一层级设计对任务选择的直接影响:可以做"记录 → 标签"的判别式任务(分类、多标签、检索),不适合做"患者 → 轨迹"的纵向任务(节律演变、复发预测);若研究需要纵向维度,应转用 MIMIC-IV-ECG(同一患者多次检查)或 Holter 数据。
§4.5 缺失值与信息性缺失编码
| 现象 | 编码形式 | 正确解读 |
|---|---|---|
| 无附加心脏状况 | Beat 列字符串 “NONE” | 哨兵值而非 56 种状况之一,解析时必须显式剔除 |
| 罕见节律导致折内缺类 | StratifiedKFold 警告 | SAAWR 仅 7 条 < 10 折,无法出现在每一折(数据性质,非切分故障) |
| 附加状况计数口径 | Abstract 写 67 种 / Background 写 56 种 | Online-only Table 1 实际 56 缩写;ECGBench 在 Beat 列实测 57 个代码,以数据文件为准 |
| 平导联/幅值离群记录 | 无官方标志位 | 需自行质量检查(§6.3 步骤 2),ECGBench 审计数字见 §4.3 |
本库缺失信息的总体哲学是"哨兵显式、质量沉默":标签层面该空的空(NONE 哨兵清晰),信号层面该说的不说(无质量标志、无采集时间、无机型分层)。这意味着你的数据字典必须比官方文档更厚——把 §4.5 的每行解读固化为你仓库里的 schema 文档,是团队协作中防止误解的第一道防线。
§5 划分与使用建议
本节的四个判断先说在前面:本库没有官方划分文件(§5.1)、一人一条使患者级泄漏天然免疫、社区已收敛出可比的划分惯例(§5.2)、跨库使用前的防泄漏检查不是可选项(§5.5)。这四点共同决定了一个原则——在本库上,"如何切数据"比"用什么模型"更影响结论的可信度。
§5.1 官方划分
官方论文未发布固定 train/test 划分文件,而是报告"80/20 划分(8,517/2,129)+ 10 折交叉验证"的 XGBoost 基线(4 类任务,macro-F1 0.965)。复现该基线时需自行实现 80/20 + 10 折 CV,论文未明确说明是否分层抽样。
复现建议:由于论文未公开折划分,严格意义上只能复现"协议"而非"数字"。实用的做法是以官方 macro-F1 0.965 为中心,将你自己 10 个随机种子下的结果区间报告为 ±波动范围,只要你的区间覆盖或接近 0.965,即可认为复现成功;逐位对齐既有文献数字既不可能也无必要。
§5.2 社区惯例划分
社区实践已形成三种口径,按任务形态选择:
- 4 类任务:按官方合并(AFIB 2,225 / GSVT 2,307 / SB 3,889 / SR 2,225)做 10 折分层 CV,与论文可比。
- 11 类任务:ECGBench 提供按主节律分层的确定性 10 折划分 CSV(SAAWR 类触发 StratifiedKFold 警告属预期行为)。
- 多标签任务(扩展版):按首列 #Dx(主节律 SNOMED 码)分层;ECGBench 对 45,152 条提供 clean 版(42,909 条)划分。
选择社区惯例而非自创划分的理由是可比性:ECGBench 的确定性折划分已带固定种子并在数据卡中公开,采用它可以让你与该评测框架覆盖的所有后续工作直接对表;自创划分只在你明确声明"本文协议,不可与既有文献直比"时才有意义。
§5.3 泄漏风险 ⭐
本库一人一条,患者级泄漏天然免疫——这是相对 Holter 数据库(MIT-BIH 需按录音分组)的结构性优势。真实泄漏风险全部来自数据复用层面:
- figshare 10,646 例 ⊂ PhysioNet 45,152 例:绍兴队列在两个渠道完全重叠,训练集与测试集分属两个渠道即构成同记录泄漏。
- CinC 2021 训练集含全部本库数据(chapman-shaoxing 10,247 + ningbo 34,905):用本库训练后再用 Challenge 数据"外部验证"不是外部验证。
- ECGData 与 ECGDataDenoised 同源重复:把两个目录拼接当独立样本,等于近重复数据膨胀训练集。
- 扩展版与 Challenge 2020 G12EC 等混合库:若模型在 Challenge 训练数据上预训练过,再在本库上报告成绩需明确声明。
防泄漏操作清单(任何跨库实验前逐项打勾):列出全部数据来源渠道 → 记录级 ID 归一化(figshare FileName vs JS 编号 vs Challenge 文件路径)→ 计算两两交集并归档 → 训练/测试划分只在"交集归零"的集合间进行 → 划分脚本与交集报告一并提交代码仓库。整个清单不超过 50 行代码,但缺任何一步都可能让一篇论文的结论作废。
§5.4 交叉验证建议
- 用
StratifiedKFold(n_splits=10, shuffle=True, random_state=固定);对 11 类任务接受 SAAWR 折内缺席的警告,或改用 5 折。 - 报告 macro-F1 与 per-class F1,并始终报告混淆矩阵(官方五步工作流要求:F1、Overall Accuracy、Confusion Matrix、Precision、Recall)。
- 任何与本库组合的混合训练(PTB-XL/CPSC/INCART)必须先统一采样率(见坑点 2)。
折间稳定性检查:对 10 折逐折 macro-F1 计算标准差,超过 0.02 通常意味着罕见类在折间分布不稳定或存在阈值敏感——此时优先改协议(5 折/分层细化),而不是只报均值掩盖波动。
§5.5 外部验证建议
合法的外部验证集:PTB-XL(德国人群,SCP-ECG 标签映射后)、CPSC 2018(需处理时长可变)、Georgia 12-lead(美国东南部,SNOMED 标签)。跨库评测必须先解决标签体系映射(坑点 6),并报告映射损失;LuminaECG 的跨库实验(Chapman 上 macro-F1 0.644)展示了跨库性能的量级塌缩,可作为预期基线(arXiv:2608.09053)。
外部验证的实施顺序与 §7.3 的三级迁移一致,但有一个本库特有的前置步骤:确认目标库不在 figshare/PhysioNet/CinC 2021 的任何成员关系里(§5.3 清单)。一个实用的自检问题是——"如果审稿人拿两张记录的原始文件让我证明训练集和外部集没有同一条记录,我拿得出来吗?"拿不出来就先补数据血缘审计。
§6 AI 就绪指南 ⭐
§6.0 云端快速启动
- Kaggle:搜索 “Chapman-Shaoxing / ECG arrhythmia” 相关数据集镜像(多版本并存,注意核对条数是 10,646 还是 45,152)。Kaggle 适合快速原型:免费 GPU、数据已就近挂载,但镜像版本不保证与官方一致,正式实验请回落官方渠道。
- HuggingFace:ECGBench 提供 chapman_shaoxing(figshare 版)与 ecg_arrhythmia(PhysioNet 版)两个 config,含确定性折划分。注意折划分 CSV 在 Hub 上,信号本体(PhysioNet 路径)需要自行下载。
- PhysioNet:官方渠道,WFDB 版本可直接用
wfdb包流式读取;浏览器可在线预览单条记录波形,适合先看数据再下载。
三条渠道的版本核对口诀:下载完成后先跑"两数一表"——记录总数(10,646 / 45,152 / 10,247+34,905)、采样率(.hea 第一行或 CSV 行数换算)、标签表列名(Rhythm+Beat vs #Dx),三者与 §3.2/§3.3 对不上就说明拿错了版本。
§6.1 快速上手
目录结构预期与 data_root 拼接关系(figshare 版):代码假定 data_root 指向解压后的目录,其下直接是 ECGData/、Diagnostics.xlsx 等;最小可用子集 = Diagnostics.xlsx(标注)+ ECGData 内任意一个 CSV(信号)。
import pandas as pd, numpy as np, os
DATA_ROOT = "/data/chapman-shaoxing" # 解压后的目录
# DATA_ROOT/
# ├── ECGData/ <- 每患者一个 CSV(5,000 行 × 12 列,单位 µV)
# ├── ECGDataDenoised/ <- 官方降噪版(同名文件,训练前二选一,勿混用)
# ├── Diagnostics.xlsx <- 标注主表(一行一患者,16 列)
# └── AttributesDictionary.xlsx
diag = pd.read_excel(os.path.join(DATA_ROOT, "Diagnostics.xlsx"))
print(diag["Rhythm"].value_counts()) # 11 类分布,应与 §4.2 表一致
# 读一条信号:data_root + ECGData + FileName
fn = diag.loc[0, "FileName"] # 如 MUSE_20180111_120326_00001
sig = pd.read_csv(os.path.join(DATA_ROOT, "ECGData", f"{fn}.csv"))
print(sig.shape) # (5000, 12),列名即导联名
print(sig.iloc[:3, :4]) # µV 整数 → 分析前 /1000 转 mV
WFDB 版(PhysioNet 扩展版)等价操作,标签需从 .hea 头文件解析:
import wfdb, os, glob
WFDB_ROOT = "/data/ecg-arrhythmia/1.0.0/WFDBRecords"
# WFDBRecords/01/0101/JS00001.{mat,hea}:拼接关系 = 两级数字文件夹 + 记录名
record = wfdb.rdrecord(os.path.join(WFDB_ROOT, "01", "0101", "JS00001"))
print(record.p_signal.shape) # (5000, 12),单位 mV(wfdb 已换算)
print(record.comments) # ['#Age: 70', '#Sex: Male', '#Dx: 164889003', ...]
# 主节律 = #Dx 第一个 SNOMED 码(ECGBench 的分层约定)
dx = next(c.split(": ")[1] for c in record.comments if c.startswith("#Dx"))
print(dx.split(",")[0]) # '164889003' → 查 ConditionNames_SNOMED-CT.csv
§6.2 数据获取
三渠道均无需注册或协议签署,差异在格式与子集口径——先按 §3.0 选定渠道,再按下表执行。
| 渠道 | 方式 | 大小 | 要求 |
|---|---|---|---|
| figshare 首发版 | 集合页 手动下载六文件 | 约 2.8 GB | 无(CC BY 4.0) |
| PhysioNet 扩展版 | 内容页 Files 区下载 zip | 2.3 GB(zip) | 无(开放下载;批量下载建议用官方 wget 脚本) |
| CinC 2021 训练包 | Challenge 2021 training 文件夹 | 子集 10,247 + 34,905 条 | 无(若参赛需遵守 Challenge 规则) |
# PhysioNet 批量下载(官方推荐方式)
wget -r -N -c -np https://physionet.org/files/ecg-arrhythmia/1.0.0/
figshare 版没有官方一键脚本,六个文件需从集合页逐一下载后解压到同一目录;下载完成后先校验 Diagnostics.xlsx 行数是否为 10,646(不含表头),并抽查一个 CSV 是否为 5,000 行——这两个数字是文件完整性的最低哨兵。
| figshare 文件 | 内容 | 校验要点 |
|---|---|---|
| ECGData.zip(分卷) | 10,646 个原始信号 CSV | 解压后文件数 = 10,646;任一文件 5,000 行 |
| ECGDataDenoised.zip(分卷) | 同名降噪信号 CSV | 与 ECGData 文件名逐一对应 |
| Diagnostics.xlsx | 标注主表 16 列 | 数据行 10,646;Rhythm 值域 11 类 |
| AttributesDictionary.xlsx | 56 个附加状况缩写 | 行数应为 56 |
# 环境准备(Python 3.10+)
pip install pandas numpy scipy openpyxl torch scikit-learn wfdb
§6.3 预处理全流程
全流程五步总览:读取与单位统一 → 质量筛查 → 带通滤波 → 标准化 → 标签编码。顺序不可调换:质量筛查必须在任何滤波之前(否则坏记录的伪迹会被滤波器"整形"成看似正常的信号而漏检),标准化统计量必须只来自训练集折(否则构成轻微的跨折信息泄漏)。
import numpy as np, pandas as pd
from scipy.signal import butter, filtfilt
# ---- 步骤 1:读取与单位统一(µV -> mV,与多数文献/PTB-XL 对齐) ----
def load_record(data_root: str, filename: str) -> np.ndarray:
"""读取单条 ECG,返回 (12, 5000) float32,单位 mV,导联顺序 CSV 表头序。"""
df = pd.read_csv(f"{data_root}/ECGData/{filename}.csv")
return df.to_numpy(dtype=np.float32).T / 1000.0 # (12, 5000) mV
# ---- 步骤 2:质量筛查(官方无质量标志位,必须自检) ----
def quality_screen(x: np.ndarray) -> list[str]:
"""返回质量问题列表;任一命中即建议人工复核或剔除。"""
issues = []
if np.any(np.abs(x).max(axis=1) >= 32.0): # 贴近 ±32,767 µV 截幅
issues.append("clipping")
flat = np.ptp(x, axis=1) < 0.01 # 任一导联峰峰值 < 10 µV
if flat.any():
issues.append(f"flat_lead:{np.where(flat)[0].tolist()}")
if np.any(np.abs(x).max(axis=1) > 20.0): # mV 级巨幅,疑电极故障
issues.append("amplitude_outlier")
return issues
# ---- 步骤 3:带通滤波(0.5-40 Hz,零相位;诊断频带内勿用官方 50 Hz 低通以外的激进设置) ----
def bandpass(x: np.ndarray, fs: float = 500.0, lo: float = 0.5, hi: float = 40.0) -> np.ndarray:
b, a = butter(4, [lo / (fs / 2), hi / (fs / 2)], btype="band")
return filtfilt(b, a, x, axis=1).astype(np.float32)
# ---- 步骤 4:逐导联 z-score 标准化(仅训练用统计量) ----
def normalize(x: np.ndarray, mean=None, std=None) -> np.ndarray:
mean = x.mean(axis=1, keepdims=True) if mean is None else mean
std = x.std(axis=1, keepdims=True) if std is None else std
return ((x - mean) / (std + 1e-8)).astype(np.float32)
# ---- 步骤 5:标签编码(4 类官方合并方案) ----
MERGE_4 = {"AFIB": "AFIB", "AF": "AFIB",
"SVT": "GSVT", "AT": "GSVT", "SAAWR": "GSVT", "ST": "GSVT",
"AVNRT": "GSVT", "AVRT": "GSVT",
"SB": "SB", "SR": "SR", "SI": "SR"}
def encode_rhythm(rhythm_series: pd.Series) -> np.ndarray:
return rhythm_series.map(MERGE_4).to_numpy()
要点:微伏转毫伏发生在读取层(坑点 8);质量筛查必须先于滤波(平导联会被滤波器"造"出伪信号);Denoised 目录与 Raw 目录二选一,禁止拼接(坑点 1)。
流程背后的三原则,供扩展你自己流水线时参考:先质检后变换(质量信号会被滤波破坏,坏记录必须最先识别);统计量只来自训练集(步骤 4 的 mean/std 若用全库计算即构成轻微信息泄漏,交叉验证时必须按折重算);标签变换与模型绑定(4 类合并方案要作为常量放进模型仓库,而不是散落在 notebook 里,否则跨实验口径漂移不可避免)。
§6.4 PyTorch DataLoader(完整可运行)
以下 Dataset 类覆盖"读取 → 单位换算 → 划分 → 批加载"完整链路,目录结构预期见 §6.1 注释,最小可用子集为 Diagnostics.xlsx + ECGData 目录;<details> 折叠以控制页面长度。
<details>
<summary>点击展开完整 Dataset 类代码(约 70 行)</summary>
import os
import numpy as np
import pandas as pd
import torch
from torch.utils.data import Dataset, DataLoader
from sklearn.model_selection import train_test_split
class ChapmanShaoxingDataset(Dataset):
"""figshare 版 Chapman-Shaoxing:目录结构见 §6.1 注释。
data_root 与文件名的拼接关系:{data_root}/ECGData/{FileName}.csv
labels=True 时返回 4 类合并标签;最小可用子集 = Diagnostics.xlsx + ECGData 下的 CSV。
"""
MERGE_4 = {"AFIB": 0, "AF": 0, # AFIB 组
"SVT": 1, "AT": 1, "SAAWR": 1, "ST": 1, "AVNRT": 1, "AVRT": 1, # GSVT 组
"SB": 2, # SB 组
"SR": 3, "SI": 3} # SR 组
CLASSES = ("AFIB", "GSVT", "SB", "SR")
def __init__(self, data_root: str, indices: np.ndarray | None = None,
labels: bool = True, transform=None):
self.data_root = data_root
self.transform = transform
self.labels = labels
self.diag = pd.read_excel(os.path.join(data_root, "Diagnostics.xlsx"))
if indices is not None:
self.diag = self.diag.iloc[indices].reset_index(drop=True)
if labels:
missing = set(self.diag["Rhythm"]) - set(self.MERGE_4)
assert not missing, f"未映射节律: {missing}"
def __len__(self):
return len(self.diag)
def __getitem__(self, idx):
row = self.diag.iloc[idx]
df = pd.read_csv(os.path.join(self.data_root, "ECGData", f"{row['FileName']}.csv"))
x = torch.from_numpy(df.to_numpy(dtype=np.float32).T / 1000.0) # (12, 5000) mV
if self.transform is not None:
x = self.transform(x)
if not self.labels:
return x
y = torch.tensor(self.MERGE_4[row["Rhythm"]], dtype=torch.long)
return x, y
# ---- 划分:一人一条,普通分层划分即可(无患者级泄漏);固定随机种子保证可复现 ----
diag = pd.read_excel("/data/chapman-shaoxing/Diagnostics.xlsx")
train_idx, test_idx = train_test_split(
np.arange(len(diag)), test_size=0.2, random_state=42,
stratify=diag["Rhythm"]) # 按原始 11 类分层更稳
train_ds = ChapmanShaoxingDataset("/data/chapman-shaoxing", train_idx, labels=True)
test_ds = ChapmanShaoxingDataset("/data/chapman-shaoxing", test_idx, labels=True)
train_loader = DataLoader(train_ds, batch_size=64, shuffle=True, num_workers=4, pin_memory=True)
test_loader = DataLoader(test_ds, batch_size=128, shuffle=False, num_workers=4, pin_memory=True)
for x, y in train_loader: # 冒烟测试
print(x.shape, y.shape, train_ds.CLASSES) # (64, 12, 5000) (64,)
break
</details>
代码设计说明:① stratify=diag["Rhythm"] 按原始 11 类分层,保证罕见类在训练/测试两端都有代表,比按 4 类分层更保守;② CSV 逐条读取在首轮训练后会受文件系统缓存加速,正式训练建议把全库预处理为单个 .npz(约 2.5 GB mV float32);③ 若改用 PhysioNet 版,把读取函数替换为 wfdb.rdsamp 并从 .hea 解析 #Dx 标签即可,Dataset 接口不变。
§6.5 坑点 8 个
以下 8 个坑点全部来自官方文档、社区审计与已发表论文的 limitation 记录,按"影响面 × 触发频率"排序。每个坑点给出三层解法(简单/进阶/SOTA),至少实现"简单"层是使用本库的底线;前 3 个坑点(渠道重叠、采样率混合、类别不平衡)属于"触发即毁实验"级别,建议把对应的检查固化进代码评审清单。
⚠️ 坑点 1:双发布渠道子集重叠 + Raw/Denoised 双目录同源重复(分类:数据泄漏)
问题:figshare 10,646 例与 PhysioNet 45,152 例中的绍兴队列(JS00001-JS10646)是同一批记录;CinC 2021 训练集又完整收录本库(chapman-shaoxing 10,247 + ningbo 34,905)。同时 figshare 版内部 ECGData 与 ECGDataDenoised 是一一对应的同源副本。跨渠道混用或双目录拼接都会造成训练/测试集同记录泄漏。
症状:跨渠道组合数据后指标"好得不像话";或拼接双目录后训练集翻倍但验证分数虚高,独立测试集上回撤明显。
解决:
- 简单方法:整个研究锁定一个渠道;以 FileName/JS 编号建立全局记录 ID,任何合并前做集合交检查(
set_a & set_b必须为空)。- 进阶方法:确需多渠道时按渠道分层划分——训练/测试内各自封闭,测试集只含与训练集不同渠道的记录,并在论文中声明渠道构成。
- SOTA 方法:对声称的"外部验证"做数据血缘审计:列出测试集每条记录的采集医院与首次发布渠道,排除 Challenge 2021 训练集成员(该 Challenge 已公开训练清单)。
参考:PhysioNet ecg-arrhythmia 官方页;Challenge 2021 官方数据说明;ECGBench 数据卡(明确声明两 config 为不同数据集)。
⚠️ 坑点 2:混合训练包中的采样率混合——500 Hz 与 257 Hz 共存(分类:预处理陷阱)
问题:Chapman-Shaoxing 本身恒为 500 Hz,但研究者常把它与 CinC 2021 其他数据源混合使用:INCART 为 257 Hz、PTB/PTB-XL 为 500 或 1,000 Hz、UMich 为 250 或 500 Hz。按固定采样率换算时间轴会把不同源的波形长度与心率算错。
症状:混合库里同一"10 秒"张量实际时长不同;R 波间距统计异常;以固定窗长切割后不同库的心搏数对不上。
解决:
- 简单方法:读取每个 .hea 头文件中声明的采样频率(第 1 行末列),非 500 Hz 记录用
scipy.signal.resample_poly统一到 500 Hz。- 进阶方法:重采样前先按
(fs, lead_count)分组核查;Challenge 官方 WFDB 头示例中 500 Hz 记录含 7,500 点(PTB 系 1,000 Hz),据此可自动识别源库。- SOTA 方法:把采样率作为元数据列保存进 Dataset,DataLoader 内做按记录自适应重采样;训练日志中报告重采样记录占比。
参考:Challenge 2021 官方数据页(逐库采样率);Self-DANA 附录(跨库统一 500 Hz 预处理实践)。
⚠️ 坑点 3:11 类标签极端不平衡(SAAWR 只有 7 例)(分类:标签理解)
问题:最常见类 SB 3,889 例与最罕见类 SAAWR 7 例相差 555 倍;AVRT 8 例、AVNRT 16 例。直接训练 11 类分类器,罕见类召回率趋近 0,而 overall accuracy 仍可高达 95%+。
症状:StratifiedKFold 报"最少类成员数小于折数"警告;SAAWR/AVRT/AVNRT 的 F1 在不同折间剧烈波动甚至为 0;accuracy 与 macro-F1 差距巨大。
解决:
- 简单方法:采用官方 4 类合并方案(AFIB 2,225 / GSVT 2,307 / SB 3,889 / SR 2,225),与文献直接可比。
- 进阶方法:坚持 11 类时用加权损失(
class_weight ∝ 1/log(1.02 + n_c))+ 5 折(而非 10 折)分层 CV,并把每类 F1 单独列报告。- SOTA 方法:罕见三类(AT/AVNRT/AVRT/SAAWR)改用"检测 + 二级精分"级联:先做"是否罕见室上性心动过速"的检测器,再在少量样本上精分并明确标注置信区间。
参考:论文 Table 2/Table 5;ECGBench 数据卡(SAAWR=7 折警告)。
⚠️ 坑点 4:条级标签 ≠ 逐搏标注,且体表 ECG 无法定位腔内起源(分类:标签理解)
问题:Rhythm 是整条 10 秒记录的单标签,Beat 附加状况官方明确"作用于整条记录而非特定心搏"。因此本库不能训练心搏级定位(如第 N 个 QRS 是 PVC);同时 AVNRT 与 AVRT 的机制鉴别金标准是腔内电生理检查,体表 12 导联判读存在机制混淆的固有上限。
症状:尝试做 beat-level 任务后发现标签无法对齐到具体心搏;AVNRT/AVRT 类样本的模型输出与电生理随访结论冲突;10 秒窗内未发作的阵发性心律失常被条级标签"隐藏"。
解决:
- 简单方法:把任务严格限定为条级分类;需要逐搏标注时改用 MIT-BIH Arrhythmia(48 条 Holter 逐搏标注)。
- 进阶方法:接受"标签是医师对整条记录的主导节律判读"这一语义,用注意力/显著性图做模型解释时明确输出的是"支持该条级判读的形态区域"而非病灶定位。
- SOTA 方法:将 AVNRT/AVRT 等机制类标签视为弱标签,在论文中报告"标签语义上限",或与含电生理随访的数据联合使用。
参考:PhysioNet 官方页(“applied to the entire sample rather than to specified beats”)。
⚠️ 坑点 5:原始信号未清洗、无质量标志位,Denoised 版有过度平滑风险(分类:预处理陷阱)
问题:官方不提供逐条质量评分与伪差标注。社区审计(ECGBench)在 figshare 版发现 38 条幅值离群 + 49 条平导联问题(clean 版 10,607/10,646),PhysioNet 版有 2,243 条被判定多为完全平导联(clean 版 42,909/45,152,通过率 95.0%)。而官方 Denoised 版经 Butterworth(通带 50 Hz)+ LOESS + NLM 三级处理,可能抹掉细微但具诊断价值的低幅形态(小 Q 波、 epsilon 波、低幅 T 改变)。
症状:训练 loss 被少量坏记录主导;可视化时发现"心电图为一条直线"或饱和方波;用 Denoised 版训练的模型对细微形态学类别(如 1AVB 的 P-R 判断)表现系统性偏差。
解决:
- 简单方法:入库先跑质量筛查(§6.3 步骤 2:平导联/截幅/巨幅三查),坏记录剔除并在论文报告剔除率。
- 进阶方法:Raw 与 Denoised 各训练一版对照,若性能差 > 1 个点,检查是否损失了形态学信息;将 Denoised 仅用于可视化与教学。
- SOTA 方法:质量筛查结果作为元数据保留,训练时对"可疑"记录降采样权重;或引入信号质量评估(SQI)模型做前端过滤。
参考:ECGBench figshare 版审计;ECGBench PhysioNet 版审计;ECGDenoisingTool。
⚠️ 坑点 6:三套标签体系跨库不一致,跨库评测必须先映射(分类:评估误用)
问题:figshare 版用自编缩写(SB/SI/ST/AFIB…11 类 + 56 附加缩写),PhysioNet 版用 SNOMED CT 多标签(60+ 状况),而 PTB-XL 用 SCP-ECG 编码体系、CPSC 用另一套自编诊断。三套体系粒度不同(例如 RBBB 的完全/不完全型在 CPSC 合并为 supertype、在部分体系分开;Chapman 的 SI 窦性心律不齐在 PTB-XL 无精确对应类)。跨库直接比较或硬训练会引入系统性标签噪声。
症状:跨库微调后某些类 F1 莫名下降;把 Chapman 的 11 类硬映射到 PTB-XL 五大类时出现一对多/多对一冲突;不同论文"同一模型"跨库成绩不可比。
解决:
- 简单方法:只映射有明确等价关系的码(AFIB↔164889003↔SCP 的 AFIB),无法等价的类设为"不评测",并报告每库的类覆盖率。
- 进阶方法:采用社区已有的六类重映射(NORM/CD/HYP/MI/STTC/AFib-Aflutter),把映射表随代码发布,保证可复现。
- SOTA 方法:把标签映射建模为有损变换,在结果表中同时报告"映射后类空间"与"原始类空间"两套指标;或用标签嵌入(label embedding)学习跨体系对齐。
参考:ConditionNames_SNOMED-CT.csv(PhysioNet 官方映射);社区跨库重映射实践。
⚠️ 坑点 7:单地域人群偏倚——绍兴(+宁波)队列不能代表目标人群(分类:偏倚陷阱)
问题:全部记录来自中国浙江两城医院就诊人群:年龄 51.19 ± 18.03(61-70 岁占 24.38%),男性 55.95%,83% 至少一种异常;窦缓占 36.53% 远高于一般人群。设备链路(GE MUSE)与导联放置习惯也与欧美机构不同。在本库上训练的模型直接部署到其他人群/设备,性能无保障。
症状:模型在 PTB-XL/Georgia 上 macro-F1 大幅塌缩(文献报道从库内 0.96 级跌到跨库 0.64 级甚至更低);对年轻患者与罕见节律表现差;不同设备采集的数据置信度校准漂移。
解决:
- 简单方法:部署前必做外部验证(PTB-XL/CPSC/Georgia 任选),报告按年龄/性别分组的分层性能。
- 进阶方法:跨库训练时做域适应(DANN/Correlation Alignment)或按来源库加域标记,监控域间特征漂移。
- SOTA 方法:构建多库联合训练 + 留一库外测协议,把"跨地域泛化差距"作为模型卡片的固定报告项。
参考:论文人口统计学;LuminaECG 跨库实验(Chapman macro-F1 0.644)。
⚠️ 坑点 8:工程杂症——微伏单位、±32,767 截幅、FEMAL 拼写、NONE 哨兵与 MUSE 自动测量的信任边界(分类:工程陷阱)
问题:信号单位是微伏(PTB-XL 是 mV,Challenge 数据是 mV),直接跨库归一化会差三个数量级;A/D 每 bit 4.88 µV、幅值上限 32,767/下限 −32,768,贴边即截幅。元数据层:Diagnostics 的 Gender 列女性拼写为 “FEMAL”(原文 sic);Beat 列用空格分隔多标签且以 “NONE” 表示无附加状况。此外 Diagnostics 的 11 项测量(含 QTc)是 GE MUSE 机器自动测量,QTc 用 Bazett 公式在房颤/房扑心律下系统性失真;数据未提供导联反接/电极脱落标志位,平导联(电极脱落)与疑似导联反接需自查。
症状:跨库模型输入分布差三个数量级;value_counts()发现 “FEMAL”;把 QTc 当回归目标训练长 QT 筛查模型在 AFIB 亚组全错;发现 I 导联全倒置 aVR 直立的记录却无任何标志提示。
解决:
- 简单方法:读取层统一
/1000转 mV;性别清洗replace({"FEMAL": "FEMALE"});Beat 解析str.split() + 排除 "NONE";QTc 仅用于窦性心律子集。- 进阶方法:加截幅检测(
|x| ≥ 32.0 mV)与导联合理性校验(I 导联 = II − III 的 Einthoven 残差、aVR 直立性检查),异常记录进人工复核队列。- SOTA 方法:把 MUSE 自动测量仅当"弱参考特征",训练测量回归头时在损失中排除节律不适用子集(AF/AFIB 的 QTc),并在数据卡片中声明测量信任边界。
参考:PhysioNet 官方页(A/D 参数);论文(FEMAL 与标注协议);ECGBench 数据卡(µV→mV 转换实践)。
§6.6 数据增强(安全 ✅ / 危险 ❌)
本库增强的特殊约束来自节律标签的语义:SB/ST/SI 等类别以"率"或"规律性"为定义,任何改变时序密度的操作(大幅伸缩、拼接、重采样变速)都可能在不改变像素的情况下改变标签真值。下表按该约束评估常用增强手段。
| 增强 | 判定 | 说明 |
|---|---|---|
| 随机时间平移(±0.2 s 内) | ✅ 安全 | 静息记录起点任意,不改变节律语义 |
| 幅值缩放(0.8-1.2 倍) | ✅ 安全 | 模拟个体胸壁导联增益差异 |
| 加性高斯/工频噪声(信噪比 ≥ 20 dB) | ✅ 安全 | 模拟轻度噪声;避免掩盖 P 波 |
| 逐导联轻微相位/基线扰动 | ✅ 安全 | 模拟呼吸基线漂移 |
| 时间反转 | ❌ 危险 | P-QRS-T 形态无生理意义,制造伪样本 |
| 随机导联丢弃(12 导联全保留任务) | ⚠️ 谨慎 | 仅在降导联鲁棒性实验中有意义;本库 12 导联完整 |
| 跨记录波形拼接(cutmix 式) | ❌ 危险 | 破坏节律连续性,与条级节律标签直接矛盾 |
| 大幅时间伸缩(> ±10%) | ❌ 危险 | 心率与节律类别强相关(SB/ST 以率为定义),伸缩改变标签语义 |
安全增强的组合示例(可直接并入 §6.4 的 transform):
import random
def safe_augment(x: torch.Tensor) -> torch.Tensor:
"""(12, 5000) mV 张量的安全增强:时间平移 + 幅值缩放 + 轻噪声。"""
shift = random.randint(-100, 100) # ±0.2 s @ 500 Hz
x = torch.roll(x, shifts=shift, dims=1)
x = x * random.uniform(0.8, 1.2)
x = x + torch.randn_like(x) * 0.005 # 5 µV RMS 级噪声
return x
注意时间平移在边界用 torch.roll 会造成首尾相接的不真实波形,严格实现应在平移侧补零并裁剪;±0.2 s 的幅度下该瑕疵影响可忽略,但放大平移量前必须改为补零版本。
§6.7 模型推荐
推荐表按"从特征工程到基础模型"的能力阶梯排列,第一行是全库公共基线,任何新模型都应先与它对表。
| 模型类型 | 代表 | 适用任务 | 起步建议 |
|---|---|---|---|
| 梯度提升树 + 手工特征 | 官方 XGBoost(230 特征) | 4 类快速基线、可解释研究 | 复现官方 macro-F1 0.965 作 sanity check |
| 1D CNN | ResNet1d(1D 残差) | 11 类/多标签端到端 | 输入 (12, 5000),首层大核(16-32) |
| Transformer | ECG Transformer / 频域分块 | 表征学习、预训练 | 建议先在扩展版 45,152 条预训练 |
| 多库基础模型微调 | ECG-FM 类基础模型 | 跨库泛化、小样本 | 微调时冻结主干,注意坑点 6 标签映射 |
| 去噪自编码器 | 1D U-Net / NLM 对照 | 降噪研究 | 用 Raw 作输入、Denoised 作弱参考 |
实现层面的两点提醒:其一,1D CNN 的感受野要覆盖至少 2-3 个完整心搏(SB 心率 40 bpm 时一个心搏 1.5 秒 = 750 点),首层用 16-32 点小核 + 深层下采样的组合比直接堆 100+ 点大核参数效率高;其二,Transformer 路线建议以 5 秒(2,500 点)为片段长度切 patch,片段标签沿用条级标签并在论文中声明这一近似——这与 §7.3 的泛化性验证顺序(同分布 → 近分布 → 远分布)配合使用。
§6.8 硬件需求
按四种典型工作负载给出资源基线;本库规模决定了它是"任何实验室都跑得动"的量级,算力不应成为使用障碍。
| 场景 | 显存 | 内存 | 说明 |
|---|---|---|---|
| XGBoost + 手工特征 | 无需 GPU | 8 GB | 全库特征矩阵 < 1 GB |
| 1D CNN batch 64 | 8 GB | 32 GB | (64, 12, 5000) float32 ≈ 15 MB/批 |
| Transformer/预训练 | 24 GB+ | 64 GB | 建议混合精度;扩展版建议缓存为 .npy |
| 全库内存缓存(figshare) | — | 64 GB 可行 | 10,646 × 12 × 5000 × float32 ≈ 2.5 GB(mV) |
资源规划的现实基线:本库全量实验在一块 8 GB 消费级显卡上即可完成,这使它成为课程教学与消融实验的理想选择;真正的算力开销出现在多库联合预训练阶段,此时建议先在本库上把数据管线与训练循环调通,再平移到大规模语料,避免把工程 bug 带进昂贵的大规模训练。
§6.9 评估指标代码
指标选择与任务形态绑定:4 类单标签任务用 macro-F1 为主指标(类别不平衡下 accuracy 无信息量,官方也以 F1 为首报指标);11 类任务必须在 macro-F1 之外逐类报告(罕见类会被 macro 平均稀释);多标签任务(扩展版 SNOMED)用逐码 F1 + macro/micro 双口径,并报告候选阈值策略(全局 0.5 vs 逐码调优)。Challenge 2021 官方评分使用考虑误分类临床代价的自定义 metric,与其对表时需引用官方 evaluation-2021 代码而非自行近似。
from sklearn.metrics import f1_score, classification_report, confusion_matrix
import numpy as np
def evaluate_4class(y_true: np.ndarray, y_pred: np.ndarray, classes=("AFIB", "GSVT", "SB", "SR")):
"""官方五步工作流:F1 + Overall Accuracy + 混淆矩阵 + Precision + Recall。"""
macro = f1_score(y_true, y_pred, average="macro")
micro = f1_score(y_true, y_pred, average="micro") # 官方 micro avg = 0.970
print(f"macro-F1 = {macro:.3f} | micro-F1 = {micro:.3f}")
print(classification_report(y_true, y_pred, target_names=classes, digits=3))
print(confusion_matrix(y_true, y_pred))
return macro
# 报告规范:与官方基线可比时,注明 80/20 + 10 折 CV、4 类合并口径(§6.5 坑点 3)。
多标签任务(PhysioNet 扩展版,SNOMED 码互斥性不成立)应改用逐码指标,注意对训练集中未出现的码返回 0 并显式报告:
def evaluate_multilabel(y_true, y_pred, codes):
"""y_* 形状 (n, C);报告逐码 F1 与 macro/micro。"""
from sklearn.metrics import f1_score
per_code = {c: f1_score(y_true[:, i], y_pred[:, i], zero_division=0)
for i, c in enumerate(codes)}
return {
"macro_f1": f1_score(y_true, y_pred, average="macro", zero_division=0),
"micro_f1": f1_score(y_true, y_pred, average="micro", zero_division=0),
"per_code": per_code,
}
§6.10 MLOps 笔记
- 数据版本化:把"渠道(figshare/PhysioNet/CinC)+ 质量筛查版本 + 标签映射版本"三元组写入每次训练的 run 元数据——本库的跨渠道重叠问题(坑点 1)使这一步不是可选项。
- 数据卡片:随模型发布记录 §7.1 偏倚表与人群构成;SNOMED 码版本(ConditionNames_SNOMED-CT.csv)也需锁定哈希。
- 监测:部署后监控输入幅值分布(截幅率、平导联率)作为数据漂移哨兵指标,比模型指标更早报警。
- 复现:官方论文未发布划分文件,任何复现都应发布自己的随机种子与折划分,避免"不可比成绩"流入下游。
- 特征-标签防火墙:若使用 MUSE 自动测量作输入特征,需在服务端区分"在线可得"(部署环境通常没有医师标注与机器测量)与"离线研究"两种特征集,否则训练-服务特征不一致(training-serving skew)会在上线第一天出现。
另有一条针对本库的 CI 实践:把 §6.3 的质量筛查函数与 §6.5 坑点 1 的渠道重叠断言写成单元测试(固定几个已知坏记录 ID 与渠道成员样例作为 fixture),每次数据目录更新后自动跑——本库的镜像生态(Kaggle/HF/PhysioNet)意味着同一仓库可能被同事从不同渠道重新下载数据,CI 哨兵比口头约定可靠。
§7 质量评估与局限性
§7.1 已知偏倚
偏倚按"来源 × 是否可缓解"组织成表;与一般数据集不同,本库最重要的偏倚不是采样随机性而是队列构成本身(转诊人群 + 单地域),缓解手段因此以外部验证为主、库内重加权为辅。
| 偏倚类型 | 描述 | 严重程度 | 缓解措施 |
|---|---|---|---|
| 地域偏倚 | 仅浙江绍兴(+宁波)两院人群,设备链路单一 | 高 | 外部验证(PTB-XL/Georgia/CPSC);跨库域适应 |
| 转诊/构成偏倚 | 窦缓占 36.53%、83% 有异常,反映就诊人群而非自然患病率 | 高 | 不得用本库推断疾病患病率;类别先验需按部署场景重加权 |
| 年龄偏倚 | 中老年为主(61-70 岁占 24.38%),儿童仅个位数覆盖 | 中 | 儿科场景禁用或另行验证 |
| 标签粒度偏倚 | 条级单标签,10 秒窗内阵发事件可能被主导节律掩盖 | 中 | 明确任务语义;阵发性事件研究换 Holter 数据 |
| 标注一致性未知 | 官方未发布标注者间 κ | 中 | 将标签视为共识参考;关键研究抽样子集双盲复标 |
| 论文勘误残留 | Background/Table 5 中 AFIB/SB 计数对调;附加状况 67 vs 56 | 低(数据文件正确) | 以 Diagnostics.xlsx 重算为准(§4.2) |
| 设备混同偏倚 | 采集机型未分层记录,MUSE 系统级不可控 | 低-中 | 设备敏感方法在 limitations 中声明;跨设备验证 |
偏倚表的使用方式:把"严重程度"列映射为你项目的风险等级——高严重度偏倚(地域、转诊构成)对应"必须写进研究局限并设计缓解实验",中严重度对应"监测项",低严重度对应"声明即可"。不要把整表复制进论文而不分级,那是审稿人眼里的模板化信号。
§7.2 标注质量
三级医师协议(初标 → 复核 → 终裁,22 名专家参与姊妹库标注)在开放 ECG 数据中属于高规格,对高患病率类别(SB/SR/AFIB/ST 合计 85.1%)的可靠性预期良好。缺口有三:无标注者间一致性统计;附加状况(Beat 列)作用于整条记录、粒度粗;Challenge 2021 官方亦声明混合训练数据"部分标签可能有误"。总体评级:高置信但非零错误率,建议关键实验对测试集抽样 100-200 条人工复核以量化本地标签噪声。
与同类库横向比较可进一步校准预期:PTB-XL 的标注由最多两名医师复核并公布一致性讨论,CPSC 2018 的标注协议公开信息较少——本库处于两者之间,其"三级收敛"协议的真实价值需要靠使用者自己的抽样复标来兑现,而不是默认信任。
§7.3 泛化性
| 部署场景 | 失效风险 | 证据与说明 |
|---|---|---|
| 同设备(GE 系)同区域医院 | 低 | 与训练分布最接近;仍建议先小规模影子部署 |
| 欧美人群/其他设备 | 高 | LuminaECG 跨库实验:外部模型在本库 macro-F1 仅 0.644,ResNet1d-101 仅 0.350(arXiv:2608.09053) |
| 可穿戴/单导联设备 | 高 | 本库为标准静息 12 导联;姊妹论文显示 12 导联比单导联 F1 高约 1.4 个点,反向迁移无保障 |
| 儿科 | 高 | 4-98 岁中儿童占比极小,罕见类年龄分布(SAAWR SD 31.83)提示样本不稳定 |
| 阵发性心律失常实时监测 | 高 | 条级标签 + 10 秒窗设计不支持逐搏/连续监测语义 |
泛化性验证的执行顺序建议:先测"同分布退化"(把测试集按年龄段/性别切分,看组间衰减幅度),再测"近分布迁移"(CPSC 2018,同为中国人但多中心、时长可变),最后测"远分布迁移"(PTB-XL/Georgia)。三级都过的模型才有讨论部署的资格;直接跳级到远分布还期待好成绩,是本库使用者最常见的评估设计错误。
§7.4 伦理
伦理链路完整且开放:以下三段依次说明审批与豁免、资助与利益、许可与署名义务。
绍兴市人民医院伦理委员会(扩展版含宁波市第一医院)批准研究,豁免知情同意申请,并批准去标识化后公开共享(PhysioNet 官方页)。数据仅含年龄与性别两个人口学字段,无姓名、日期或标识符。资助:Kay Family Foundation Data Analytic Grant 与 2018 年绍兴市医药卫生研究基金(2018C30070)。使用许可 CC BY 4.0——商用允许,但必须署名;建议引用数据论文与 PhysioNet 标准 citation 双引用。
合规风险提示:CC BY 4.0 允许商用与再分发,但再分发时必须保留署名与许可声明,且不得使用官方名称暗示本库为你的产品背书;在产品中嵌套本库数据训练的模型时,建议在模型卡片中注明训练数据包含 Chapman-Shaoxing(含版本与渠道),这既是署名义务也是可追溯性要求。
§7.5 公平性
性别:男 55.95%/女 44.05%,各类内两性样本均过百(除罕见三类),支持分组评估。年龄:51 岁以下与 81 岁以上样本稀疏,分组性能需报告置信区间。种族:未披露,模型在少数族裔上的表现完全未知,禁止声称种族公平性。挑战性组合(如"年轻 + 罕见节律")样本趋近于零,相关结论应视为不可估。公平性评估的最小实现:在评估脚本中固定输出三张分层表——按性别、按年龄段(<40/40-60/60-80/>80)、按常见/罕见节律组,各给 macro-F1 与样本量。任何分层的样本量 < 30 时只报告计数不下结论。这三张表也是部署审批时监管最常要求的公平性证据格式。
§7.6 数据漂移
无时间戳(§3.7)使时间漂移无法在库内直接度量。可操作的替代哨兵:① 设备链路漂移——跟踪部署端截幅率/平导联率(坑点 8 的质量指标);② 人群漂移——监控年龄/性别分布相对训练集的 PSI;③ 标签先验漂移——部署场景的节律构成与本库差异(尤其窦缓占比)应触发先验重校准。
三项哨兵的报警阈值可以简化设定:质量指标相对上线基线变化超过 2 个标准差、人群 PSI 超过 0.2、先验占比相对偏移超过 10 个百分点,任一触发即启动数据回看。这些阈值不需要精确成立,需要的是在 drift 真正发生前有系统化的观察点——本库无时间戳的短板,恰好要求部署侧把监控做在前面。
§7.7 DAIMS 24 项评估
以下按 DAIMS 检查清单逐项评估本库。状态含义:✅ = 官方直接满足且有文档支撑;⚠️ = 部分满足或需使用者加工;❌ = 结构性缺失,无法在本库内解决。
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 宽格式 | ✅ | Diagnostics.xlsx 一行一患者,16 列齐备 |
| 2 | 唯一标识 | ✅ | FileName 全局唯一,一人一条,信号-标签主键一致 |
| 3 | 特殊字符 | ⚠️ | Gender 列 “FEMAL” 拼写;Beat 空格分隔需自行分词 |
| 4 | 重复行 | ⚠️ | 表内无重复行,但 ECGData 与 ECGDataDenoised 同源重复,拼接即膨胀 |
| 5 | 缺失编码 | ✅ | Beat 无附加状况用显式哨兵 “NONE”,语义可判定 |
| 6 | 标签标识 | ✅ | Rhythm 单标签 + Beat 多标签,两级语义在官方文档中明确区分 |
| 7 | 罕见类分组 | ❌ | SAAWR 7 / AVRT 8 / AVNRT 16 无官方分层或分组训练文件(4 类合并仅为论文建议) |
| 8 | 偏倚评估 | ⚠️ | 论文提供人口统计表但无正式偏倚/公平性分析 |
| 9 | 数据字典 | ✅ | AttributesDictionary.xlsx(56 缩写)+ 论文表格完整描述字段 |
| 10 | 信息性缺失解释 | ⚠️ | NONE 哨兵未在官方文档中显式定义,语义靠社区推导 |
| 11 | 设备记录 | ✅ | GE MUSE 系统、A/D 32-bit、4.88 µV/bit、采样率齐全 |
| 12 | 共线性 | ⚠️ | 12 导联仅 8 路独立(Einthoven/Goldberger 线性关系),建模需知悉 |
| 13 | 编码映射 | ✅ | 扩展版官方提供 ConditionNames_SNOMED-CT.csv;Challenge 评分码公开 |
| 14 | 时间戳处理 | ❌ | 无采集日期/时间戳,时间维度分析不可行 |
| 15 | 划分建议 | ⚠️ | 论文给出 80/20 + 10 折 CV 协议但未发布划分文件 |
| 16 | 泄漏讨论 | ⚠️ | 一人一条天然免疫患者级泄漏;跨渠道/跨库重叠无官方讨论 |
| 17 | 标签分布 | ✅ | 论文 Table 2 完整 11 类计数 + 年龄/性别交叉统计 |
| 18 | 测量偏倚 | ⚠️ | 11 项 MUSE 自动测量无人工复核率与误差报告;QTc 在房颤下失真 |
| 19 | 外部验证建议 | ⚠️ | 官方未提供外部验证指南;社区有跨库实践可循 |
| 20 | 版本记录 | ✅ | figshare v2 与 PhysioNet v1.0.0 均有明确版本标识与日期 |
| 21 | 预处理脚本 | ✅ | ECGConverter / ECGDenoisingTool 官方开源(MATLAB + Python) |
| 22 | 合规要求 | ✅ | IRB 批准 + 豁免声明 + CC BY 4.0,权属链清晰 |
| 23 | 多模态对齐 | ⚠️ | 单模态数据集;信号与标签仅靠 FileName 键对齐(简单可靠,但无第二模态校验) |
| 24 | 去标识化 | ✅ | IRB 批准去标识化后公开;仅保留年龄/性别 |
DAIMS 评分:17.0 / 24(12 项 ✅、10 项 ⚠️ 计 5.0、2 项 ❌)
评分解读:17.0 分处于"研究可用、部署需加固"区间。硬件级事实(设备、A/D、格式、license、版本)记录完整,是开放 ECG 数据集中的上游水准;扣分集中在四个结构性缺口——无时间戳、无官方划分、罕见类无分组、跨渠道泄漏无讨论。⚠️ 项多为"信息存在但需要使用者自行加工",代表可弥补的工程成本,而非数据本身的缺陷。
横向参照:同类开放 ECG 数据集中,PTB-XL(官方划分 + 一致性统计 + SCP 标准)通常可达 20 分上下,本库 17.0 的差距主要不在数据质量而在配套元数据的完备度;CPSC 2018 因规模小且文档更薄,通常低于本库。因此本库的真实定位是"条带级节律分类的高性价比基准",而非"全维度 AI-Ready 标杆"。
对你意味着什么:① 若你的任务是常见节律分类(4 类),这是可以直接开工的数据集——把 §6.3/§6.4 代码跑通即可获得接近官方基线的起点;② 若涉及时间维度(漂移、纵向、季节性),此库无法支撑,换 MIMIC-IV-ECG 或自建队列;③ 若做 11 类细粒度任务,必须先决定罕见类的处理策略(合并或级联),否则结果不可发表;④ 任何多库组合实验,先把 §6.5 坑点 1/2/6 的检查写进数据加载单元测试,这是本库与其他库组合时唯一可靠的防泄漏屏障。
§7.8 外部验证矩阵
收录标准:只录有同行评审或公开技术报告支撑的结果,且必须披露评估协议;单一渠道库内成绩不重复收录。
| 外部数据集/场景 | 来源机构 | 评估任务 | 性能指标 | 相对内部变化 | 关键发现 |
|---|---|---|---|---|---|
| 本库 4 类 10 折 CV(内部参考) | Chapman/Shaoxing 团队 | 4 类节律分类 | macro-F1 0.965 | 基线 | XGBoost + 230 可解释特征(Sci Data 2020) |
| 姊妹库 40,258 人(同团队扩展队列) | Chapman/Shaoxing | 多阶段 4 类 | F1 0.992(10 折 CV) | 内部+0.027 | 三阶段降噪 + XGBoost;12 导联较单导联 +1.4%(Sci Rep 10:2898) |
| 跨库(PTB-XL/CPSC/Georgia 混合训练 → 本库测试) | LuminaECG 研究 | 多标签外部验证 | macro-F1 0.644(ResNet1d-101 仅 0.350) | 大幅塌缩 | 跨库标签映射与人群偏倚共同导致性能衰减(arXiv:2608.09053) |
| Challenge 2021 混合库 | 多机构 | 24+ 评分码多标签 | 见 Challenge 官方论文口径 | 协议不同 | 本库为官方训练数据源;标签质量库间不均(Reyna et al., CinC 2021) |
矩阵的读法:内部参考行定义了"本库能支撑的性能上限",跨库行定义了"真实世界还能保住多少"。两行的差值(约 0.3 个 macro-F1)就是人群 + 标签体系 + 设备三重偏倚的总代价——任何声称"泛化良好"的新方法,都应给出自己实测的差值,而不是引用别人的。
§8 基准性能与生态
§8.1 排行榜
⚠️ 下表各行采用不同划分与标签口径,数值不可直接横向比较;每行标注协议。榜单只收录能完整给出出处、协议与数据口径的工作;缺任一要素的成绩(哪怕更高)不进入榜单,这一原则本身也是对本库最常见的评测乱象(§8.2 警示)的直接回应。
| 排名 | 模型 | 性能 | 年份 | 关键技术 | 完整引用 | 协议 | 代码 |
|---|---|---|---|---|---|---|---|
| 1 | XGBoost(三阶段,姊妹库) | F1 0.992 | 2020 | 多阶段降噪 + 230 特征 | Zheng J, et al., 2020, Scientific Reports 10:2898. https://www.nature.com/articles/srep40258 | 40,258 人库 10 折 CV | 无官方仓库 |
| 2 | XGBoost(官方基线,本库) | macro-F1 0.965(micro 0.970) | 2020 | 可解释特征工程 | Zheng J, et al., 2020, Scientific Data 7:48. DOI 10.1038/s41597-020-0386-x | 本库 80/20 + 10 折 CV,4 类 | 论文附录 |
| 3 | LuminaECG(跨库协议) | macro-F1 0.644 | 2026 | 基础模型跨库迁移 | LuminaECG, 2026, arXiv:2608.09053. https://arxiv.org/abs/2608.09053 | 混合库训练 → 本库外部测试 | 见论文 |
| 4 | ResNet1d-101(跨库对照) | macro-F1 0.350 | 2026 | 1D 残差网络 | 同上(同协议对照行) | 同上 | 见论文 |
另需警示:社区存在报告 7 类 100% 准确率的工作(如 2024 年 ASOC 会议的 CDNN+RPM),该数值量级与本库标签噪声水平和跨实验常识不符,普遍被视为标签/划分泄漏,本 Wiki 不将其纳入可信榜单。
识别此类可疑工作的通用启发式,供文献综述时复用:① 准确率显著超过官方特征工程基线 2 个百分点以上且未做跨库验证;② 未声明折划分与随机种子;③ 使用 Beat 附加状况(含 LBBB/RBBB/PVC 等强形态线索)作为输入特征预测 Rhythm 主标签——两类标注在 MUSE 系统内由同一医师同时给出,强相关不等于可泛化。
§8.2 SOTA 总结与选型建议
本库的"天花板参考"是官方 XGBoost 的 0.965/0.970——一个纯特征工程模型。深度模型在库内 4 类任务上通常只能追平而难以显著超越该基线,原因是一人一条 + 10 秒窗的任务信息上限已被锁定。因此:追求论文可比性 → 复现官方协议;追求实际价值 → 把精力放在跨库泛化(§7.8 显示外部塌缩到 0.64/0.35 量级)、罕见类与噪声鲁棒性上,那里才是真实的性能洼地。
选型决策树:目标是发对比论文 → XGBoost 基线 + 一个 1D CNN,报告同协议差异;目标是产品原型 → 先在扩展版上预训练表征、再在本库 4 类上微调,并在 PTB-XL 或 CPSC 上测塌缩幅度;目标是基础模型研究 → 本库适合作为预训练语料的中国分量,但务必与 Challenge 2021 训练清单做重叠审计。
§8.3 评测协议
推荐协议:4 类合并(§4.2)+ 80/20 分层划分 + 10 折 CV + macro-F1/micro-F1/per-class F1/混淆矩阵全量报告;随机种子与折划分随代码发布。多标签任务(扩展版):按首列 #Dx 分层、ECGBench clean 版(42,909 条)口径、报告 macro-F1 与逐码 F1。任何与本库相关的跨库实验必须声明:渠道来源、采样率统一方式、标签映射表与映射损失(坑点 1/2/6)。
评测协议 checklist(投稿前逐项自查):□ 渠道与版本已声明 □ 划分代码已发布 □ 折种子已固定 □ 采样率统一过程已描述 □ 标签映射表已随附 □ 罕见类处理策略已说明 □ 质量剔除记录数已报告 □ 与官方基线(F1 0.965)的同协议对照已给出。八项全过是"可发表"的最低线。
§8.4 相关数据集
下表按"与本库组合的可能性"排序,每行标注标签体系——组合使用的第一决策依据不是规模而是标签可映射性(§6.5 坑点 6)。
| 数据集 | 规模 | 人群 | 标注体系 | 与本库组合用途 |
|---|---|---|---|---|
| PTB-XL | 21,837 条 / 18,885 患者 | 德国 | SCP-ECG 五大类 | 跨人群泛化、标签映射研究 |
| CPSC 2018 | 6,877 条 | 中国(多中心) | 自编 9 类 | 同区域不同中心对比 |
| Georgia 12-lead(G12EC) | 10,344 条公开 | 美国东南部 | SNOMED CT | Challenge 协议对齐 |
| MIT-BIH Arrhythmia | 48 条 Holter | 美国 | 逐搏标注 | 逐搏粒度任务互补 |
| MIMIC-IV-ECG | 约 80 万条 | 美国(BIDMC) | 诊断级映射 | 大规模预训练 |
| CODE-15% | 345,779 条 | 巴西 | 医师标注 | 超大规模预训练 |
| INCART | 74 条 | 俄罗斯 | 逐搏+节律 | 注意 257 Hz(坑点 2) |
组合使用的两条经验法则:第一,组合库的标签空间应向下对齐到"所有库都能干净表达的公共子集",宁可损失标签粒度也不要引入映射噪声;第二,组合库的采样权重应按"部署目标分布"而非"库大小"设定,否则本库(10,646)在 45 万条级语料(CODE)旁边会几乎没有存在感,其人群特征被淹没。
§8.5 关键论文 Top 5
五篇按"官方数据论文 → 官方扩展发布 → 官方方法论文 → 竞赛协议 → 社区评测框架"的身份全覆盖,引用其中之一并注明身份即可满足大多数期刊的数据引用要求。
- Zheng J, Zhang J, Danioko S, Yao H, Guo H, Rakovski C. A 12-lead electrocardiogram database for arrhythmia research covering more than 10,000 patients. Scientific Data 7:48 (2020). DOI 10.1038/s41597-020-0386-x —— 数据集主论文:规模、11 类标注协议、XGBoost 基线。
- Zheng J, Guo H, Chu H. A large scale 12-lead electrocardiogram database for arrhythmia study (version 1.0.0). PhysioNet (2022). DOI 10.13026/wgex-er52 —— 扩展版 45,152 例官方发布页与 WFDB 格式说明。
- Zheng J, Chu H, Struppa D, Zhang J, Yacoub SM, El-Askary H, et al. Optimal Multi-Stage Arrhythmia Classification Approach. Scientific Reports 10:2898 (2020). https://www.nature.com/articles/srep40258 —— 姊妹论文:40,258 人库、三级降噪 + XGBoost F1 0.992、12 导联价值论证。
- Reyna MA, et al. Will Two Do? Varying Dimensions in Electrocardiography: The PhysioNet/Computing in Cardiology Challenge 2021. Computing in Cardiology (2021). https://moody-challenge.physionet.org/2021 —— 本库作为官方训练源的混合库评测协议与 SNOMED 评分码。
- ECGBench 项目组. Chapman-Shaoxing / ecg-arrhythmia dataset cards. HuggingFace Spaces(检索于 2026-09). https://huggingface.co/spaces/vlbthambawita/ECGBench/blob/main/datasets/chapman-shaoxing-ecg-database-10-646-patients.html —— 社区质量审计数字(平导联/幅值离群/折警告)与统一读取实践。
阅读顺序建议:初识本库按 1 → 2 → 4 的顺序读三篇官方文献即可建立完整图景(数据 → 扩展版 → 方法体系);ECGBench 数据卡(5)适合动手前最后过一遍,它的审计数字和读取约定能帮你避开 §6.5 大部分工程坑点。
§8.6 社区活跃度
活跃度结论先行:本库属于"数据冻结、生态活跃"型——数据本体自 2022 年后未变,但引用、工具与下游模型持续增长,选择它是安全的长期投入。
- 学术引用:Semantic Scholar 496(influential 53)、Scopus 429、OpenAlex 311(截至 2026-09 快照),在开放 ECG 数据集中位居前三(与 PTB-XL、CPSC 同级)。
- 平台托管:PhysioNet 官方托管扩展版;figshare 托管首发版;Kaggle/HuggingFace 存在多个社区镜像与折划分。
- 官方工具链:ECGConverter 与 ECGDenoisingTool 在 GitHub 开源(MATLAB + Python 双版本)。
- 竞赛使用:PhysioNet/CinC Challenge 2021 官方训练数据源之一, 全球参赛队伍逾百支。
- 教学与研究渗透:从 Challenge 时代起,本库成为"三库联评"(PTB-XL + CPSC + Chapman-Shaoxing)事实标准的组成部分;近年 ECG 基础模型论文(如 Self-DANA 等预训练工作)普遍将其纳入预训练或微调语料清单,作为亚洲人群的代表性分量。
维护活跃度提示:首发版 figshare 自 2019 年后无内容更新(v2 即最终版);扩展版 PhysioNet v1.0.0 自 2022-08-24 发布后亦无修订记录。可以认为数据本体已冻结,社区迭代发生在工具链(ECGBench 等)与下游模型层。
§8.7 生态快照
下表汇总可直接进入你工作流的六个资源,全部免费且在 2026-09 有效。
| 资源 | 类型 | 链接 | 推荐理由 |
|---|---|---|---|
| PhysioNet ecg-arrhythmia v1.0.0 | 官方托管 | https://physionet.org/content/ecg-arrhythmia/1.0.0/ | 45,152 例扩展版与 SNOMED 映射的权威来源 |
| figshare ChapmanECG 集合 | 官方托管 | https://springernature.figshare.com/collections/chapman_ecg/4560497 | 10,646 例首发版与 Denoised 副本 |
| ECGDenoisingTool | 官方代码 | https://github.com/zheng120/ECGDenoisingTool | 降噪全流程可复现(MATLAB+Python) |
| ECGConverter | 官方代码 | https://github.com/zheng120/ECGConverter | GE MUSE XML → CSV 转换参考实现 |
| ECGBench | 社区评测框架 | https://huggingface.co/spaces/vlbthambawita/ECGBench | 质量审计、确定性折划分、统一单位读取 |
| Challenge 2021 官方代码 | 竞赛基线 | https://github.com/physionetchallenges/evaluation-2021 | SNOMED 评分码与官方评测实现 |
| Challenge 2021 官方分类器示例 | 参考实现 | https://github.com/physionetchallenges/python-classifier-2021 | WFDB 读取 + .hea 标签解析的标准写法 |
| PhysioNet 标准引用生成器 | 引用工具 | https://physionet.org/content/ecg-arrhythmia/1.0.0/(页内 Cite 按钮) | 论文引用格式一键生成,含 BibTeX |
生态快照的总体判断:本库的工具生态在 2022 年后进入稳定维护期,没有破坏性变更风险;使用者的主要生态决策不是"等更新"而是"选入口"——追求权威用 PhysioNet/figshare 官方渠道,追求开箱即用用 ECGBench,二者数据本体一致但接口约定不同,混用前先对照 §3.3 的格式表核对标签字段。
§9 相关资源与引用
§9.1 官方资源
以下按"数据 → 代码 → 协议 → 社区"的顺序排列;全部链接在 2026-09 检索时有效。
-
数据论文全文(开放获取):Scientific Data 7:48;PMC7016169
-
扩展版主页与下载:PhysioNet ecg-arrhythmia 1.0.0
-
首发版集合:figshare ChapmanECG
-
竞赛协议:Challenge 2021(含官方 Python/MATLAB 示例分类器)
-
社区工具:ECGBench 数据卡与折划分
-
跨库外部验证参照:LuminaECG, arXiv:2608.09053(跨库塌缩量级的公开参照)
-
评测协议文档:Challenge 2021 官方页(SNOMED 评分码与逐库构成)
-
方法细节原文:PMC7016169 全文(滤波参数、划分方式与勘误核对)
§9.2 BibTeX 引用块
四条引用覆盖本库全部使用场景:数据论文(必引)、扩展版数据引用、方法论文(引用其性能数字时必引)、竞赛协议(使用评分码时必引)。
@article{zheng2020chapman,
author = {Zheng, Jianwei and Zhang, Jianming and Danioko, Sally and Yao, Hai and Guo, Hangyuan and Rakovski, Cyril},
title = {A 12-lead electrocardiogram database for arrhythmia research covering more than 10,000 patients},
journal = {Scientific Data},
volume = {7},
pages = {48},
year = {2020},
doi = {10.1038/s41597-020-0386-x}
}
@data{zheng2022physionet,
author = {Zheng, Jianwei and Guo, Hangyuan and Chu, Huimin},
title = {A large scale 12-lead electrocardiogram database for arrhythmia study (version 1.0.0)},
year = {2022},
publisher = {PhysioNet},
doi = {10.13026/wgex-er52}
}
@article{zheng2020optimal,
author = {Zheng, Jianwei and Chu, Huimin and Struppa, Donald and Zhang, Jianming and Yacoub, Salem M. and El-Askary, Hesham and Chang, Arthur and Ehwerhemuepha, Louis and Abudayyeh, Islam and Barrett, Alexander and Fu, Guoqiang and Yao, Hai and Li, Duan and Guo, Hangyuan and Rakovski, Cyril},
title = {Optimal Multi-Stage Arrhythmia Classification Approach},
journal = {Scientific Reports},
volume = {10},
pages = {2898},
year = {2020}
}
@inproceedings{reyna2021challenge,
author = {Reyna, Matthew A. and Alday, Erick A. Perez and Liu, Amanda and Feber, and others},
title = {Will Two Do? Varying Dimensions in Electrocardiography: The PhysioNet/Computing in Cardiology Challenge 2021},
booktitle = {Computing in Cardiology},
year = {2021}
}
§9.3 引用指南
研究使用本库时,最低引用要求为数据论文(zheng2020chapman)+ 渠道对应版本(figshare 用集合 DOI 10.6084/m9.figshare.c.4560497.v2,PhysioNet 用 zheng2022physionet 并附 PhysioNet 标准引用);使用 Challenge 评分协议时追加 reyna2021challenge。请在论文数据可用性声明中注明所用渠道与版本,以避免 §6.5 坑点 1 的渠道歧义。
投稿场景的常见追问与准备好的答案:审稿人问"为何成绩与已发表论文不同"——用"官方无固定划分文件,本工作协议见 §5.1"回应;问"是否与 Challenge 数据重叠"——用 §5.3 的血缘审计结果回应;问"罕见类结论可靠性"——用 §3.6 的抽样复标一致率回应。提前把这三段写进 supplementary,能省一轮大修。
§10 AI 使用声明卡
§10.1 本页面生产中使用的 AI 模型
- 千方模型(fast-model)——大语言模型,负责资料综合、正文撰写与代码示例生成
- 联网检索工具(WebSearch/WebFetch)——负责官方页面与文献数字核实
§10.2 AI 参与范围
AI 参与了:文献检索与事实收集、章节结构与行文、代码示例编写、DAIMS 逐项初步评估。人工完成了:关键数字的二次核对(每条硬事实要求来源 URL)、医学映射表抽查、坑点事实性审阅与最终发布决策。
边界声明:AI 未访问任何非公开数据或付费文献,全部事实输入来自上表 16 条公开来源;代码示例经过逻辑走查但未在本页生产环境中逐行执行,使用者在接入自有环境时应按 §10.4 的校验方式复核;医学结论(§2、§7)的所有实质性判断均以人工核验为准。
§10.3 输入来源列表(完整引用)
本页全部事实均可追溯至以下 16 条公开来源;正文中的关键数字旁均附了对应内链,此表是它们的汇总与补全。
- Zheng J, Zhang J, Danioko S, Yao H, Guo H, Rakovski C. A 12-lead electrocardiogram database for arrhythmia research covering more than 10,000 patients. Scientific Data 7:48 (2020). DOI 10.1038/s41597-020-0386-x.
- Zheng J, Guo H, Chu H. A large scale 12-lead electrocardiogram database for arrhythmia study (version 1.0.0). PhysioNet (2022). DOI 10.13026/wgex-er52. https://physionet.org/content/ecg-arrhythmia/1.0.0/
- Chapman-Shaoxing ECG Database (v2). figshare collection c.4560497. https://springernature.figshare.com/collections/chapman_ecg/4560497
- Zheng J, et al. Optimal Multi-Stage Arrhythmia Classification Approach. Scientific Reports 10:2898 (2020). https://www.nature.com/articles/srep40258
- Reyna MA, et al. Will Two Do? Varying Dimensions in Electrocardiography: The PhysioNet/Computing in Cardiology Challenge 2021. Computing in Cardiology (2021). https://moody-challenge.physionet.org/2021
- PhysioNet. Challenge 2021 data description. https://physionet.org/challenge/2021
- Pollard TJ, Moody BE, Lehman L, et al. PhysioNet as a global platform for biomedical research. Nature Health (2026). DOI 10.1038/s44360-026-00096-z.
- ECGBench. Chapman-Shaoxing (figshare) dataset card. HuggingFace Spaces(检索于 2026-09). https://huggingface.co/spaces/vlbthambawita/ECGBench/blob/main/datasets/chapman-shaoxing-ecg-database-10-646-patients.html
- ECGBench. Chapman-Shaoxing (Arrhythmia, PhysioNet) dataset card. HuggingFace Spaces(检索于 2026-09). https://huggingface.co/spaces/vlbthambawita/ECGBench/blob/main/datasets/chapman-shaoxing-arrhythmia.html
- Zheng J, et al. ECGDenoisingTool. GitHub. https://github.com/zheng120/ECGDenoisingTool
- Zheng J, et al. ECGConverter. GitHub. https://github.com/zheng120/ECGConverter
- LuminaECG. arXiv:2608.09053 (2026). https://arxiv.org/abs/2608.09053
- Self-DANA: A Resource-Efficient Channel-Adaptive Self-Supervised Approach for ECG Foundation Models. arXiv:2507.14151 (2025). https://arxiv.org/html/2507.14151
- kwantlin/bench. Medical Benchmarking Datasets Info. GitHub(检索于 2026-09). https://github.com/kwantlin/bench/blob/main/dataset-info.md
- WHO. International Classification of Diseases 11th revision (ICD-11), BC80-BD1Z 心律失常章节. https://icd.who.int/
- SNOMED International. SNOMED CT, 心律相关编码(164889003、426783006 等)及 PhysioNet ConditionNames_SNOMED-CT.csv.
§10.4 人工校验记录
校验原则:数字密集模块逐单元格溯源,代码模块逻辑走查,医学模块对照权威术语库;每行记录采用方式与结论,不接受"已阅"式签收。
| 内容模块 | 审核者 | 审核方式 | 审核状态 |
|---|---|---|---|
| §2 ICD-11 / SNOMED CT 映射表 | 千方病案医学编辑部 | 对照 WHO ICD-11 浏览器与 PhysioNet 官方映射 CSV 抽查 | ✅ 已通过/已验证 |
| §3/§4 全部规模数字与计数表 | 千方病案医学编辑部 | 对照论文 Table 2、PhysioNet 官方页与 ECGBench 重算数据三源交叉 | ✅ 已通过/已验证 |
| §6.1-§6.4 代码示例 | 千方病案医学编辑部(数据工程) | 目录结构/字段名对照官方文件;逻辑走查 | ✅ 已通过/已验证 |
| §6.5 坑点 1-8 事实性 | 千方病案医学编辑部 | 逐条溯源至官方页/数据卡/论文原文 | ✅ 已通过/已验证 |
| §7.7 DAIMS 24 项 | 千方病案医学编辑部(数据工程) | 逐项对照证据表复核状态与评分计算 | ✅ 已通过/已验证 |
| §8 基准数字与引用 | 千方病案医学编辑部 | 排行榜条目逐条核对原文与协议口径 | ✅ 已通过/已验证 |
§10.5 AI 生成章节标注
本页面全部章节由 AI 起草,经人工校验(§10.4)后发布。其中 §4.2 标签分布表、§7.7 DAIMS 评分与 §8.1 排行榜为数字密集模块,人工复核采用逐单元格溯源方式完成。
§10.6 最后人工审核日期
2026-09-05。本页面承诺随官方数据渠道的重大变更(新版本发布、许可调整、勘误公告)在 90 天内完成复审并更新本日期。
页面状态:published(全部内容已完成审核并发布)
