PhysioNet/CinC 2017 — 单导联房颤分类挑战赛 AI-Ready Wikipedia | 千方病案医数集

8,528 条单导联 ECG 四分类:移动端 AF 检测的奠基基准

来源 PhysioNet(数据由 AliveCor 捐赠,Emory University & MIT 组织) url: https://physionet.org/content/challenge-2017/1.0.0/发布时间: 2026-09-08最后更新: 2026-09-08 阅读 6

信息速览

数据集名称PhysioNet/CinC 2017 — 单导联房颤分类挑战赛 AI-Ready Wikipedia | 千方病案医数集
数据类型8,528 条训练 + 3,658 条隐藏测试,300 Hz 单导联 9-61 秒,约 95 MB zip,ODC-By 1.0 免费下载
规模未公开(8,528 条记录,同一患者可多次录制)
接入方式PhysioNet(数据由 AliveCor 捐赠,Emory University & MIT 组织) url: https://physionet.org/content/challenge-2017/1.0.0/
AI 就绪度

数据集封面

PhysioNet/CinC Challenge 2017 — 移动端房颤检测的奠基基准 AI-Ready Wikipedia


INFOBOX

字段 内容
数据集名称 PhysioNet/Computing in Cardiology Challenge 2017
英文全称 AF Classification from a Short Single Lead ECG Recording: The PhysioNet/Computing in Cardiology Challenge 2017
别名/简称 CinC Challenge 2017 / Challenge 2017 / AF Challenge 2017 / training2017 / CINC2017
疾病分类 房颤(ICD-11 BC81 心房颤动或心房扑动);Other rhythm 覆盖各类心律失常;Noisy 为信号质量属性
SNOMED CT 49436004 Atrial fibrillation / 426783006 Normal sinus rhythm(详见 §2.1b)
数据模态 单导联(Lead I)体表心电图时序信号
AI 任务类型 四分类(Normal / AF / Other rhythm / Noisy)、房颤筛查、信号质量评估
样本总数 公开训练集 8,528 条 + 隐藏测试集 3,658 条(合计 12,186 条)
数据大小 约 95 MB(training2017.zip)
数据格式 MATLAB V4 .mat + WFDB 兼容 .hea 头文件;标签 CSV(REFERENCE-v3.csv)
许可证 Open Data Commons Attribution License v1.0(ODC-By 1.0)
访问级别 开放(免费直接下载,无需注册)
DUO 标签 NRES(无限制使用)
语言 英文
首发日期 2017-01-15(挑战开放)/ 2017-02-01(v1.0.0 数据发布)
最后更新 2017-11-06(v3 修订标签发布)
发布机构 PhysioNet(Emory University & MIT);数据由 AliveCor 捐赠
官方主页 moody-challenge.physionet.org/2017 / physionet.org/content/challenge-2017/1.0.0
下载地址 physionet.org/files/challenge-2017/1.0.0
DOI 10.22489/CinC.2017.065-469
引用次数 1,120+(Google Scholar,截至 2026-09)
AI 就绪度评分 ⭐⭐⭐⭐(4/5)— 有官方 v3 标签、官方评分脚本与冠军开源代码可直接复用;扣分项:无官方验证划分、变长序列需自行 padding、无患者级 ID 需自防泄漏
页面状态 published

§0 E-E-A-T 审核声明

医学审核者:千方病案医学编辑部交叉审核:§2 医学背景(ICD-11/SNOMED CT 映射、房颤临床任务定义、金标准描述)、§7 偏倚分析。

数据工程审核者:千方病案医学编辑部交叉审核:§4 DAIMS 数据字典(.mat/.hea 双文件结构、标签三版本映射)、§5 数据划分策略、§6 预处理 Pipeline 和坑点。

审核日期:2026-09-05

审核方式:交叉审核

利益冲突声明:千方病案医数集与 Emory University、MIT、AliveCor、PhysioNet 无任何商业利益关联。本页面不销售该数据集本身,仅提供 AI 就绪指南与学术信息服务。编辑者未接受上述机构的任何形式资助。

医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。

技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。

数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。本数据集以 ODC-By 1.0 开放分发,使用时须按官方要求引用 Clifford et al. 2017 挑战总结论文与 PhysioNet 平台文献。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。


§1 数据集概览

§1.0 📌 30 秒速览

这是什么? 2017 年 PhysioNet/CinC 挑战赛公布的大规模单导联心电图分类数据集。8,528 条公开训练记录全部来自普通人在家用 AliveCor 手持设备自发录制的心电图——短则 9 秒、长不超过 61 秒——由专家逐条标注为正常窦律、房颤、其他心律或噪声过大四类,另有 3,658 条同源记录被隐藏用作客观评分。

为什么重要? 它第一次把"真实世界移动端单导联 ECG"变成可严格评测的公开基准:信号短、噪声大、类别极度不平衡、标签本身有分歧——这些正是可穿戴设备筛查房颤面对的真实困难。此后 Apple Watch、华为手表等消费级 ECG 产品的算法研究,几乎都绕不开这条基准线。

我能用它做什么? 训练和评测房颤筛查模型;研究变长时序的 padding/截断策略;做类别不平衡、标签噪声与集成学习的实验;复现 2017 年四队并列冠军(F1 0.83)与 45 算法集成(F1 0.87)的官方成绩——冠军代码至今开源可跑。

§1.1 摘要

PhysioNet/CinC Challenge 2017 于 2017-01-15 开放,聚焦"从 9–61 秒短单导联 ECG 中区分房颤与正常、其他心律及噪声"[1]。组织方(Emory University 与 MIT,Clifford、Liu、Moody 等)获得 AliveCor 捐赠的 12,186 条患者自发录制 ECG,其中 8,528 条作为公开训练集(MATLAB V4 .mat 格式,300 Hz,Lead I,带通滤波),3,658 条作为隐藏测试集。标签由专家人工给出(Normal/AF/Other/Noisy 四类),但因专家间分歧显著,组织方在赛中用表现最好的参赛算法做 bootstrap 式仲裁,先后发布 v1、v2、v3 三版修订标签。全部 75 支参赛队伍、300 余次提交中,70 支开源;四支队伍以 F1 0.83 并列第一(Teijeiro、Datta、Zabihi、Hong),官方用 45 个算法做 LASSO 加权集成进一步达到 0.87,证明"算法民主"能超越任何单一模型[1]。该数据集因此成为移动端/可穿戴 ECG AI 的奠基基准,Google Scholar 引用已超 1,120 次(截至 2026-09)。

读者导航:只想了解数据可靠性 → §7.7 DAIMS 24 项;要复现排行榜 → §8.1 与坑点 8;写论文前查口径 → §5 划分与 §9 BibTeX;做产品原型 → §6 全章;关心临床含义 → §2 与 §7.3。

§1.2 战略价值

维度一:真实场景的"压力测试台"。 与 12 导联临床库(PTB-XL、CODE)的规范采集不同,本数据集的每条记录都是患者按下"录制键"的产物:设备摆放位置随意、肌肉噪声与基线漂移普遍、时长不可控。一条 AF 筛查算法在这里拿到的 0.83,远比在干净临床数据上的 0.95 更接近其真实世界水平。对消费级 ECG 产品团队而言,这是最早也是最被广泛引用的"可穿戴先决基准"。

维度二:方法论创新的天然试验场。 三版标签的演化本身就是一份"标签噪声研究素材":v1 中 Noisy 仅 46 条(0.5%),v3 重标注后 Noisy 升至 279 条——大量原本被归入 Other 的记录被重新定性。研究者可以在此系统研究类别极端不平衡(9:1:30:0.5 的原始比例)、变长序列建模(2,700–18,300 个采样点)、以及隐藏测试集与自建验证集之间 10–17 个百分点的 F1 落差(官方 Table 4 实证)等教科书级难题。

维度三:工程成本几乎为零的公共品基准。 约 95 MB 的单 zip、ODC-By 1.0 许可(允许商用)、无需注册或伦理审批、笔记本单卡即可全量训练——这使它成为同类医学 AI 基准中部署摩擦最小的一个:课程实验、快速原型、CI 回归测试都能承受其完整加载成本。相比之下 PTB-XL(3.3 GB)与 CODE-15%(约 4 GB)需要更重的存储与预处理基建。对新组建的医学 AI 团队而言,"第一天就能跑通官方冠军基线"的工程体验极为稀缺。

§1.3 同类数据集横向对比

数据集 导联 规模 采样率 标注体系 差异化定位
CinC Challenge 2017 1 导联(Lead I) 8,528 条(训练,9–61 s) 300 Hz 四分类(N/A/O/Noisy),专家标注 移动端自发录制、真实噪声、隐藏测试评分
PTB-XL 12 导联 21,837 条(10 s) 500/1,000 Hz 多标签(数百 SCP-ECG 术语) 医院规范采集、标注最细(Wagner 2020)
CODE-15% 12 导联 345,779 条(7–102 s) 400 Hz 二进制 AF/正常 + 6 类子集 巴西 TeleHealth 网络、最大规模(Ribeiro 2020)
CPSC 2018 12 导联 6,877 条(6–60 s) 500 Hz 9 类心律失常 中国多中心、类别细
MIT-BIH Arrhythmia 2 导联 48 条(每条 30 min) 360 Hz 心搏级(AAMI 5 类) 长时段心搏级经典库
CinC Challenge 2021 12 导联(多来源) 26 个数据源混合 多种 6 类心律 跨域泛化主题的后续挑战

选型提示:研究"可穿戴单导联、短记录、真实噪声"场景必选本数据集;需要 12 导联形态学或大规模预训练请转向 PTB-XL/CODE-15%(注意三者互不同源,见坑点 5)。

§1.4 版本时间轴

时间 事件
2017-01-15 挑战赛开放;官方数据页公布(v1 标签:Normal 5,154 / AF 771 / Other 2,557 / Noisy 46)
2017-02-01 PhysioNet 托管 v1.0.0 数据(training2017.zip)与 MATLAB/Octave 示例代码
2017 年(赛期内) 因专家分歧启动赛中重标注,发布 v2 标签(Noisy 增至 284 条)
2017-09-01 挑战赛关闭(9 月 6 日前选定最终参赛算法)
2017-09-27 雷恩 CinC 大会公布冠军:四队以 0.83 并列第一
2017-10-04 官方结果与挑战总结论文(Clifford et al. 2017)发布
2017-11-06 v3 修订标签发布(REFERENCE-v3.csv,Noisy 279 条)——当前社区标准
2018-02 / 2018-04 Phys. Meas. Focus Issue 论文集公布;全部参赛源代码开放存档

§1.5 典型应用场景

  1. 房颤筛查算法基准评测:四分类或"AF vs 非 AF"二分类(折叠 Other/Noisy),在自建划分上对比 ResNet1D、集成投票等基线。
  2. 变长时序建模研究:2,700–18,300 个采样点的原生变长特性,是检验 padding/mask、截断窗口、注意力池化等序列策略的最小完备试验场。
  3. 类别不平衡与代价敏感学习:Noisy 类 46 条(v1)与 AF 类 771 条构成两级不平衡,适合研究 focal loss、重采样、过采样策略的实际收益。
  4. 标签噪声与标注仲裁研究:v1→v2→v3 的标签迁移轨迹可用于训练"标签去噪"或"标注一致性"模型。
  5. 可穿戴产品前置验证:消费级 ECG 设备 AF 检测算法在投放临床验证前,先在公开基准上建立可比基线(后续再迁移到 12 导联库做形态学验证)。
  6. MLOps 回归探针:利用"数据永不再更新"的特性,把固定分层子集纳入 CI,作为模型/依赖版本迭代的行为回归测试(见 §7.6)。

§2 医学背景

§2.1 ICD-11 疾病分类锚定

标签类别 ICD-11 编码 中文名称 说明
AF(A) BC81 心房颤动或心房扑动 数据集 AF 类以心房颤动为主;ICD-11 将房扑与房颤同置于 BC81 节点下按病程细分
Normal(N) 无对应编码 正常窦性心律 正常状态不占疾病编码;SNOMED CT 有锚点(见 §2.1b)
Other rhythm(O) 按底层节律映射 各类心律失常(窦缓/窦速/房扑/室上速/室性心律/起搏心律等) 混合类别,无单一编码;逐条记录需依据心电报告映射至 ICD-11 第 09 章心律失常相应节点
Noisy(~) 无对应编码 ——(信号质量属性) 非疾病标签,表示信号不可判读;不应映射到任何 ICD-11 节点

§2.1b SNOMED CT 映射表

标签类别 SNOMED CT 码 英文术语 常用中文译名
AF(A) 49436004 Atrial fibrillation 心房颤动
Normal(N) 426783006 Normal sinus rhythm 正常窦性心律
Other rhythm(O) 按具体节律细分 Atrial flutter (34267003)、Supraventricular tachycardia (25569003) 等 房扑、室上性心动过速等
Noisy(~) 无对应概念 —— 信号质量标记,非临床概念

§2.2 疾病简介与流行病学

心房颤动(AF) 是最常见的心律失常:心房电活动陷入 350–600 次/分的无序激动,P 波消失、RR 间期绝对不规则,心房丧失有效收缩。成人患病率约 1%–2% 并随年龄陡增(Lip et al., 2016, Nature Reviews Disease Primers),全球患者估计约 6,000 万(GBD 2019 口径约 5,970 万)。AF 本身可无症状,但使缺血性卒中风险升高约 5 倍、心衰与全因死亡风险显著上升,因此机会性筛查(opportunistic screening)是其管理的关键入口——这正是"家用手持设备录一段 30 秒 ECG、由算法判断是否 AF"的临床逻辑,也是本挑战赛选题的直接动机[1]。

临床任务链:间歇性 AF 常规 12 导联心电图(约 10 秒)容易漏诊,指南因此推荐更长的单导联连续或事件式记录。单导联设备信息量虽少于 12 导联(无法评估 P 波电轴与多导联形态一致性),但对"识别 AF vs 窦律"这一特定任务已足够——代价是部分"其他心律"(如房扑、频发房早)在单导联下与 AF 边界模糊,这构成了本数据集标注分歧与 Other 类模糊性的医学根源(见坑点 3、坑点 7)。

为何"短记录"是独立的科学问题:阵发 AF 的检出率与监测时长近线性相关,而患者愿意自发录制的时长通常不超过一分钟。本库的 9–61 秒区间正好覆盖"消费级设备单次录制"的典型长度,使算法必须在数个心动周期内从 RR 间期不规则性与 f 波形态中做出判断——这与 12 导联"多参数综合判读"是完全不同的信息提取范式。ESC 2016 房颤管理指南推荐对 65 岁以上人群进行脉搏触诊或心电图节律条带的机会性筛查,本库即该筛查逻辑的算法化前提。

§2.3 临床任务定义

任务 输入 输出 临床角色 在本数据集上的形态
AF 筛查(区分 AF vs 非 AF) 9–61 s 单导联 ECG 二分类概率 机会性筛查,阳性者转诊 12 导联确认 合并 N/O 为非 AF(Noisy 通常剔除或单列)
四分类节律判读 同上 N/A/O/Noisy 近似自动"分诊":不可判读者要求重录 官方挑战任务;F1 按 N/A/O 三类平均
信号质量评估 同上 Noisy 概率 前置质量门控,减少无效判读 以 Noisy 类或信号质量指数(SQI)建模

三个任务共享同一批记录但评价含义不同:四分类是官方原生任务(有排行榜锚点);二分类是绝大多数后续文献的实际用法(需声明 Other/Noisy 的合并方式);信号质量评估则把 Noisy 从"竞争类"转为"前置门",适合工程部署。同一模型在三套任务表述下的分数差异可能高达 10 个百分点,论文写作时必须显式选择并声明其一。

§2.4 患者人群

维度 描述
来源 AliveCor 手持单导联设备的消费者自发录制(患者发起,非临床场景)
采集时间 2017 年挑战赛前(精确起止日期官方未公布)
年龄/性别/种族 官方未发布人口统计学摘要(相关元数据未随数据公开)
就医类型 院外/家庭环境自检,非卧床监护
地域 官方未公布地理分布(AliveCor 消费者以北美市场为主,此为背景信息而非官方口径)
规模 12,186 条记录(训练 8,528 + 隐藏测试 3,658);患者人数未公开,同一患者可多次录制

⚠️ 人群结构不透明是该库最大元数据缺陷之一:任何按年龄/性别的亚组公平性分析都缺乏标签,模型的人群外推性只能靠外部数据验证(见 §7.3、§7.5)。

§2.5 临床价值

  • 筛查通路前移:算法在家庭自检环节筛出疑似 AF,把昂贵的心电会诊资源集中在真阳性上;2017 年后基于此类单导联数据的算法成为消费级 ECG 产品 AF 提示功能的共同技术起点。
  • 卒中一级预防的量化抓手:每提高 1 个百分点的筛查敏感度,意味着更多无症状阵发 AF 患者及时进入抗凝评估流程。
  • "不可判读"的科学化:官方把 Noisy 设为独立类别并研究其分布,让"信号质量门控"从工程细节升级为临床安全组件——宁可让用户重录,不可给错误结论。
  • 低成本公共卫生筛查的方法论底座:单导联 + 短记录 + 开放许可的组合,使资源受限地区的 AF 筛查研究可以直接复用该基准与开源冠军代码,而不必从零采集标注数据;后续多国团队正是在该库上完成首版模型再进行本地化验证。

§2.6 金标准与标注方式

维度 描述
标注对象 每条记录的整体节律(记录级标签,非心搏级)
标注方式 人工节律判读为主;赛中用表现最好的参赛算法识别"争议记录"并启动专家重标注(bootstrap 仲裁)
标注者资质 专业心电节律判读专家(组织方未公布人数与资质细节;官方确认"全部记录人工标注"且"专家间分歧显著")
一致性处理 分歧记录由算法共识 + 专家复议形成 v2/v3 修订标签;三版标签并存发布
性质 挑战赛金标准:8,528 条训练公开、3,658 条测试永久隐藏(客观第三方评分)
局限 无患者级 ID、无人口学元数据、单一机构组织(Emory/MIT 团队仲裁)——标注协议的可重复性依赖官方存档

§3 数据集规格

§3.0 版本抉择矩阵

你的需求 推荐资源 大小 理由
复现 2017 挑战排行榜 / 发表对照实验 training2017.zip + REFERENCE-v3.csv 约 95 MB v3 是当前社区事实标准(冠军代码 README 明确要求);隐藏测试不公开,用自建划分近似
研究标签噪声/标注仲裁本身 REFERENCE-v1/v2/v3 三版 CSV 对比 <1 MB 三版并存是天然的标签演化素材(Noisy 46→284→279)
需要参赛算法代码做集成/对比 官方 sources 存档 + hsd1503/ENCASE 数十 MB 2018-04 起官方公开 75 队源码;ENCASE(F1 0.83)与 resnet1d 最易复现
大规模 12 导联预训练或跨库迁移 PTB-XL / CODE-15%(不同数据集) 3.3 GB / 约 4 GB 本库仅单导联且无患者 ID,不宜承担预训练主数据源

§3.1 模态详情

单一模态:Lead I 单导联体表心电图。每条记录一个 .mat 文件(MATLAB V4 格式,单变量 val,1×N 双精度采样序列)与一个 .hea 头文件(WFDB 兼容:采样率 300、增益、基线、时长)。信号已由采集设备完成带通滤波;记录时长 9–61 秒(对应 2,700–18,300 个采样点),官方统计全库均值 32.5 ± 10.9 s、中位数 30 s[1]。无诊断文本、无人口学附件、无心搏级注释。

单条记录的物理验证示例(来源:官方 sample2017.zip 说明与 torch-ecg 实现):

from scipy.io import loadmat
import wfdb

# A00001 为 30 秒整记录(9,000 点 @300 Hz),.hea 头声明采样率与增益
sig = loadmat("training2017/A00001.mat")["val"].squeeze()
hdr = wfdb.rdheader("training2017/A00001")
print(sig.shape, sig.dtype, "fs =", hdr.fs, "n_sig =", hdr.n_sig)
# 期望:(9000,) float64 fs = 300 n_sig = 1

§3.2 按子集样本数

子集 记录数 占比 时长均值 (s)
Normal(N) 5,154 60.4% 31.9
AF(A) 771 9.0% 31.6
Other rhythm(O) 2,557 30.0% 34.1
Noisy(~) 46 0.5% 27.1
训练集合计 8,528 100% 32.5
隐藏测试集 3,658 与训练集同分布(v1 比例:Normal 60.4% / AF 9.1% / Other 30.0% / Noisy 0.6%)

上表为 v1 标签口径(与官方数据页一致);按 v3 标签,四类条数变为 5,076 / 758 / 2,415 / 279(见 §4.2 完整对照)。做类不平衡分析时建议同时引用两版:v1 代表"初标注的自然分布",v3 代表"仲裁后的工作分布"。

§3.3 数据格式

文件/字段 格式 说明
A00001.hea … A08528.hea WFDB 兼容文本头 声明采样率(300)、增益、基线、采样点数
A00001.mat … A08528.mat MATLAB V4 单变量 val:1×N 波形采样值(单通道)
REFERENCE-v1/v2/v3.csv CSV 两列:A00001,N;Noisy 的类别码为波浪号 ~
score2017Challenge.m MATLAB 官方评分脚本(sample2017.zip 内)

§3.4 存储大小

training2017.zip 实测 99,226,822 字节 ≈ 95 MB(截至 2026-09,来源:physionet.org/files/challenge-2017/1.0.0);解压后约 300 MB(含 8,528 对 .mat/.hea 与说明文件)。sample2017.zip(示例入口代码)约 3.6 MB。全部载入内存(float32)约 333 MB,单机笔记本即可处理。

§3.5 标注方式

人工节律判读 + 赛中算法辅助仲裁(弱监督→修订)。初始标签(v1)由专家对每条记录判读整体节律;由于"相当比例记录存在专家间显著分歧"(Clifford et al. 2017 摘要原文),组织方在赛中期用排名靠前的参赛算法定位争议记录,进行专家复议并陆续发布 v2、v3 标签。标签分布随之变化:Noisy 46→284→279 条、Other 2,557→2,456→2,415 条——即约百余条记录在类间被重新划定[1]。

§3.6 标注者资质与一致性

官方确认全部记录由专家人工标注,但未公布标注专家人数、资质与逐条一致性统计;唯一的一致性证据是论文摘要中"significant fraction of the expert labels 存在高度专家间分歧"的表述与由此启动的重标注流程[1]。这是使用该库时必须内化的先验:标签本身是过程性产物,v3 优于 v1,但仍有残留不确定性(配套证据:§7.2)。

§3.7 采集周期

数据于 2017 年挑战赛前完成采集与标注(AliveCor 于 2017-01 捐赠);精确采集起止日期官方未公布。发布与修订节奏见 §1.4 时间轴。从挑战组织逻辑推断,采集窗口应为挑战开放前的数月至一两年内(官方 2017-01-15 公告即宣布"超过 10,000 条记录的数据库"就绪),但该推断不构成官方口径,引用时应写"2017 年前、具体日期未公布"。

§3.8 地域覆盖

患者自发远程录制,官方未公布地理分布。采集语境为 AliveCor 消费设备用户的全球分布(以北美为主的市场背景,此为背景推断而非官方声明)。使用时应假设其人群结构与本地就诊人群存在分布差异。

值得强调的是,"地域未公开"在该库引发的实际后果比一般元数据缺失更隐蔽:多中心验证研究发现,基于本库训练的模型在其他地区的单导联采集中出现系统性校准偏移(同一模型在不同人群上的最优判读阈值不同),而这只能通过本地验证集重校准来缓解——不存在可从本库内部推导的修正。

§3.9 设备规格

项目 规格
设备 AliveCor 手持式单导联 ECG 记录仪(消费级,指尖/胸壁接触式;具体型号官方未披露)
导联 Lead I(右手–左手)
采样率 300 Hz
信号处理 设备内置带通滤波(官方描述 “band pass filtered”)
单次录制 患者自发触发,≤60 秒(实测 9–61 s)

§3.10 深度溯源链

AliveCor(设备与原始录制,患者自发)→ Emory University & MIT 组织方(筛选、去标识、专家标注 v1)→ PhysioNet/CinC Challenge 2017(公开分发 + 赛中重标注 v2/v3)→ PhysioNet 长期存档(v1.0.0 + 三版标签 + 75 队源码)。每一环节均有官方页面或论文存档佐证(Clifford et al. 2017; PhysioNet content 页; archive.challenge-2017 公告列表)。


§4 数据结构

§4.0 目录树

challenge-2017/1.0.0/
├── training2017.zip                  # ≈95 MB,解压得到 training2017/
│   └── training2017/
│       ├── A00001.hea                # WFDB 兼容头:采样率 300、增益、基线、时长
│       ├── A00001.mat                # MATLAB V4:变量 val(1×N 单导联波形)
│       ├── A00002.hea
│       ├── A00002.mat
│       ├── ...                       # 共 8,528 对 .mat/.hea(A00001–A08528)
│       ├── A08528.hea
│       ├── A08528.mat
│       ├── ANSWERS.md                # 挑战提交答案的格式说明
│       └── README.md
├── sample2017.zip                    # ≈3.6 MB:MATLAB/Octave 示例入口 + 官方评分脚本 score2017Challenge.m
└── (存档站点另提供三版标签 CSV)
REFERENCE-v1.csv                      # 8,528 行:record,class(v1:Noisy 46 条)
REFERENCE-v2.csv                      # 赛中修订:Noisy 284 条
REFERENCE-v3.csv                      # 2017-11-06 终版:Noisy 279 条 ← 社区标准
papers/                               # 官方总结论文 065-469.pdf 等

§4.1 DAIMS 字段字典

字段名 类型 说明 示例值 AI 用途 观测误差 信息性缺失编码 取值范围
record_id string 记录名 = .mat/.hea 文件名 A04217 主键,连接信号与标签 A00001–A08528
val(信号) float 数组 1×N 单导联采样值;N=时长×300 val = [ -123, -96, ... ] 分类输入(数值单位需结合 .hea 增益换算为 mV) 设备带通滤波已去除直流与高频;残留肌电/基线漂移 无缺失采样(全库逐点完整) 2,700–18,300 点/条
sampling_frequency float .hea 声明 300 重采样参数 300 Hz(全库一致)
duration_seconds float N / 300 27.53 序列长度建模、批处理策略 9.0–61.0 s
class(v1/v2/v3) string 记录级节律标签 A 分类目标 专家分歧致三版差异(见 §3.5) ~ 即 Noisy,属信息性类别而非缺失 N / A / O / ~
label_version string 标签版本标识 v3 复现实验时锁定口径 v1 / v2 / v3
gain / baseline(.hea) float 模数转换增益与基线 gain=1000 量级(逐文件读取为准) 物理单位换算 mV 不同文件或有差异 逐文件读取
units(.hea) string 信号物理单位声明 mV 与 gain 联用完成量纲还原 mV(全库一致)
n_sig(.hea) int 信号通道数 1 校验单导联假设 1
duration(.hea 推导) float 采样点数 ÷ 300 30.0 变长批处理与窗口策略 9.0–61.0 s
age / sex 不存在 不可用 整字段缺失(官方未发布)

⚠️ 上表最后一行是"结构性空缺"而非遗漏:该库不携带任何人口学字段,亚组分析需另寻外部数据。

§4.2 标签分布

类别码 全名 v1 条数(占比) v2 条数 v3 条数(占比)
N Normal rhythm 5,154(60.4%) 5,050 5,076(59.5%)
A AF rhythm 771(9.0%) 738 758(8.9%)
O Other rhythm 2,557(30.0%) 2,456 2,415(28.3%)
~ Noisy 46(0.5%) 284 279(3.3%)
合计 8,528 8,528 8,528

要点:AF:非 AF ≈ 1:10;Noisy 在 v1 中近乎缺席而在 v3 中达 3.3%——任何"按 v1 比例构造验证集"的实验都会低估 Noisy 难度

类间迁移的方向性也有信息量:v1→v2/v3 的迁移几乎全部流向 Noisy(46→284→279),Normal/AF/Other 三类净变动较小但内部有置换。这意味着"不可判读"是初标时被系统性低估的类别——专家初标时倾向于把勉强可判的记录塞进语义最近的节律类,而非诚实标记为 Noisy。凡做质量门控功能,应以 v3 为准并预留 3% 量级的 Noisy 先验,而非 v1 的 0.5%。

§4.3 关键统计

统计项 Normal AF Other Noisy
条数(v1) 5,154 771 2,557 46
时长 min (s) 9.0 10.0 9.1 10.2
时长 mean (s) 31.9 31.6 34.1 27.1
时长 max (s) 61.0 60.0 60.9 60.0

时长跨 6.8 倍(9–61 s);Noisy 类平均最短(27.1 s)。采样点数 = 时长 × 300,故每条序列长度介于 2,700–18,300。

分布形态上,全库时长中位数恰为 30 秒、均值 32.5 秒(标准差 10.9 秒),说明约半数记录落在 AliveCor 默认单次录制的 30 秒档位附近,向两端呈右偏拖尾。这一分布形态对工程有三点直接含义:其一,以 30 秒(9,000 点)为统一序列长度是"最小浪费"的定长选择,超出部分集中在少数长记录;其二,9–15 秒的短记录是 AF 漏检的高危区(信息量不足一至四个完整 RR 周期的变异性观测),分层评估时应单列;其三,Other 类均值最长(34.1 秒),提示"判读困难"与"录制更长"之间存在弱相关,截断策略对 Other 类的影响可能大于其他类。

§4.4 数据层级

(患者层:不可见——无患者 ID,同一患者可能贡献多条记录)
└── 记录层:8,528 条训练记录(A00001–A08528)+ 3,658 条隐藏测试
    └── 序列层:1 条 Lead I 波形(300 Hz,9–61 s)
        └── 标签层:记录级四分类(N/A/O/~,三版本)

与 PTB-XL(患者→检查→记录→心搏注释)不同,本库只有"记录→序列→标签"两层显式结构,心搏级信息需自行 R 波检测提取。

结构维度 CinC 2017 PTB-XL MIT-BIH
显式患者层 ❌(无 ID) ✅(patient 编码) ✅(记录号≈受试者)
记录时长 9–61 s(变长) 10 s(定长) 30 min(定长)
标注粒度 记录级(整体节律) 语句级 + 形态级 心搏级 + 节律级
标注版本 三版(v1/v2/v3) 单版 + 协议文档 单版(AAMI 分组惯例化)

跨库设计实验时,这四行差异中任何一行被忽视都会导致错误结论——尤其是"显式患者层"的缺失使本库成为三者中唯一无法严格做患者级划分的库。

§4.5 缺失值与信息性缺失

  • 采样缺失:无。全库逐条逐点完整,无 NaN、无截零占位。
  • 元数据缺失:年龄、性别、种族、采集时间、患者 ID 整体不存在(结构性空缺)。
  • 信息性"缺失"= Noisy 类~ 不是数据损坏,而是"专家无法判读"的有效语义。模型把难样本推给 Noisy 是常见投机行为——官方对策是把漏答记录按 Noisy 计(见坑点 8),且最终评分不计 Noisy 类 F1,投机无收益。
  • 隐藏测试集:3,658 条记录及其标签永久不公开,属于"数据级缺失",任何声称拥有官方测试标签的第三方资源都不可信。

§5 数据划分与使用建议

§5.1 官方划分

官方只定义"训练(8,528 公开)vs 测试(3,658 隐藏)",没有公开验证集:参赛者在 8,528 条内自行交叉验证,仅最终一次提交计入隐藏测试评分[1]。隐藏集按记录随机抽取,v1 口径下各类占比与训练集几乎一致(Normal 60.4%/60.4%、AF 9.0%/9.1%、Other 30.0%/30.0%、Noisy 0.5%/0.6%)。

隐藏集与训练集的比例约为 3:7(3,658/12,186)。按官方论文,最终成绩以隐藏集全量计算且每队只有一次全量评估机会,这一"一次性盲测"设计是 2017 年排行榜数字至今仍被引用为金标准的原因——本地复现者无法重造该盲测条件,只能以"多折 CV + 冠军代码对账"逼近。

§5.2 社区惯例划分

惯例 做法 适用
90/10 记录级随机划分 sklearn train_test_split,固定随机种子 快速基线(resnet1d 等开源实现采用)
10 折交叉验证 全库 10 折,报告均值±标准差 论文对照(多数 CinC 后续研究采用)
按标签版本分层 用 v3 标签、以类别比例分层抽样 避免 Noisy 类在验证折中缺席(v1 比例下 46 条仅够 1–2 条/折)

分层划分的最小实现(与 §6.4 Dataset 内置逻辑一致):

import numpy as np, pandas as pd

df = pd.read_csv("REFERENCE-v3.csv", header=None, names=["recording", "class"])
rng = np.random.RandomState(42)
val_idx = set()
for c in df["class"].unique():                     # 按类分层,保证 Noisy 也进入验证集
    idx = df.index[df["class"] == c].to_numpy()
    rng.shuffle(idx)
    val_idx |= set(idx[: int(len(idx) * 0.1)])
val_df = df.loc[sorted(val_idx)]
train_df = df.drop(index=list(val_idx))
print(train_df["class"].value_counts().to_dict())  # 确认各类比例保持

§5.3 泄漏风险(重点)

  1. 患者级泄漏:数据来自"患者自发录制",同一患者多次录制难以排除,而库内无患者 ID——记录级随机划分可能把同一人的多条记录分入训练与验证两侧,造成乐观偏差。缓解:无法完全消除;可行做法是报告多种随机种子的方差、并在外部库上做真实验证(见坑点 5)。
  2. 标签版本泄漏:训练用 v1、验证用 v3(或反之)会系统性错配;务必全程锁定单一版本(推荐 v3)。
  3. 隐藏测试间接拟合:官方每日限量提交机制下反复试错隐藏集也构成过拟合通道;本地复现时不要用官方 test 分数挑选超参。

患者级泄漏的敏感性检验代码(伪分组:按记录名排序分块,与随机划分对照):

import numpy as np, pandas as pd

df = pd.read_csv("REFERENCE-v3.csv", header=None, names=["recording", "class"]).sort_values("recording")
n = len(df)
split = int(n * 0.9)
block_train = df.iloc[:split]["recording"]          # 伪分组:连续记录名切块
block_val = df.iloc[split:]["recording"]

rng = np.random.RandomState(42)
perm = rng.permutation(n)
rand_train = df.iloc[perm[:split]]["recording"]     # 随机划分对照
rand_val = df.iloc[perm[split:]]["recording"]
# 分别训练并对比两套划分下的 F1:差异 >1 个百分点即提示泄漏效应不可忽略

§5.4 交叉验证建议

采用"分层 10 折 + 5 随机种子"记录级 CV,报告 F1(N/A/O 三类平均,口径见坑点 8)的均值与 95% 区间;若做二分类 AF 筛查,报告 F1-AF、敏感度、特异度,并把 Noisy 记录的处理方式(剔除/单独类/入非 AF)写成显式声明。

from sklearn.model_selection import StratifiedKFold
import numpy as np, pandas as pd

df = pd.read_csv("REFERENCE-v3.csv", header=None, names=["recording", "class"])
f1s = []
skf = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)
for tr, va in skf.split(df, df["class"]):
    # 在此训练模型并以 official_f1() 评估(见坑点 8 实现)
    f1s.append(evaluate_fold(train_df=df.iloc[tr], val_df=df.iloc[va]))
print(f"CV F1 = {np.mean(f1s):.3f} ± {np.std(f1s):.3f} (10-fold, v3 labels)")

§5.5 外部验证建议

  • 同模态跨库:CPSC 2018(12 导联 500 Hz)与 CODE(12 导联 400 Hz)可测"单导联模型上 12 导联数据"的域差,但须先做导联抽取(Lead I 等效)与重采样(见坑点 6)。
  • 同设备谱系:CinC Challenge 2021 部分子集含消费者设备数据,可测时代漂移。
  • 前瞻临床验证:任何筛查模型在申报临床用途前,须在与目标人群匹配的前瞻采集中重新验证(本库无人口学标签,无法替代该步骤)。

§6 AI 就绪指南

§6.0 云端快速启动(如适用)

本数据集体积小(约 95 MB)、无凭证门槛,无需云端专用环境;在 Colab/Kaggle 免费实例上 5 分钟内即可完成下载到训练。注意 Kaggle 上存在多个用户上传的历史副本(镜像自 v1 标签时期),务必核对文件是否 8,528 对、标签是否 v3——直接使用镜像副本是"标签版本错配"的常见来源(坑点 2)。

pip install wfdb scipy pandas torch --quiet
wget -q https://physionet.org/files/challenge-2017/1.0.0/training2017.zip
wget -q https://archive.physionet.org/challenge/2017/REFERENCE-v3.csv
unzip -q training2017.zip && ls training2017 | head   # 确认 A00001.mat 等就位

§6.1 快速上手

目录结构预期:解压后 training2017/A*.matA*.hea 同级存放;REFERENCE-v3.csv 可放在数据目录外,两列无表头(A00001,N)。
data_root 拼接关系:代码中 DATA_ROOT 指向 training2017 文件夹,记录名(如 A04217)直接拼接 f"{DATA_ROOT}/{name}.mat"
最小可用子集:8,528 条全量即"最小可用"(无更小官方子集);调试时可只读前 100 行 CSV。

# 快速读取一条记录并查看元信息
from scipy.io import loadmat
import wfdb, pandas as pd

DATA_ROOT = "training2017"
# 标签:无表头两列 CSV;Noisy 的类别码是波浪号 "~"
labels = pd.read_csv("REFERENCE-v3.csv", header=None, names=["recording", "class"])
print(labels["class"].value_counts())          # N/A/O/~ 分布

name = labels.iloc[0]["recording"]             # 'A00001'
sig = loadmat(f"{DATA_ROOT}/{name}.mat")["val"].squeeze()   # 1×N 波形
info = wfdb.rdheader(f"{DATA_ROOT}/{name}")
print(name, "fs =", info.fs, "len =", len(sig), "class =", labels.iloc[0]["class"])
# 期望输出:A00001 fs = 300 len = 9000 class = N   (30 s 记录)

§6.2 数据获取

项目 内容
下载地址 training2017.zip(约 95 MB);REFERENCE-v3.csv;示例代码 sample2017.zip
申请流程 无需注册、无需签署协议,直接下载(隐藏测试集除外——不对公众开放)
许可证 ODC-By 1.0(署名即可自由使用,含商业用途)
引用义务 Clifford et al. 2017(DOI 10.22489/CinC.2017.065-469)+ PhysioNet 平台文献
# 一键获取(Linux/macOS)
wget https://physionet.org/files/challenge-2017/1.0.0/training2017.zip
wget https://archive.physionet.org/challenge/2017/REFERENCE-v3.csv
unzip training2017.zip    # 生成 training2017/

§6.3 预处理全流程

流程:格式读取(.mat)→ 重采样(如需 250/500 Hz 统一)→ 带通清理(可选,设备已滤波)→ 逐记录 z-score → 变长对齐(截断/padding,见坑点 1)。

import numpy as np
from fractions import Fraction
from scipy.signal import resample_poly, butter, filtfilt
from scipy.io import loadmat

def load_ecg(path):
    """读取单条记录:返回 float32 一维数组与采样率"""
    return loadmat(path)["val"].squeeze().astype(np.float32), 300.0

def resample(x, fs_in=300.0, fs_out=250.0):
    """有理分式重采样,避免频率混叠"""
    g = Fraction(int(fs_out * 100), int(fs_in * 100)).limit_denominator(1000)
    return resample_poly(x, g.numerator, g.denominator)

def clean(x, fs=300.0, lo=0.5, hi=40.0):
    """轻量带通(设备已滤波,此处仅清除残留漂移/高频毛刺)"""
    b, a = butter(4, [lo / (fs / 2), hi / (fs / 2)], btype="band")
    return filtfilt(b, a, x).astype(np.float32)

def normalize(x):
    """逐记录 z-score:跨设备增益差异一次抹平(见坑点 6)"""
    return (x - x.mean()) / (x.std() + 1e-8)

sig, fs = load_ecg("training2017/A04217.mat")
sig = normalize(clean(sig, fs))     # 标准管线

针对坑点 1 的多窗裁剪(训练时等效时移增强,推理时中心窗):

def random_windows(x, win=9000, n_crops=1, rng=None):
    """从变长序列中裁出 n_crops 个 win 长窗口;短序列尾部补零。
    训练期 rng 为 np.random,推理期固定中心起点以获得确定性输出。"""
    if len(x) <= win:
        out = np.zeros((n_crops, win), np.float32)
        out[:, :len(x)] = x
        return out
    if rng is None:                                # 推理:中心窗
        s = (len(x) - win) // 2
        return x[s:s + win][None, :]
    starts = rng.randint(0, len(x) - win + 1, size=n_crops)
    return np.stack([x[s:s + win] for s in starts])

§6.4 PyTorch DataLoader 完整代码

以下 Dataset 把变长序列对齐到 30 s(9,000 点 @300 Hz):超长截断、不足尾部补零,并返回 mask 供注意力/池化使用。

<details>
<summary>点击展开完整代码(约 40 行)</summary>

import numpy as np, torch, pandas as pd
from pathlib import Path
from torch.utils.data import Dataset, DataLoader
from scipy.io import loadmat

DATA_ROOT = Path("training2017")            # .mat 所在目录
LABEL_CSV = "REFERENCE-v3.csv"              # 两列无表头:recording,class
CLASSES = {"N": 0, "A": 1, "O": 2, "~": 3}  # Noisy 的类别码是 "~"
MAX_LEN = 9000                              # 30 s × 300 Hz

class CinC2017Dataset(Dataset):
    """变长单导联 ECG → 定长 (MAX_LEN,) + mask + 整数标签。
    目录约定:DATA_ROOT/A00001.mat …;标签 CSV 与 DATA_ROOT 平级或任意路径。"""
    def __init__(self, csv_path=LABEL_CSV, root=DATA_ROOT, max_len=MAX_LEN,
                 train=True, seed=42, val_ratio=0.1):
        df = pd.read_csv(csv_path, header=None, names=["recording", "class"])
        # 分层 90/10 划分(记录级;患者级 ID 不存在,见坑点 5)
        rng = np.random.RandomState(seed)
        self.val_idx = set()
        for c in df["class"].unique():
            idx = df.index[df["class"] == c].to_numpy()
            rng.shuffle(idx)
            self.val_idx |= set(idx[: int(len(idx) * val_ratio)])
        self.df = df if train else df.loc[sorted(self.val_idx)]
        if train:
            self.df = df.drop(index=list(self.val_idx))
        self.root, self.max_len = Path(root), max_len

    def __len__(self):
        return len(self.df)

    def __getitem__(self, i):
        row = self.df.iloc[i]
        x = loadmat(self.root / f"{row['recording']}.mat")["val"]
        x = x.squeeze().astype(np.float32)
        x = (x - x.mean()) / (x.std() + 1e-8)          # 逐记录 z-score
        n = min(len(x), self.max_len)
        out, mask = np.zeros(self.max_len, np.float32), np.zeros(self.max_len, np.float32)
        out[:n], mask[:n] = x[:n], 1.0                  # 尾部补零 + 有效位 mask
        return torch.from_numpy(out), torch.from_numpy(mask), CLASSES[row["class"]]

train_loader = DataLoader(CinC2017Dataset(train=True),  batch_size=64, shuffle=True,  num_workers=4)
val_loader   = DataLoader(CinC2017Dataset(train=False), batch_size=128, shuffle=False, num_workers=4)
xb, mb, yb = next(iter(train_loader))
print(xb.shape, mb.shape, yb[:8])   # torch.Size([64, 9000]) torch.Size([64, 9000]) tensor([...])

</details>

§6.5 八个真实坑点

⚠️ 坑点 1:9–61 秒变长序列——padding/truncation 策略直接决定成绩上限(分类:预处理陷阱)

问题:序列长度跨 6.8 倍(2,700–18,300 点)。粗暴定长截断 30 s 会丢掉后 31 s 信息(AF 阵发可能恰好出现在后段),零填充前段则让卷积/池化把"补零区"当特征。
症状:验证集 F1 蠕动不定;短记录(9–15 s)AF 漏检率显著高于长记录;把 padding 比例当特征重要性排进前十。
解决

  1. 简单方法:统一取"记录尾部对齐"的 30 s 窗(多数记录恰为 30 s),不足者补零并传 mask;比"取头部 30 s"保守但稳定。
  2. 进阶方法:随机裁剪多窗 + mask-aware 池化(masked_mean),训练时每 epoch 换窗口起点,等效于时移增强(附 §6.4 的 mask 用法:masked_mean(x, mask) 只聚合有效位)。
  3. SOTA 方法:全序列输入 + 分段编码(如把序列切 10 s 块过 CNN,再 GRU/attention 聚合),冠军方案 ENCASE 与随机森林方案 Zabihi 均显式处理了时长变量;隐藏测试 0.83 的四支队伍无一使用"硬截 30 s 丢后半"策略。
    参考:Clifford et al. 2017 Table 4;ENCASE(hsd1503/ENCASE)预处理代码 preprocess_sub.m;torch-ecg CINC2017 文档。

⚠️ 坑点 2:Noisy 类仅 46 条(v1)的极端不平衡与标签版本漂移(分类:标签理解)

问题:v1 标签中 Noisy 仅 46/8,528(0.5%),常规训练几乎学不到;而 v2/v3 把 Noisy 重标到 284/279 条——约 230 条记录(多为原 Other)被重新定性。用 v1 训练、v3 验证(或反之)会静默错配约 3% 样本。
症状:Noisy 类 F1 波动剧烈(验证折中该类可能只有 3–5 条);相同模型换标签版本后总分漂移 1–3 个百分点却查不出原因。
解决

  1. 简单方法:全流程锁定 REFERENCE-v3.csv;训练时对 Noisy 过采样或加权(WeightedRandomSampler),推理时不把 Noisy 当"垃圾桶"。
  2. 进阶方法:把 Noisy 建模为独立的质量门控头(quality gate),主分类头只在 N/A/O 上优化;两阶段解耦可同时服务筛查与重录提示。
  3. SOTA 方法:官方评分不计 Noisy 类 F1(见坑点 8),因此把 Noisy 视为"重录请求"信号而非第四个竞争类是最符合临床逻辑的做法;集成方案中信号质量指数(SQI)被 LASSO 显式选为投票特征(Clifford 2017 的 LASSO+ 实验)。
    参考:Clifford et al. 2017 Table 2(三版标签分布);官方公告 2017-11-06(v3 发布)。

⚠️ 坑点 3:单导联信息量不足——与 12 导联结论不可互换(分类:偏倚陷阱)

问题:Lead I 只有一组电位差,无法评估 P 波电轴与多导联形态一致性;房扑、室上速、频发房早等在单导联上可能与 AF 形态难分。官方承认专家在"相当比例记录"上分歧显著并因此重标注——专家都难,模型更难。
症状:在 12 导联库(PTB-XL/CODE)上验证过的 AF 分类器拿到本库后敏感度骤降;"AF vs Other"混淆矩阵长期是最大误差源。
解决

  1. 简单方法:明确任务边界——本库只支持"单导联场景下的 AF 筛查基准",不要把它当 12 导联诊断研究的主数据源。
  2. 进阶方法:引入节律不齐的物理先验(RR 间期变异、Lorenz plot / Poincaré 特征),官方示例 sample2017.zip 的 Lorenz 方法即此思路,可与深度特征拼接。
  3. SOTA 方法:冠军 Teijeiro 方案用启发式推理显式建模"节律解释"而不仅是模式匹配; Hong 的 ENCASE 用 DNN + 专家特征集成——两者都把"单导联固有的解释不确定性"编码进模型。
    参考:Clifford et al. 2017(inter-expert disagreement 与赛中重标注);Teijeiro et al. 2017(paper #220);ENCASE(DOI 10.22489/CinC.2017.178-245)。

⚠️ 坑点 4:自建验证 F1 与隐藏测试 F1 存在 10–17 个百分点的系统性落差(分类:评估误用)

问题:官方 Table 4 实证:多支队伍在自建验证/训练集上取得 0.86–0.99,隐藏测试却只有 0.80–0.83(如 Datta 队 0.990→0.829,Hong 队 0.990→0.825,Zabihi 队 0.968→0.826)。
症状:本地 10 折 CV 0.92 的模型,对照官方排行榜 0.83 自信满满,实际同口径可能只有 0.82 上下;论文间"自报分数"横向比较严重失真。
解决

  1. 简单方法:把社区自报 CV 分数与官方 test 分数视为两套不可直接比较的量表;引用时注明口径(“CV 0.9x(自建划分)” vs “官方 test 0.83”)。
  2. 进阶方法:交叉验证时引入"赛后已知 test 分布"的诚实对照——报告多随机种子方差、用 v3 标签、并复算官方口径 F1(见坑点 8 代码)。
  3. SOTA 方法:官方 LASSO 加权集成(45 算法)把 test 分推到 0.868,说明在个体模型触顶后集成 + 校准是隐藏集稳健收益的唯一可靠来源;复现者优先跑通开源冠军代码(hsd1503/ENCASE)校准自己的 pipeline,再谈超越。
    参考:Clifford et al. 2017 Table 4;USF 幻灯(archive.physionet.org/challenge/2017/Clifford_Physionet_Challenge2017_USF_DS_Conference_October_15-17-2017.pdf)。

⚠️ 坑点 5:患者级泄漏不可排除 + 与 PTB-XL/CODE"不同源"——跨库混用双重陷阱(分类:数据泄漏)

问题:数据是患者自发多次录制的"偶然样本",但库内无患者 ID:记录级随机划分可能让同一患者的记录分居训练/验证两侧,验证分数虚高。另一方面,PTB-XL(12 导联、500 Hz、医院规范采集)与 CODE/CODE-15%(12 导联、400 Hz、巴西 TeleHealth 网络)与本库互不同源,把它们的性能数字与本库混排是常见错误。
症状:随机种子一换 F1 波动 1–2 个百分点且压不平;"PTB-XL 0.99 vs 本库 0.83"式的跨库比较得出错误结论(模型没变、分布变了)。
解决

  1. 简单方法:接受患者级 ID 缺失这一事实,用多随机种子 + 分层划分报告方差,论文中显式声明"患者级去重无法执行"。
  2. 进阶方法:按记录名排序分块划分(A00001–A07675 训练 / 其余验证)作为"伪分组"敏感性分析——若与随机划分结果差异大,说明泄漏效应显著。
  3. SOTA 方法:把外部验证放在不同设备/人群的独立采集上做"真实验证";跨库比较时统一报告各库的导联数、采样率、人群(本库 1 导联/300 Hz/自发录制 vs PTB-XL 12 导联/500 Hz/临床 vs CODE 12 导联/400 Hz/网络筛查),并只比较同库内相对提升。
    参考:官方页对数据来源的描述(AliveCor patient-initiated);Wagner et al. 2020(PTB-XL,DOI 10.1038/s41597-020-0495-6);Ribeiro et al. 2020(CODE,DOI 10.1038/s41467-020-15432-4)。

⚠️ 坑点 6:300 Hz 与主流 ECG 库采样率/增益不一致(分类:工程陷阱)

问题:本库 300 Hz(设备带通滤波),而 MIT-BIH 360 Hz、PTB-XL 500/1,000 Hz、CODE 400 Hz、CPSC 500 Hz。跨库混训/迁移时重采样口径不统一会引入混叠或长度错配;.hea 内增益(gain)与基线(baseline)逐文件可变,直接拿原始数值当 mV 用是错的。
症状:跨库模型"莫名"差几个点;把 val 原始值画出来发现振幅量级对不上其他库;拼接多库数据后 batch 长度报错。
解决

  1. 简单方法:全部重采样到统一频率(如 250 或 500 Hz)再进模型;重采样用有理分式(scipy.signal.resample_poly),不要用朴素线性插值。
  2. 进阶方法:读取 .hea 的 gain/baseline 把信号换算成 mV 再归一化;或直接逐记录 z-score 抹平增益差异(§6.3/§6.4 做法),并在跨库实验中对每库单独统计归一化参数。
  3. SOTA 方法:多库联合训练时把"来源库"作为域标签做域适应/条件批归一化,显式吸收采样与采集协议差异;跨库评估前先在 1 条记录上可视化对比波形形态,确认无 2 倍频类低级错误。
    参考:torch-ecg CINC2017 实现(fs=300,rec_ext=mat);Wagner et al. 2020(PTB-XL 采样说明);Ribeiro et al. 2020(CODE 400 Hz)。

⚠️ 坑点 7:Other rhythm 语义模糊——它不是"杂项",是 30% 的异质心律(分类:标签理解)

问题:Other 类 2,415–2,557 条(约 30%),内部混合房扑、室上速、窦缓/窦速、室性心律、起搏心律等;类内差异大于类间。v2/v3 重标注把它的一部分划给 Noisy、少数划给 AF——类边界本身在移动。
症状:二分类(AF vs 非 AF)时 Other 样本一半被误判成 AF,敏感度虚高而精确度崩塌;把 Other 当单一类做 subtyping 完全失效。
解决

  1. 简单方法:明确把任务声明为"AF 筛查"(AF vs 非 AF)而非"心律诊断",报告分混淆矩阵(AF↔Other 通道),不宣称 Other 类可解释。
  2. 进阶方法:对 Other 做无监督聚类(波形形态 + RR 变异性),把潜类别当协变量分析误判来源;二分类阈值在 Other 子群上单独扫描。
  3. SOTA 方法:多任务建模——主任务 AF 概率 + 辅助任务节律分解(embedding 聚类/无监督原型),冠军集成中多个成员本质上是"AF 专用检测器 + 其他类兜底"的组合;官方 LASSO 集成也证明"不同偏好的算法投票"比单一通用四分类器更稳。
    参考:Clifford et al. 2017 Table 2(v1→v3 类间迁移);官方规则页对四类的定义。

⚠️ 坑点 8:官方 F1 口径有两套——规则页 /4 vs 论文 /3,漏答按 Noisy 计(分类:评估误用)

问题:官方规则页写 F1 = (F1n + F1a + F1o + F1p) / 4(四类平均),而挑战总结论文公式 (1) 是 F1 = (F1n + F1a + F1o) / 3(Noisy 不计)。排行榜上的 0.83/0.87 是论文口径。另外官方规定"漏答记录按 Noisy 计"(Missing answers are treated as noise labels)。sklearn 的 f1_score(average='macro') 会把 Noisy 也平均进去,数值对不上官方。
症状:复现 0.83 时总差 1–3 个百分点却找不到 bug;用 macro-F1 报分被审稿人质疑与官方不可比。
解决

  1. 简单方法:按论文口径复算(N/A/O 三类 F1 平均),代码如下。
  2. 进阶方法:同时报告两种口径与 macro-F1(4 类),表格中三列并列,彻底消除歧义。
  3. SOTA 方法:直接使用官方脚本 score2017Challenge.m(sample2017.zip 内)做终评对账,本地实现仅用于快速迭代;提交类实验(如模拟挑战)时把"每队仅一次终评"的规则也模拟进去以反映真实信息量。
    参考:官方规则页(moody-challenge.physionet.org/2017,Scoring 节);Clifford et al. 2017 公式 (1);score2017Challenge.m。
import numpy as np

def official_f1(y_true, y_pred, include_noisy=False):
    """复现 2017 Challenge 官方评分口径。
    y_true/y_pred 取值 'N'/'A'/'O'/'~'(~ 为 Noisy)。
    默认 include_noisy=False → 论文公式 (1):F1 = (F1n + F1a + F1o) / 3
    include_noisy=True      → 规则页口径:F1 = (F1n + F1a + F1o + F1p) / 4
    官方还规定:漏答记录按 Noisy('~')计。"""
    classes = ("N", "A", "O", "~") if include_noisy else ("N", "A", "O")
    f1s = []
    for c in classes:
        tp = np.sum((y_true == c) & (y_pred == c))
        fp = np.sum((y_true != c) & (y_pred == c))
        fn = np.sum((y_true == c) & (y_pred != c))
        f1s.append(2 * tp / (2 * tp + fp + fn + 1e-12))
    return float(np.mean(f1s))

# 与 sklearn 对账(注意口径差异):
# from sklearn.metrics import f1_score
# f1_score(y_true, y_pred, average="macro")   # 四类全平均,≠ 官方 0.83 口径

配套的分类别诊断(定位误差来源,AF↔Other 通道是重点):

import pandas as pd

CODE2NAME = {"N": "Normal", "A": "AF", "O": "Other", "~": "Noisy"}
cm = pd.crosstab(pd.Series(y_true).map(CODE2NAME), pd.Series(y_pred).map(CODE2NAME),
                 rownames=["真实"], colnames=["预测"], dropna=False)
per_class_f1 = {c: official_f1(np.array(y_true) == c, np.array(y_pred) == c, include_noisy=True)
                for c in ("N", "A", "O", "~")}
print(cm)
print({CODE2NAME[c]: round(v, 3) for c, v in per_class_f1.items()})

§6.6 数据增强

增强 安全性 说明
随机时间窗裁剪(每 epoch 换起点) ✅ 安全 等效时移,AF 阵发的位置信息不被破坏
幅值缩放 / 高斯噪声 ✅ 安全 模拟接触阻抗与肌电差异;幅度控制在 ±10% 与 SNR ≥ 20 dB
随机时间拉伸(±5%) ✅ 安全(谨慎) 模拟心率变化;过度拉伸会伪造节律
时间反转 ❌ 危险 P-QRS-T 极性与顺序被破坏,产生生理不存在的波形
跨类 mixup(波形线性混合) ❌ 危险 两条节律线性叠加不是任何真实心律
过度增益 / 削波模拟 ❌ 危险 大幅削波记录在库中属 Noisy 语义,混入训练会污染质量门控

增强策略的验证方法:对每种候选增强,先在 20 条记录上可视化"原图 vs 增强图"并请心电判读同事盲评"是否仍为可判读的真实节律"——任何一种让判读者犹豫的增强都不应进入训练。经验上,时移与幅值缩放对四类的标签语义均安全,而频域类增强(如频谱扰动)容易破坏 f 波与 QRS 形态的类间边界,不建议在本库使用。

§6.7 模型推荐

模型 类型 特点 适配本库的理由
ResNet1D 端到端 CNN resnet1d 开源实现,验证 AUC 0.931 / F1 0.762 冠军同源 backbone,社区最易复现
ResNet + GRU/attention CNN-RNN 混合 处理变长与长程节律依赖 变长序列友好(Zihlmann 等路线,test 0.821)
CNN/Transformer + 序列池化 端到端注意力 逐段注意力聚合可吸收变长 无需定长输入;需 8,528 条以上的增强策略配合
专家特征 + 随机森林 特征工程 RR 变异性、频域熵、Lorenz 图 可解释、CPU 可训(Zabihi 路线,test 0.826)
DNN + 专家特征集成(ENCASE) 集成 官方冠军之一,test 0.825 官方开源(GPL-3.0),可直接对账
启发式推理系统 规则+推理 显式节律解释,test 0.831(最高单队) Teijeiro 路线,适合研究"解释不确定性"

§6.8 硬件需求

配置 适用阶段 说明
CPU 8 核 + 16 GB RAM 特征工程 / 随机森林 全库 float32 约 333 MB(截 30 s),内存充裕
1×GPU 8 GB(如 RTX 3060) CNN 端到端训练 batch 64 × 9,000 点占用 <4 GB
1×GPU 16 GB+ 集成/长序列全量输入 18,300 点全序列 + 多折并行建议 16 GB

§6.9 评估指标

见坑点 8 的 official_f1 实现(论文口径 /3 为默认)。配套建议:二分类任务报告 F1-AF 与敏感度/特异度;多分类附加混淆矩阵;所有报告标注"标签版本(v3)+ 划分种子 + 评分口径"三元组,缺失任一即不可复现。

§6.10 MLOps 笔记

  • 数据版本化:把 REFERENCE-v1/v2/v3 三版 CSV 纳入 DVC/git-lfs 管理,训练配置显式记录 label_version=v3
  • 口径守恒:训练、验证、终评三处共用同一 official_f1 函数(单一实现、单元测试锁定)。
  • 漂移监控:上线后按月监控输入分布(时长、z-score 均值方差、Noisy 率),Noisy 率突增往往预示设备/人群变化而非疾病谱变化。
  • 可复现存档:引用官方 results 页快照(physionetchallenges.org/2017/results/)作为排行榜对账基准;开源仓库(ENCASE/resnet1d)锁定 commit hash。

上线前 CI 检查清单(每项对应一个本库特有失效模式):

检查项 断言 防护的坑点
标签版本锁定 训练配置 hash == REFERENCE-v3.csv hash 坑点 2
口径单元测试 official_f1 在构造混淆矩阵上等于手算值 坑点 8
序列长度分布 batch 内有效长度中位数在 2,700–18,300 区间 坑点 1
采样率断言 所有 .hea 的 fs == 300 坑点 6
划分不相交 train/val 记录名交集为空 坑点 5
类别覆盖率 验证集四类均非空 坑点 2/7

§7 质量评估与局限性

§7.1 已知偏倚

偏倚类型 描述 严重程度 缓解措施
选择偏倚 患者自发录制:有症状/关注健康人群过代表,人群构成不明 外部前瞻验证;结论限定为"自检场景"
标注偏倚 专家分歧显著,赛中重标注使标签随版本漂移(Noisy 46→284→279) 锁定 v3;对争议样本做不确定性估计
类别不平衡 Normal 60.4% vs Noisy 0.5%(v1);AF 仅 9.0% 加权损失/重采样;报告分类别 F1
设备偏倚 单一 AliveCor 设备谱系,其他消费设备外推未验证 跨设备采集验证后再部署
评分偏倚 隐藏集不可见 + 提交次数限制诱导过拟合隐藏集 复现实验只用自建划分;排行榜数字标注口径

§7.2 标注质量

记录级四分类标签由专家人工给出,经赛中算法辅助仲裁演进出 v3。官方披露的量化证据有限:三版标签的类间迁移规模(约 230 条被重划为 Noisy 等)本身就是标注不确定性的直接度量[1]。没有逐条标注者间一致性系数(如 Cohen’s κ)公布——这是该库相对 PTB-XL(有标注协议文档)的明显短板。使用建议:对高 stakes 应用,先在样本上做双盲复标(或用模型集成一致度)估计本地标签噪声率。

从方法论角度,2017 年挑战的"算法辅助仲裁"是一次超前的尝试:用参赛算法共识定位争议记录、再由专家复议,与后来标签噪声文献中的 confident learning 与 Dawid-Skene 类聚合思路同源。这也提示一个实用技巧:训练早期用模型集成找出与本库标签冲突最大的 1%–2% 样本,往往恰好对应官方重标注时迁移的那些记录——把它们交给领域专家复议,性价比远高于全局清洗。

§7.3 泛化性

部署场景 失效风险 证据
同类设备(手持单导联)新人群 中——人群结构不明 数据人群未公开;§2.4
智能手表(腕式光学/腕部电) 高——采集原理与接触位置不同 官方未发布任何腕式数据对照
医院 12 导联记录 高——单导联模型不适用 12 导联输入 坑点 3/6;跨库不同源
噪声环境(运动中) 高——库内 Noisy 语义来自静息自检 Noisy 类定义与运动伪影谱不同
其他地域/肤色人群 中-高——无人口学标签,无法评估公平性 §7.5

泛化失效的三级递进信号值得写入模型监控:第一级是输入分布漂移(时长、振幅统计、Noisy 率变化),可无监督检测;第二级是校准漂移(AF 概率的 PR 曲线形状变化但排序能力保留),需要小规模标注重校准;第三级是排序能力本身的崩塌(AUC 显著下降),说明域差超出模型表达范围,需要重新训练。本库标签口径(记录级四分类)与多数部署场景(连续监测中的片段级提示)存在粒度差,报告敏感度/特异度时应声明"记录级"语境。

§7.4 伦理

数据由 AliveCor 捐赠、组织方去标识后公开,无 PHI 字段;ODC-By 1.0 允许广泛使用。挑战官方明确声明数据捐赠方不因挑战获得参赛者算法的权利。原始采集的知情同意范围官方未详细披露(患者自发使用消费设备的常规使用条款语境),二次使用时应避免个体重识别尝试并遵守署名要求。

§7.5 公平性

库内无年龄/性别/种族字段,任何亚组公平性审计无法在本库内直接执行。间接风险:自发录制人群的设备可及性偏差(消费设备价格门槛)可能使低收入群体欠代表;AF 患病率随年龄陡增而库内年龄不明,模型在老年高患病率场景的校准需外部数据确认。建议在下游应用中以"年龄/性别分层的方向性错误率"作为部署前必测项。

§7.6 数据漂移

本库定格于 2017 年(v3 标签后未再更新),十年间消费 ECG 设备谱系、噪声特性与人群使用习惯均显著演化;新一代可穿戴数据与本库存在设备漂移 + 时代漂移叠加。模型迭代时建议:保留本库做"历史锚点基准",新增近期采集数据做漂移监测(PSI/时长分布/Noisy 率),并警惕"在 2017 基准上刷分"与"在 2026 设备上有效"的脱节。

具体监控建议分两层:数据层跟踪每条推理记录的时长分布、采样质量指标与 Noisy 疑似率(三者的显著漂移通常先于性能衰减出现);模型层则用本库的 500 条固定分层子集做季度回归测试——由于本库永不更新,任何回归测试分数的变化都只能来自模型侧,这使它成为极干净的回归探针。这一"冻结基准做回归探针"的用法,是老数据集在 MLOps 时代的第二生命。

§7.7 DAIMS 24 项评估

# 检查项 状态 说明
1 宽格式 每记录一行信号 + 一行标签,扁平结构,加载即用
2 唯一标识 记录级主键 A00001–A08528 唯一且与文件名一致
3 特殊字符 文件名/标签码均为 ASCII;标签码 “~” 已文档化
4 重复行 ⚠️ 记录级无重复;但无患者 ID,同一患者多条记录无法识别去重
5 缺失编码 波形无缺失采样;"缺失"语义由 Noisy 类显式承载
6 标签标识 ⚠️ 三版标签(v1/v2/v3)并存,必须显式锁定版本才能复现
7 罕见类分组 ⚠️ Noisy 类 v1 仅 46 条(0.5%),分层 CV 时易缺席
8 偏倚评估 ⚠️ 人群结构不透明;自发录制选择偏倚有定性描述、无定量校正
9 数据字典 .hea 头 + 官方页文档完备;字段语义清晰
10 信息性缺失解释 Noisy = "专家不可判读"的有效语义,官方规则页明示
11 设备记录 单一 AliveCor 设备谱系、300 Hz、带通滤波,规格明确
12 共线性 单通道信号,无多变量共线性问题
13 编码映射 ⚠️ N/A/O/~ 缩写需映射全名;ICD/SNOMED 需自行建立(见 §2.1)
14 时间戳处理 无时间戳字段;时长由采样点数精确可导出
15 划分建议 ⚠️ 官方只有训练/隐藏测试,无公开验证划分,需自建
16 泄漏讨论 ⚠️ 患者级泄漏不可排除(无 ID);官方未提供分组字段
17 标签分布 ⚠️ 60.4/9.0/30.0/0.5 极端不平衡,需加权或重采样
18 测量偏倚 ⚠️ 患者自发定位设备,接触质量不可控(Noisy 语义来源)
19 外部验证建议 官方与社区提供跨库路线(Phys. Meas. Focus Issue、§5.5)
20 版本记录 v1.0.0 数据 + 三版标签公告日期齐全,溯源清晰
21 预处理脚本 ⚠️ 官方仅示例入口(Lorenz 两分类);标准管线依赖社区代码
22 合规要求 ODC-By 1.0 开放、无注册/培训门槛,署名即可用
23 多模态对齐 单模态数据集,无对齐需求(结构上天然无此风险)
24 去标识化 无 PHI/人口学字段;官方确认去标识后发布

DAIMS 评分:19.0 / 24

评分解读:14 项 ✅、10 项 ⚠️、0 项 ❌。本库在"数据本身"维度近乎满分——波形完整、无缺失、主键清晰、许可开放;扣分集中在"元数据与过程"维度:无患者 ID、无人口学字段、无官方验证划分、标签三版本并存、标注一致性无量化披露。这些 ⚠️ 全部源于 2017 年挑战赛"快速建库、赛后冻结"的历史语境,而非数据质量问题。

对你意味着什么

  1. 可以直接开工:下载、解压、训练全链路无审批门槛,一天内可复现冠军基线(ENCASE 开源,GPL-3.0)。
  2. 三件事必须自己补:锁定 v3 标签、自建分层划分(多种子报告方差)、用论文口径 F1(N/A/O 三类平均)对账。
  3. 两条红线不要碰:不要把它当 12 导联诊断数据源;不要在无外部验证的情况下宣称临床泛化(人群不透明 + 单设备谱系)。
  4. 论文写作时:患者级泄漏不可排除的事实要显式声明,否则同行评审大概率会抓。

§7.8 外部验证矩阵

外部数据集/场景 来源机构 评估任务 性能指标 相对内部变化 关键发现
官方隐藏测试集(3,658 条) Emory/MIT + AliveCor 四分类挑战评分 冠军 F1 0.83;LASSO+ 集成 0.87 相对自建验证 0.86–0.99 下降 3–17 个百分点 赛中 75 队中 4 队并列第一(Clifford et al. 2017 Table 4)
自建验证集(10% 保留) 各参赛团队 四分类挑战评分 top8 团队 0.86–0.99 过拟合训练分布普遍,隐藏集分数才是真值
ResNet1D(ENCASE PyTorch 重实现) 北京大学团队(hsd1503) 四分类(自建 90/10) 验证 AUC 0.931 / F1 0.762 / Acc 0.769 显著低于其挑战期成绩 开源可复现基线;K-margin IJCAI 2019 论文同源
Phys. Meas. Focus Issue(Vol 39, 2018) 多国团队 v3 标签下的赛后再评估 见各论文 部分成绩因标签 v3 不再可复现 赛后标签修订使排行榜数字与期刊数字存在口径差

矩阵解读:真正意义上的"外部验证"(新设备、新人群、前瞻采集)在官方文献中是缺位的——这是该库作为 2017 年挑战赛产物的时代局限。表中列出的证据都在"同一数据分布内的划分差异"层面,因此其数值落差应理解为过拟合与口径差的度量,而非人群泛化性的度量;后者必须由使用者自行设计外部实验来补齐。


§8 基准性能与生态

§8.1 排行榜(官方终评,F1 = (F1n+F1a+F1o)/3 口径)

排名 模型/队伍 性能(test) 年份 关键技术 完整引用 代码
=1 Teijeiro et al. 0.831(valid 0.912) 2017 短单导联的启发式/溯因节律推理 Teijeiro, T., García, C. A., Félix, P., Castro, D., 2017, Computing in Cardiology 44, paper #220(官方结果页 官方存档
=1 Datta et al.(TCS) 0.829(valid 0.990) 2017 级联二分类器 + 时频特征 Datta, S., Puri, C., Mukherjee, A., et al., 2017, Computing in Cardiology 44, paper #209(官方结果页 官方存档
=1 Zabihi et al. 0.826(valid 0.968) 2017 音频域特征 + 随机森林 Zabihi, M., Bahrami Rad, A., Katsaggelos, A. K., et al., 2017, Computing in Cardiology 44(官方结果页 官方存档
=1 Hong et al.(ENCASE) 0.825(valid 0.990) 2017 DNN + 专家特征集成 Hong, S., Wu, M., Zhou, Y., et al., 2017, Computing in Cardiology 44. DOI 10.22489/CinC.2017.178-245 hsd1503/ENCASE
=5 Baydoun et al. 0.822 2017 特征 + 集成 Baydoun, M., et al., 2017, Computing in Cardiology 44(官方结果页 官方存档
=5 Bin et al. 0.821 2017 深度 + 特征混合 Bin, G., et al., 2017, Computing in Cardiology 44(官方结果页 官方存档
=5 Zihlmann et al. 0.821 2017 ResNet + LSTM Zihlmann, M., Perekrestenko, D., Tschannen, M., 2017, Computing in Cardiology 44(官方结果页 官方存档
=5 Xiong et al. 0.818 2017 CNN(谱域原始数据) Xiong, Z., et al., 2017, Computing in Cardiology 44(官方结果页 官方存档
官方 LASSO+ 集成(45 算法) 0.868 2017 加权投票 + 信号质量特征 Clifford, G. D., et al., 2017, Computing in Cardiology 44. DOI 10.22489/CinC.2017.065-469

⚠️ 数值不可直接比较:① 官方仅保留 2 位小数授奖(四队并列即由此产生),第 3 位小数无统计显著性;② 各队自报 CV 分数量表不可横向比较(坑点 4);③ 赛后 v3 标签使部分队伍的自建验证数字与现行标签不完全对应。

§8.2 SOTA 总结与选型建议

2017 年冠军层(0.82–0.83)已把"单模型 + 手工/深度特征"推到接近数据上限:官方 45 算法集成(0.868)与 75 算法全投票(0.855)证明剩余空间在多样性集成而非单模型架构。2018 年后社区在自建划分上的 CV 分数普遍进入 0.85–0.90 区间,但受隐藏集不可见所限,"官方口径 SOTA"仍以 0.868 为锚。选型建议:复现研究选 ENCASE/resnet1d(开源、可对账);应用原型选 ResNet+GRU 或 ResNet1D + 集成;研究解释性选 Teijeiro 溯因路线

从方法演进看,四支冠军队伍恰好覆盖了四条互补路线:随机森林 + 音频域特征(Zabihi)、级联二分类器 + 时频特征(Datta)、DNN + 专家特征集成(Hong/ENCASE)、启发式溯因推理(Teijeiro)。它们在隐藏集上挤在同一 0.82–0.83 区间的事实,比任何单队分数都更有信息量——标签的信息上限(专家间分歧 + 单导联固有模糊)很可能是当前成绩的主要约束,而非模型容量。后续想把分数推向 0.87+ 的工作,几乎都走了"更多样成员 + 学习化投票权重"的集成路线(官方 LASSO/LASSO+ 系列实验是这一方向的直接证明),而非追求单模型更深。

§8.3 评测协议

官方流程:非官方阶段(2017-02 至 2017-04-09)→ 官方阶段(至 2017-09-01,提交次数受限、超限队伍被判非官方)→ 每队选定唯一最终算法于 2017-09-06 前提交 → 全量隐藏测试评分(自动运行,含运行时限)→ 并列按"奥运模式"分奖[1]。评分脚本 score2017Challenge.m 与答案格式说明(ANSWERS.md)随 sample2017.zip 公开。本地复现的等价协议:v3 标签 + 分层 10 折 + 论文口径 F1 + 多种子方差。

协议要素 官方挑战 本地复现的近似做法
训练数据 8,528 条(v1–v3 标签随赛程更新) 8,528 条,锁定 v3
验证 无官方验证集,参赛者自建 分层 10 折 CV,5 种子报告均值±标准差
终评 3,658 条隐藏测试,每队仅一次 不可复现;以官方 0.83/0.868 为外部锚点
评分口径 论文公式 (1):三类平均(Noisy 不计) official_f1()(坑点 8)默认参数
漏答处理 按 Noisy 计 推理强制四类输出,禁止空答案

§8.4 相关数据集

数据集 关系 导联/采样率 适用
PTB-XL 跨库对照(不同源) 12 导联 / 500 Hz 大规模 12 导联预训练与多标签
CODE / CODE-15% 跨库对照(不同源,巴西网络) 12 导联 / 400 Hz 超大规模 AF 筛查训练
CPSC 2018 跨库对照 12 导联 / 500 Hz 9 类心律细分
MIT-BIH Arrhythmia 心搏级互补 2 导联 / 360 Hz 心搏级经典基准
CinC Challenge 2021 后继挑战 12 导联(26 源) 跨域泛化主题延续

跨库选型的一句话原则:本库回答"单导联短记录能做多好",PTB-XL/CODE 回答"12 导联丰富信息能做多好"——两问不可互相替代;若产品形态是单导联设备,跨库训练反而可能稀释对本库噪声谱的拟合,建议以本库为主训练、跨库仅做特征/表示的预训练迁移。

§8.5 关键论文 Top 10

  1. Clifford, G. D., Liu, C., Moody, B., Lehman, L.-W. H., Silva, I., Li, Q., Johnson, A. E., Mark, R. G., 2017, Computing in Cardiology 44. DOI 10.22489/CinC.2017.065-469 —— 挑战总结:任务定义、评分公式、重标注与排行榜。
  2. Hong, S., Wu, M., Zhou, Y., Wang, Q., Shang, J., Li, H., Xie, J., 2017, Computing in Cardiology 44. DOI 10.22489/CinC.2017.178-245 —— ENCASE 冠军方案:DNN 与专家特征集成。
  3. Hong, S., Zhou, Y., Wu, M., Shang, J., Wang, Q., Li, H., Xie, J., 2019, Physiological Measurement 40(5):054009. DOI 10.1088/1361-6579/ab15a2 —— ENCASE 期刊扩展版。
  4. Teijeiro, T., García, C. A., Félix, P., Castro, D., 2017, Computing in Cardiology 44, paper #220 —— 溯因推理节律判读,单队最高分。
  5. Zabihi, M., Bahrami Rad, A., Katsaggelos, A. K., Kiranyaz, S., Narkilahti, S., Gabbouj, M., 2017, Computing in Cardiology 44 —— 随机森林 + 音频域特征冠军方案。
  6. Zhou, Y., Hong, S., Wu, M., Shang, J., Wang, Q., Xie, J., Li, H., 2019, IJCAI —— K-margin 残差卷积循环网络的 AF 检测(resnet1d 前身)。
  7. Wagner, P., et al., 2020, Scientific Data 7:56. DOI 10.1038/s41597-020-0495-6 —— PTB-XL:与本库对照的标准 12 导联库。
  8. Ribeiro, A. H., et al., 2020, Nature Communications 11:1760. DOI 10.1038/s41467-020-15432-4 —— CODE:巴西 TeleHealth 超大规模 12 导联库(不同源)。
  9. Lip, G. Y. H., et al., 2016, Nature Reviews Disease Primers 2:16016. DOI 10.1038/nrdp.2016.16 —— AF 综述:流行病学与管理框架(挑战论文首引)。
  10. Goldberger, A. L., et al., 2000, Circulation 101(23):e215–e220. DOI 10.1161/01.CIR.101.23.e215 —— PhysioNet 平台奠基文献(官方要求并列引用)。

§8.6 社区活跃度

Google Scholar 引用 1,120+(截至 2026-09);OpenAlex 口径 623 次(截至 2026-09)。冠军代码 hsd1503/ENCASE 与 hsd1503/resnet1d 至今可访问并被持续 fork;torch-ecg 等主流信号库内置 CINC2017 加载类;Phys. Meas. 2018 Focus Issue(Vol 39)收录系列跟进论文。官方 sources 存档自 2018-04-27 起永久开放。

十年间该库的角色也在演变:2017–2019 年它是"挑战赛排行榜"(刷分语境);2020 年后随着 PTB-XL/CODE 等更大规模库出现,它转型为"单导联可穿戴场景的对照锚点"——新模型在 12 导联库上训练后,仍会回到本库验证"降维到单导联短记录"的鲁棒性;2023 年后它进一步成为自监督预训练与基础模型的跨模态评测项之一(单导联子任务)。这种"基准的基准"定位使其引用曲线在发布十年后仍未见明显衰减。

§8.7 生态快照

资源 类型 链接 状态(截至 2026-09) 推荐理由
ENCASE 冠军代码 GitHub hsd1503/ENCASE 可访问,GPL-3.0 唯一附带完整预处理 + 官方评分脚本的冠军实现
resnet1d GitHub hsd1503/resnet1d 可访问 ENCASE 的 PyTorch 现代化重实现
官方挑战存档 网站 archive.physionet.org/challenge/2017 永久存档 三版标签、提交规则、公告全史
官方结果页 网站 physionetchallenges.org/2017/results 可访问 75 队分数 + 论文 + 源码入口
torch-ecg CINC2017 Python 库 文档 维护中 一行代码加载与统计
官方总结论文 PDF 论文 cinc.org/archives/2017/pdf/065-469.pdf 可访问 公式 (1) 与 Table 4 的原始出处

§9 相关资源与引用

官方资源

社区资源

BibTeX 完整引用

@inproceedings{clifford2017af,
  author    = {Clifford, Gari D. and Liu, Chengyu and Moody, Benjamin and
               Lehman, Li-wei H. and Silva, Ikaro and Li, Qiao and
               Johnson, Alistair E. and Mark, Roger G.},
  title     = {{AF Classification from a Short Single Lead ECG Recording}:
               the PhysioNet Computing in Cardiology Challenge 2017},
  booktitle = {Computing in Cardiology},
  volume    = {44},
  year      = {2017},
  pages     = {1--4},
  publisher = {IEEE},
  doi       = {10.22489/CinC.2017.065-469}
}

@article{goldberger2000physiobank,
  author  = {Goldberger, Ary L. and Amaral, Luis A. N. and Glass, Leon and
             Hausdorff, Jeffrey M. and Ivanov, Plamen Ch. and Mark, Roger G. and
             Mietus, Joseph E. and Moody, George B. and Peng, Chung-Kang and
             Stanley, H. Eugene},
  title   = {{PhysioBank, PhysioToolkit, and PhysioNet}: Components of a New
             Research Resource for Complex Physiologic Signals},
  journal = {Circulation},
  volume  = {101},
  number  = {23},
  pages   = {e215--e220},
  year    = {2000},
  doi     = {10.1161/01.CIR.101.23.e215}
}

@inproceedings{hong2017encase,
  author    = {Hong, Shenda and Wu, Meng and Zhou, Yuxi and Wang, Qingyun and
               Shang, Junyuan and Li, Hongyan and Xie, Junqing},
  title     = {{ENCASE}: an {ENsemble ClASsifiEr} for {ECG} Classification
               Using Expert Features and Deep Neural Networks},
  booktitle = {Computing in Cardiology},
  volume    = {44},
  year      = {2017},
  doi       = {10.22489/CinC.2017.178-245}
}

@article{hong2019combining,
  author  = {Hong, Shenda and Zhou, Yuxi and Wu, Meng and Shang, Junyuan and
             Wang, Qingyun and Li, Hongyan and Xie, Junqing},
  title   = {Combining Deep Neural Networks and Engineered Features for Cardiac
             Arrhythmia Detection from {ECG} Recordings},
  journal = {Physiological Measurement},
  volume  = {40},
  number  = {5},
  pages   = {054009},
  year    = {2019},
  doi     = {10.1088/1361-6579/ab15a2}
}

@article{wagner2020ptbxl,
  author  = {Wagner, Patrick and Strodthoff, Nils and Bousseljot, Ralf-Dieter and
             Kreiseler, Dieter and Lunze, Frank I. and Samek, Wojciech and
             Schaeffter, Tobias},
  title   = {{PTB-XL}, a Large Publicly Available Electrocardiography Dataset},
  journal = {Scientific Data},
  volume  = {7},
  pages   = {56},
  year    = {2020},
  doi     = {10.1038/s41597-020-0495-6}
}

@article{ribeiro2020code,
  author  = {Ribeiro, Ant{\^o}nio H. and Roque, Manoel Hora and Paix{\~a}o, Thiago M. and
             Ribeiro, Marcelo H. and Terence, Marcelo C. and Ribeiro, Antonio Luiz P. and
             Gama, Jaakko and others},
  title   = {{CODE}-15\%: A Large Scale Dataset for {ECG} Representation Learning},
  journal = {preprint},
  year    = {2020}
}

@article{ribeiro2020automatic,
  author  = {Ribeiro, Ant{\^o}nio H. and Ribeiro, Manoel Hora and Paix{\~a}o, Gabriela M. M. and
             Oliveira, Derick M. and Gomes, Paulo R. and Canazart, J{\'e}ssica A. and
             Pinto, Milton P. S. and others},
  title   = {Automatic Diagnosis of the 12-Lead {ECG} Using a Deep Neural Network},
  journal = {Nature Communications},
  volume  = {11},
  pages   = {1760},
  year    = {2020},
  doi     = {10.1038/s41467-020-15432-4}
}

@article{lip2016atrial,
  author  = {Lip, Gregory Y. H. and Fauchier, Laurent and Freedman, S. Ben and
             Van Gelder, Isabelle and Natale, Andrea and Gianni, Corinna and
             Nattel, Stanley and Potpara, Tatjana and Rienstra, Michiel and
             Tse, Hung-Fat and Lane, Deirdre A.},
  title   = {Atrial Fibrillation},
  journal = {Nature Reviews Disease Primers},
  volume  = {2},
  pages   = {16016},
  year    = {2016},
  doi     = {10.1038/nrdp.2016.16}
}

@article{goldberger2000physionetalias,
  author  = {Pollard, Tom J. and Moody, Benjamin E. and Lehman, Li-wei H. and others},
  title   = {PhysioNet as a Global Platform for Biomedical Research},
  journal = {Nature Health},
  year    = {2026},
  doi     = {10.1038/s44360-026-00096-z}
}

引用指南:使用本数据集至少并列引用 Clifford et al. 2017 与 PhysioNet 平台文献(官方硬性要求);复现排行榜时补引对应队伍论文;跨库对比时引用 PTB-XL/CODE 原始文献。

建议学习路径

  1. 第一步(0.5 天):下载 v1.0.0 + v3 标签,跑通 §6.1/§6.4 读取与 DataLoader,用 official_f1 建立逻辑回归/简单 CNN 基线,理解四分类的数据体感。
  2. 第二步(1–2 天):克隆 hsd1503/ENCASE 与 hsd1503/resnet1d,对齐验证分数(resnet1d README 给出 AUC 0.931/F1 0.762 参考值),把 §6.5 八个坑点逐条代入自己的 pipeline 排查。
  3. 第三步(按需):按 §5.5 做跨库外部验证(PTB-XL/CODE),或按坑点 2/7 研究标签版本演化与 Other 类分解;发表时按 §9 引用指南组织参考文献。

§10 AI 使用声明卡

§10.1 本页面生产使用的 AI 模型

环节 模型 用途
资料检索与整理 CodeBuddy(fast-model) 官方页面/论文要点提取、事实核对辅助
初稿撰写 CodeBuddy(fast-model) 依照写作宪法生成章节草稿

§10.2 AI 参与范围

AI 参与了检索汇总、结构组织、代码示例编写与文本润色;关键数字(规模、分布、分数、日期、license)均回溯至官方页面、挑战总结论文或原始仓库,经人工核对后写入;医学编码映射(ICD-11/SNOMED CT)经编辑部人工复核。

§10.3 输入来源

  1. Clifford, G. D., et al., 2017, Computing in Cardiology 44. DOI 10.22489/CinC.2017.065-469(PDF
  2. PhysioNet 数据页:AF Classification…Challenge 2017, v1.0.0
  3. Moody Challenge 规则页:moody-challenge.physionet.org/2017
  4. 历史存档与公告:archive.physionet.org/challenge/2017
  5. 官方结果页:physionetchallenges.org/2017/results
  6. 文件清单与大小:physionet.org/files/challenge-2017/1.0.0
  7. PubMed 摘要:PMID 29862307
  8. PMC 全文:PMC5978770
  9. ENCASE 官方仓库:github.com/hsd1503/ENCASE
  10. resnet1d 模型库:github.com/hsd1503/resnet1d
  11. torch-ecg CINC2017 文档:readthedocs
  12. Clifford USF 演讲 PDF(2017-10):archive.physionet.org
  13. Google Scholar 引用统计:Clifford 2017 引用页(截至 2026-09 检索)

§10.4 人工校验记录

内容模块 审核者 审核方式 审核状态
§1 概览与规模数字 千方病案医学编辑部 逐项对照官方页与论文 Table 2/4 ✅ 已通过/已验证
§2 医学背景与 ICD-11/SNOMED 映射 千方病案医学编辑部 医学编码库复核 + 编辑交叉审 ✅ 已通过/已验证
§3–§4 规格与 DAIMS 数据字典 千方病案医学编辑部(数据工程) 抽样下载实测(zip 大小/格式/标签码) ✅ 已通过/已验证
§6 代码示例 千方病案医学编辑部(数据工程) 本地小样本试运行 ✅ 已通过/已验证
§7 DAIMS 24 项与偏倚分析 千方病案医学编辑部 对照宪法清单逐项核验 ✅ 已通过/已验证
§8 基准数字 千方病案医学编辑部 与官方 Table 4/results 页逐行比对 ✅ 已通过/已验证
§9 BibTeX 千方病案医学编辑部 DOI 逐条解析校验 ✅ 已通过/已验证

§10.5 AI 生成章节标注

全部章节由 AI 辅助起草(§1–§10 与 JSON-LD 块);§0 审核声明、三段免责声明与 §10.4 校验记录为人工定稿。

§10.6 最后人工审核日期

2026-09-05(与 §0 审核日期一致)

页面状态:published(全部内容已完成审核并发布)

返回 AI-Ready 数据集