信息速览
几乎所有用过 MIMIC-III 的人都会在某一步停下来:把那张二十六张表的关系型数据库,切成模型能吃的东西。切法有无数种——化验值取哪几个、用药怎么编码、时间窗多宽、既往住院算不算进当前样本、死亡标签从哪张表里取。每一种切法都合理,每一种都写进了某篇论文的方法段,于是同一个「MIMIC-III 上的死亡率预测任务」,在不同论文里对应着不同的输入张量。复现的困难不在模型,而在模型之前那段没人愿意完整公开的预处理。
MIMIC-III 序列样本库(MIMIC-III - SequenceExamples for TensorFlow modeling)就是把这个「之前」冻结成文件的一次尝试。它由谷歌健康(Google Health)的三名研究者制作,2020 年 9 月 29 日交给 PhysioNet,只有一个版本。做法是把 MIMIC-III v1.4 先映射到 HL7 FHIR 标准,再从 FHIR 转成 TensorFlow 的 tf.SequenceExample:每一次住院变成一条带时间轴的样本,标签塞在同一份样本里。你拿到的不再是表,而是四个已经切好的 TFRecord 文件集合。
这件事的价值与它的局限是同一件事的两面。它省掉的正是最容易出错的那段工程,代价是你也就失去了对那段工程的控制权——预处理的口径被固定进二进制,改一个字段就要回到上游重做。下面先给一屏速览,再说清楚哪一半是它替你决定的、哪一半必须由你自己补。
| 维度 | 内容 |
|---|---|
| 全名 | MIMIC-III - SequenceExamples for TensorFlow modeling |
| 中文简称 | MIMIC-III 序列样本库 |
| 发布方 | PhysioNet;制作方为 Google Health 的 Jonas Kemp、Kun Zhang、Andrew Dai |
| 首次发布 | 2020 年 9 月 29 日,版本 1.0.0 |
| 最近改动 | 无。至今只有 1.0.0 一个版本 |
| 样本数量 | 官方页未给出数字;以 MIMIC-III v1.4 中住院时长满 24 小时的住院为池,需登录后在目录内清点 |
| 患者规模 | 继承 MIMIC-III v1.4,超过四万名重症患者 |
| 预测任务 | 4 个,对应 4 个顶层文件夹 |
| 预测时点 | 2 种:入院后 24 小时、出院时 |
| 标签种类 | 3 种:住院死亡、全部出院诊断 ICD-9 码、主要诊断 CCS 分组 |
| 纳入边界 | 仅住院时长 ≥ 24 小时;CCS 任务另剔除 1.3% 主要诊断属不可计费 ICD-9 码的住院 |
| 划分方式 | 约 80% 训练 / 10% 验证 / 10% 测试,按患者 ID 切分 |
| 文件格式 | TFRecord,逐条为 tf.SequenceExample 协议缓冲 |
| 词表 | 每个任务文件夹内一份 ZIP,含 {特征名}.txt 与 {特征名}_freqs.csv |
| 上游来源 | MIMIC-III Clinical Database v1.4(贝斯以色列女执事医疗中心,2001–2012) |
| 许可 | PhysioNet Credentialed Health Data License 1.5.0 |
| 访问门槛 | 仅凭证用户;须完成 CITI 培训并签署 DUA 1.5.0 |
| DOI | 本版 10.13026/n2v5-5b32;latest 10.13026/6jx9-cy34 |
| 典型用途 | 序列模型的基线复现、EHR 预处理口径对照组、教学用的「已就绪」样本 |
§1 它要解决的具体麻烦
1.1 同一份 MIMIC-III,四种预处理,四个结果
MIMIC-III 自 2016 年发布后迅速成为电子病历机器学习的事实基准。它的问题从来不是数据不够,而是数据太自由:二十六张表之间用 SUBJECT_ID、HADM_ID、ICUSTAY_ID 三级主键相连,事件表按 ITEMID 存放,具体含义要回字典表查。研究者面对的第一道工序不是建模,是决定「什么算一个事件」。
这道工序里每一个决定都会改变结果。化验值是否做对数变换、异常值截断在哪个分位、用药是按成分还是按商品名编码、每小时的聚合用均值还是末值、既往住院是否拼接到当前样本、死亡标签取住院内死亡还是 30 天死亡——这些选择在论文里通常只占方法段的两三句话,却足以让同一个模型在两个复现之间差出好几个百分点。作者在背景段把这一点写得很直白:不同分析采用不同的预处理方法,精确复现跨研究的结果因此变得困难。
举一个最小的例子。同一条住院,甲研究把每小时的生命体征取均值作为该小时的向量,乙研究取末值;当某小时只有一次记录时两者相同,有六次记录时两者不同。丙研究干脆不做小时聚合,把每次测量当成一个事件,于是同一段住院的序列长度是甲的三倍。三份数据都叫「MIMIC-III 的小时级序列」,模型结构相同,指标却不可比。这类差异不会写在摘要里,只会藏在方法段的一句「we aggregated hourly」里。
社区并非没有尝试收敛。官方参考文献里点了两个可复用的开源流水线:MIMIC-Extract 与 Sjoding 等人提出的通用化流程。但它们都是「工具箱」而不是「成品」:工具箱给你一组可调参数,成品给你一组已经调好的文件。前者灵活,后者可复现。这个库选择了后者,并且把选择做得更彻底——它不只固定了特征工程,还固定了容器格式(TFRecord)与序列语义(feature_lists)。
1.2 三条常见的错误期待
第一条,期待它是 MIMIC-III 的另一种打包。它只包含住院时长满 24 小时的那部分住院,而且每条样本都在某个预测时点被截断。MIMIC-III 里那些时长不足一天的短住院、没有被映射进 FHIR 的字段、以及不属于住院级记录的字段,一条都不在这个库里。
第二条,期待它是时序生理信号。它的「序列」是事件的序列,不是波形的序列。每个时间步上是一次或几次离散事件(一条化验、一条医嘱、一段被分词的自由文本),数值型特征只占少数。想拿它做心电或呼吸波形的任务,方向就错了。
第三条,期待它能直接替代 MIMIC-III 做任何研究。四个任务文件夹共享同一批住院,但标签不同、截断时点不同、词表也不同。把它们拼起来当成「更多数据」会让同一次住院在训练集里出现四次,评估结果随之失真。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 住院死亡预测的可复现基线 | 24 小时与出院两个时点的现成标签与序列 | 够,这是它最直接的用法 |
| 出院诊断的多标签分类 | 全部诊断的 ICD-9 码作为 context 标签 | 够做,但 ICD-9 编码体系本身已退场 |
| 主要诊断的粗粒度分类 | CCS 分组,一份标签对应一个分组 | 够,且类别数远少于 ICD-9 |
| 从零设计特征工程 | 不提供,特征口径已固定 | 不够,要改就得回上游重做 |
| 波形或影像任务 | 不含任何波形与影像 | 不够,一条都没有 |
| 短住院或急诊留观研究 | 只收 ≥24 小时住院 | 不够,直接被排除在外 |
| 文本模型预训练 | 自由文本只以分词后的 token 序列存在 | 可做,但拿不到原文,无法做字符级或句法分析 |
| 跨机构泛化验证 | 单一医学中心、单一国家 | 不够,只能做时间外推不能做空间外推 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你要复现某篇用序列模型做死亡预测的论文,但作者的预处理代码没开源 | 提供一份口径明确的现成输入,可作为「作者可能这么做」的近似 | 先用它跑出量级,再逐项替换成论文描述的细节,记录每一步的差异 |
| 你在做一个新的 EHR 基础模型,需要快速验证想法 | 数据已成张量,省掉两周的 ETL | 只在验证集上迭代,测试集留到最后一次性用 |
| 你在教临床机器学习,学生卡在数据清洗 | 四个任务的样本可直接进 tf.data,第一节课就能训练 |
用它的四个包讲「同一批住院、不同标签」的差别 |
| 你在评测自己写的预处理流水线 | 提供一组外部参照:同样的上游,别人的口径长什么样 | 对齐任务定义后比较,不要比较绝对指标 |
| 你要做 FHIR 相关的互操作实验 | 它是 MIMIC-III 经 FHIR 中转后的产物,特征名保留了 FHIR 路径 | 注意:只给结果不给映射代码,FHIR 资源本身不在包里 |
| 你在核对某份数据使用协议的边界 | 许可与 DUA 版本写得清楚,可与上游 MIMIC 对照 | 先办 CITI 与 DUA,再谈技术细节 |
1.5 一句话判断
它不是更大的 MIMIC-III,而是一份「别人替你把预处理做完了」的 MIMIC-III:省下的时间是真的,被锁死的口径也是真的。
1.6 不适合谁:四条边界
不适合要改特征的人。 特征集合由上游流水线决定,词表以文件形式给出,能做的只有选择解析哪些键、丢掉哪些时间步。想加一个新特征,等于重跑整条 FHIR 流水线,而那套工具官方明确说没有公开。
不适合做原始文本研究。 自由文本在进入样本前已被分词,词表里只有 token 与它的出现次数。想找回原句、做命名实体识别或句法分析,必须回到 MIMIC-III 的 NOTEEVENTS 表。
不适合把四个包合并计数。 四个文件夹描述的是同一批住院的四种视图。把它们当作四份独立数据,会让患者级划分失效——同一个患者在四个包里都在训练侧,模型学到的是人,不是病。
不适合需要 2020 年之后口径的研究。 MIMIC-III v1.4 覆盖 2001 至 2012 年,诊断编码是 ICD-9。任何以 ICD-10 为前提、或以近年诊疗常规为前提的结论,都不能直接套用。
§2 数据构成与规格
2.1 四个文件夹,一套格式
库的顶层不是按患者或按年份分,而是按预测任务分。官方数据描述列出四个文件夹名,每个文件夹对应一个标签或预测任务:
| 文件夹 | 标签 | 预测时点 | 标签体系 |
|---|---|---|---|
in_hospital_death_at_24hrs |
住院死亡 | 入院后 24 小时 | 二分类 |
in_hospital_death_at_end_of_encounter |
住院死亡 | 出院时 | 二分类 |
inpatient_icd9_at_end_of_encounter |
全部出院诊断 | 出院时 | ICD-9 多标签 |
primary_ccs_at_end_of_encounter |
主要出院诊断 | 出院时 | CCS 单标签 |
四个文件夹的内部结构一致:一组 TFRecord 文件,加一份词表 ZIP。文件夹之间的差别,官方归纳为两处:标签不同;预测时点不同,超过该时点的本次住院数据会被丢弃。这句话值得反复读:它不是把数据过滤掉,而是把时间轴截断。同一次住院在两个包里都出现,但 24 小时包里的样本在入院第 24 小时处戛然而止,出院包里的样本则延伸到出院。
按任务分文件夹、而不是在一张表里塞多列标签,是一个有意为之的取舍。同一条住院若要同时承载四种标签,就得在每次建模时手动挑出哪一列算标签、哪一列必须屏蔽;一旦写错,标签会从 context 泄漏进特征。分成四个独立文件夹之后,每个包内部只有一种标签语义,泄漏的可能性被结构性地排除了。代价是磁盘上存了四份高度重叠的数据,以及任何跨任务的分析都要自己做样本对齐。
还有一处容易漏掉的差别:primary_ccs_at_end_of_encounter 剔除了 1.3% 的住院,理由是这些住院的主要诊断对应不可计费的 ICD-9 码,无法映射到 CCS 分组。这是全库唯一一处官方给出的剔除比例,其余三个包没有这类剔除。
2.2 SequenceExample 的两半:context 与 feature_lists
tf.SequenceExample 是 TensorFlow 早期为序列任务设计的协议缓冲,结构上只有两块:context 与 feature_lists。理解这两块的分工,基本就理解了这个库的全部设计。
| 组成部分 | 类型 | 装什么 | 在本库中的例子 |
|---|---|---|---|
context |
map<string, Feature> |
整条样本只有一个值的特征 | 患者编号、性别、出生日期、预测时点、标签 |
feature_lists |
map<string, FeatureList> |
随时间变化、每个时间步可能有零个或多个值的特征 | 化验值、用药剂量、分词后的文本 |
官方对稀疏性有一句关键说明:在任意给定时间步上,一个 feature_list 可能有很多值,也可能一个值都没有。这句话决定了解析代码的写法——不能假设所有特征在每个时间步都对齐,必须先把所有特征的事件时间收集起来,形成统一的时间轴,再按时间轴去做聚合或嵌入。这也解释了为什么库里要单独给一个 sequenceLength:它是「不同事件时刻的个数」,也就是时间轴的刻度数。
2.3 字段字典
官方使用说明把可用特征分成输入特征与元数据两组,并明确列出哪些应当作为 context、哪些应作为序列。下表把这些说明逐项落到字段上。需要说明:完整特征清单在词表目录内,需凭证登录后才可枚举,下表只覆盖官方页面点名的那部分。
| 字段 | 归属 | 取值形态 | 含义 | 使用注意 |
|---|---|---|---|---|
patientId |
context | 字符串 | 患者在样本中的唯一编号 | 同一患者可出现在多条样本里,切分必须按它 |
currentEncounterId |
context | Unix 秒 | 本次住院的起始时刻 | 官方描述为「当前住院开始的时间戳」 |
timestamp |
context | Unix 秒 | 预测时点,即序列的结束时刻 | 与标签时间戳相减可得前置窗口 |
label.*.timestamp_secs |
context | Unix 秒 | 标签发生时刻 | 前缀固定,后缀随任务变化 |
eventId |
序列 | Unix 秒数组 | 每个事件的时刻 | 与 sequenceLength 一一对应 |
sequenceLength |
context | 整数 | 不同事件时刻的个数 | 是时间轴长度,不是特征总数 |
Patient.birthDate |
context | 时间 | 出生日期 | 与 timestamp 相减得到年龄 |
Patient.gender |
context | 字符串 | 性别 | 离散值,走词表 |
Observation.value.quantity.value |
序列 | 浮点 | 化验或生命体征的数值 | 必须与 Observation.code、.unit 联用才有意义 |
Observation.code |
序列 | token | 测量项目 | 走词表,具体码值在词表文件内 |
Observation.value.quantity.unit |
序列 | token | 计量单位 | 同上 |
MedicationAdministration.dosage.dose.value |
序列 | 浮点 | 实际给药剂量 | 与途径、部位、单位特征联用 |
MedicationAdministration.dosage.rate.quantity.value |
序列 | 浮点 | 给药速率 | 常用于泵入类医嘱 |
MedicationRequest.dosageInstruction.dose.quantity.value |
序列 | 浮点 | 医嘱剂量 | 与给药记录不是同一件事 |
MedicationRequest.dosageInstruction.dose.range.low.value |
序列 | 浮点 | 剂量区间下界 | 与上界成对出现 |
MedicationRequest.dosageInstruction.dose.range.high.value |
序列 | 浮点 | 剂量区间上界 | 同上 |
Composition.section.text.div.tokenized |
序列 | token | 自由文本的分词结果 | 官方举的例子,原文不可得 |
字段名本身就是一份设计文档。它们全部是 FHIR 的资源路径:Patient、Observation、MedicationAdministration、MedicationRequest、Composition 都是 FHIR 的资源类型,后接的每一段是该资源里的元素路径,最后一段是字段。看到 Composition.section.text.div.tokenized 就该明白:临床文书在 FHIR 里被组织成 Composition 资源,正文落在 section.text.div,再被分词成 token。
这种命名方式还带来一个隐性约束:特征的含义由它在 FHIR 中的位置决定,而不由 MIMIC 的 ITEMID 决定。同一种化验在 MIMIC 里可能对应多个 ITEMID(不同系统、不同年代的录入习惯),一映射到 Observation.code 就合并成了一个概念。合并的好处是跨年代可比,坏处是原本的细粒度差异被抹平,而且这个合并过程只在映射工具里,使用者看不到合并表。
2.4 一条样本的完整解剖
把上述字段串起来,一条样本的形状是这样的:context 里有患者编号、性别、出生日期、预测时点、时间轴长度和标签;feature_lists 里有若干条长度不等、彼此不对齐的事件流,它们共享 eventId 这条时间轴。官方给出的语义是「一位患者的这次住院、以及此前所有住院」的历史,截至某个时点,超过该时点的数据被丢弃,时点之后发生的事情由标签描述。
这条设计里有两个值得单独拎出来的决定。
第一个是历史拼接。样本不只含本次住院,还含同一患者既往住院的全部数据。这让模型能看到「这个人上次因为什么住进来、用过什么药」,而不是只看当前这一段。代价是样本长度分布差异极大:一次住院的患者可能只有几十个时间步,反复入院者可能有几百个。
第二个是时间戳的绝对化。官方明确说所有时间与日期特征都以 Unix 时间戳的秒数给出。这意味着跨样本的时间对齐是显式的,也意味着任何「距入院多少小时」的派生量都要由使用者自己用 timestamp 与 currentEncounterId 相减得到,库里不预先算好。
读取骨架如下。这段代码不依赖任何私有工具,只用到 TensorFlow 自带的解析原语:
import tensorflow as tf
#-- 一条样本的解析骨架:context 与 feature_lists 分开取
def parse_one(path, int_keys, byte_keys, seq_keys):
ds = tf.data.TFRecordDataset([path])
for raw in ds.take(1):
ex = tf.train.SequenceExample.FromString(raw.numpy())
ctx = ex.context.feature #-- map<string, Feature>
fl = ex.feature_lists.feature_list #-- map<string, FeatureList>
meta = {k: ctx[k].int64_list.value[0] for k in int_keys if k in ctx}
meta.update({k: ctx[k].bytes_list.value[0].decode("utf-8") for k in byte_keys if k in ctx})
lens = {k: len(fl[k].feature) for k in seq_keys if k in fl}
return meta, lens
#-- 词表是按特征名切分的,文件名就是特征键
def load_vocab(zip_path, feature_key):
import zipfile
with zipfile.ZipFile(zip_path) as z:
name = f"{feature_key}.txt"
toks = z.read(name).decode("utf-8").splitlines()
return {t: i for i, t in enumerate(toks)}
第二段函数说明了一个容易被忽略的事实:词表文件名与特征键同名。想知道某个包里有哪些离散特征,列出 ZIP 内文件名即可,不必逐条解析二进制。
2.5 词表与 token
每个任务文件夹附一份 ZIP,内含两类文件,命名规则一致:
| 文件名形态 | 内容 | 用途 |
|---|---|---|
{特征名}.txt |
该特征的全部 token | 建索引、确定嵌入表大小 |
{特征名}_freqs.csv |
每个 token 在数据中出现的次数 | 判断哪些 token 值得保留 |
Composition.section.text.div.tokenized.txt |
自由文本的 token 表 | 文本特征专用,体量最大 |
这套设计把「特征」与「词表」绑在一起:特征名既是 feature_lists 的键,也是词表的文件名。好处是自解释,坏处是强耦合——特征名一变,词表文件名跟着变,任何按名字硬编码的脚本都会断。官方给出的频率文件是让人做取舍用的:低频 token 是否合并进 <unk>、过长的文本词表是否截断,都由使用者决定,库本身不做裁剪。
2.6 四个任务之间的差异矩阵
| 维度 | 24 小时死亡 | 出院死亡 | 出院 ICD-9 | 主要诊断 CCS |
|---|---|---|---|---|
| 预测时点 | 入院后 24 小时 | 出院时 | 出院时 | 出院时 |
| 标签数量 | 1 个二值 | 1 个二值 | 多个诊断码 | 1 个分组码 |
| 标签所在位置 | context | context | context | context |
| 剔除规则 | 无额外剔除 | 无额外剔除 | 无额外剔除 | 剔除 1.3% 不可计费主要诊断 |
| 序列长度 | 短,止于第 24 小时 | 长,覆盖全程 | 长,覆盖全程 | 长,覆盖全程 |
| 典型任务 | 早期预警 | 结局预测 | 多标签分类 | 单标签分类 |
| 类别不平衡 | 严重 | 严重 | 不适用 | 中等 |
矩阵里最容易看错的是第一列与第二列的差别。两个包都预测住院死亡,但一个在 24 小时处下判断、一个在出院时下判断。前者要求模型在信息极少时给出结论,后者几乎等于「事后归因」。把它们当成同一个任务的两个副本,是最常见的误用。
§3 它是谁的数据
3.1 三个人与一个部门
制作者三人全部隶属 Google Health:Jonas Kemp、Kun Zhang、Andrew Dai。这份数据的由来不是一次独立的数据收集,而是一篇论文的副产物——官方背景段写明,这个版本的数据被用于产生 Kemp 等人发表的结果。换言之,它先是一份研究用的中间产物,后来才被整理成公开资源。
三个人的位置可以从参考文献里读出来:Kun Zhang 与 Andrew Dai 都在 Rajkomar 等 2018 年那篇方法学论文的作者名单中,Andrew Dai 同时是 2019 年那篇应用论文的合著者;Jonas Kemp 是 2019 年论文的第一作者,也是本库在 PhysioNet 上的第一署名。致谢中出现的工程与临床人员,则对应流水线落地时必不可少的那些角色:数据接入、临床语义核对、基础设施。
致谢名单列了十五位贡献者或支持者,包括 Greg S. Corrado、Claire Cui、Michael D. Howell、Alvin Rajkomar、Mimi Sun 等人。这份名单与谷歌健康当时做 EHR 序列模型的那条线高度重合,也解释了为什么这套流水线的形态与 Rajkomar 等 2018 年那篇 npj Digital Medicine 论文几乎一致——官方方法段承认,这套方法论最早就是在那篇论文里描述的。
利益冲突一栏只有一句话:谷歌支持了这份资源的创建。这句话应当被认真对待:它说明这套数据的加工与工程投入由一家商业机构承担,而原始采集、去标识化与托管责任仍在 PhysioNet 与上游 MIMIC 项目一侧。
3.2 时间线
| 时间 | 事件 | 意义 |
|---|---|---|
| 2001–2012 | 上游数据采集期 | 覆盖 MIMIC-III 的全部住院年份 |
| 2016-09-02 | MIMIC-III v1.4 发布 | 本库的唯一上游 |
| 2018 | Rajkomar 等发表 FHIR 序列化方法 | 本库的方法学出处 |
| 2019 | Kemp 等人的预印本 | 本库数据的首次使用场景 |
| 2020-09-29 | 本库 1.0.0 发布 | 至今唯一版本 |
| 2020 至今 | 无更新 | 上游已迭代到 MIMIC-IV,本库仍停在 v1.4 |
3.3 上游 MIMIC-III v1.4 的形态
要判断这个库能不能用,得先知道它的原料长什么样。上游官方页给出的关键事实如下:
| 项目 | 内容 |
|---|---|
| 数据来源机构 | 波士顿贝斯以色列女执事医疗中心 |
| 覆盖年份 | 2001–2012 |
| 患者规模 | 超过四万名重症患者 |
| 表数量 | 26 张关系型表 |
| 主键层级 | SUBJECT_ID(患者)、HADM_ID(住院)、ICUSTAY_ID(ICU 停留) |
| 临床信息系统 | CareVue 与 MetaVision 两套,采集期内先后使用 |
| 事件表组织 | 按 ITEMID 存放,含义需回字典表查询 |
| 访问方式 | 完成培训并签署数据使用协议后,从受限站点下载 |
二十六张表、三级主键、ITEMID 间接寻址——这三点合起来,就是「预处理为什么难」的全部答案。任何一条化验值都要三次连接才能追到它的名字与单位,而每一次连接都可能因为缺失键丢行。
3.4 数据来源的三个层次
第一层是原始临床记录:护士在床旁核对的生理测量、医生的病程记录、药房的医嘱与给药、检验科的回报。这一层不由本库负责。
第二层是关系型整理:MIMIC 项目把这些记录装进二十六张表,做去标识化、时间平移、日期偏移。这一层决定了本库能看到什么。
第三层是序列化封装:本库把表映射到 FHIR,再把 FHIR 展开成 SequenceExample。这一层决定了本库以什么形状交付。
三层之间的信息损耗是单向累积的。第一层里有的东西,第二层可能已经丢了(例如原始时间被平移);第二层里有的东西,第三层可能不再保留(例如未被映射进 FHIR 的字段)。判断一个任务能不能用这个库,本质上是在问:我需要的信息,能不能撑过这两次转换。
§4 它最独特的东西
4.1 唯一一条公开的 MIMIC 到序列流水线产物
PhysioNet 上做 MIMIC 派生的项目很多:有抽特征的、有做子集的、有转 FHIR 的。但把「关系表 → FHIR → 序列样本」这条完整链路走完、并把结果公开的,只有这一个。这一点在方法段写得很清楚:先映射到 HL7 FHIR,再从 FHIR 转成 SequenceExample,用的是一条开源流水线;同时补了一句关键的限定——目前把 MIMIC-III 映射到 FHIR 的工具并未公开。
这句限定必须被记住。它意味着你拿到的是一张「成品照片」,不是「相机与胶卷」。照片可以看、可以量、可以用来训练,但想换一个角度重拍,得自己造相机。
4.2 两个预测时点乘三种标签
四个文件夹不是随意凑的,它们是一个二维设计的四个格子:预测时点有两档(24 小时、出院),标签有三种(住院死亡用两个时点覆盖、ICD-9 全部诊断、CCS 主要诊断)。这个设计让「同一批住院在不同信息量下的可预测性」变成一个可以直接对照的实验。
| 信息量 | 对应包 | 模型能看到的 | 临床上对应的场景 |
|---|---|---|---|
| 极少 | 24 小时死亡 | 入院后第一天 | 早期预警、分诊分流 |
| 完整 | 出院死亡 | 全程 | 结局归因、质量评价 |
| 完整 | 出院 ICD-9 | 全程 | 编码辅助、病案质控 |
| 完整 | 主要诊断 CCS | 全程 | 粗粒度分组、医保分组预演 |
这个二维设计还有一个副作用值得记住:四个包共用同一批住院,但每个包内部的样本集合并不完全相同。CCS 包因为剔除了 1.3% 的住院,样本集比另外三个小一圈;24 小时包因为截断,样本内容比另外三个短一截。做跨任务对照时,正确的做法是先取交集,再在交集的住院上比较,否则差异里会混进样本集不同带来的噪声。
四格里最有意思的是左上角。24 小时意味着模型必须在信息最少的时候下判断,而这恰恰是临床上最需要预测能力的时刻——入住 ICU 的第一天决定后续资源投入。这个包的存在,让「早预测有多难」有了一个固定的测量刻度。
4.3 一条样本里装着多次住院
官方对这个设计的表述是:每条样本包含本次住院截至预测时点的数据,以及同一患者既往住院的全部数据。这一点与大多数 EHR 基准不同——多数基准是「一次住院一条样本」,本例是「一条样本 = 一个人的一段历史 + 一次住院的前半段」。
| 设计选择 | 常见做法 | 本库做法 | 后果 |
|---|---|---|---|
| 历史范围 | 只看本次住院 | 拼接全部既往住院 | 样本长度方差极大 |
| 时间基准 | 相对入院时间 | Unix 绝对秒 | 需自行派生相对量 |
| 缺失处理 | 插值或前向填充 | 不填充,保留稀疏 | 解析代码必须容忍空时间步 |
| 事件粒度 | 按小时聚合 | 按事件原始时刻 | 时间轴长度随病情波动 |
第三行是最容易低估的。稀疏不是缺陷,是设计:它把「这个时间步没有测量」这一事实保留下来了。真正做聚合时,缺测本身往往是信号——一个六小时没有任何记录的时间段,与一个每小时都有记录的时间段,临床含义完全不同。
4.4 标签的粒度与口径
| 标签 | 粒度 | 体系 | 口径说明 |
|---|---|---|---|
| 住院死亡 | 住院级二值 | 院内死亡 | 24 小时包在入院第 24 小时下判断,出院包在出院时下判断 |
| 出院诊断 | 住院级多标签 | ICD-9-CM | 全部诊断码,数量随病例而异 |
| 主要诊断 | 住院级单标签 | CCS 分组 | 由主要诊断映射而来,不可计费码被剔除 |
官方没有在页面上给出「24 小时死亡」标签的精确定义——是「入院 24 小时内死亡」还是「入院 24 小时后仍存活者的院内死亡」,从文件夹名无法判定。这是一个必须自己确认的口径,见 §10 的未核验清单。做早期预警研究时,这两种定义的临床含义差别很大:前者包含极早期死亡,后者把它们排除在队列之外。
4.5 边界条件:什么情况下它不再适用
住院时长门槛。 只收满 24 小时的住院。这条门槛会系统性地排除病情极轻(当天出院)与极重(24 小时内死亡)的两端。任何讨论「ICU 全人群」的结论,都要先扣掉这部分。
编码体系的时间边界。 ICD-9 在美国已于 2015 年停用。用这个库训练的编码模型,迁移到 ICD-10 环境需要重新建立映射与词表。
文本的可逆性边界。 文本已被分词,且只保留 token 与次数。需要原文的任务必须回上游。
地理与机构边界。 单一医学中心、单一国家、2001–2012 年的诊疗常规。跨机构泛化必须另找数据验证。
§5 怎么拿到:从 DUA 到张量
5.1 获取路径
| 步骤 | 做什么 | 大概耗时 | 产出 |
|---|---|---|---|
| 1 | 在 PhysioNet 注册账号 | 即时 | 账号 |
| 2 | 完成 CITI「Data or Specimens Only Research」培训 | 数小时 | 结业证明 |
| 3 | 签署 PhysioNet Credentialed Health Data Use Agreement 1.5.0 | 即时提交,审核需时 | 访问授权 |
| 4 | 通过审核后进入项目页下载 | 视带宽 | 四个文件夹 |
| 5 | 核对文件完整性 | 数分钟 | 可解析的 TFRecord 集合 |
上游 MIMIC-III 的申请流程在官方页上写明「批准至少需要一周」,本库沿用同一套访问要求。这一步没有捷径:数据里含受保护健康信息,凭证访问是硬门槛。
5.2 目录结构与文件命名
拿到之后,顶层只有四个文件夹,与 §2.1 的表一致。每个文件夹内是一组 TFRecord 与一份词表 ZIP。官方没有公布具体文件名与切分文件清单,也没有给出各包的体积;这些信息需登录后在文件列表里查看。本文不对未见过的文件名做任何推测。
5.3 用 tf.data 读 TFRecord
TFRecord 是按记录顺序拼接的二进制容器,读取时逐条解析即可。典型写法:
import tensorflow as tf
#-- TFRecord 是记录流,不必一次读入内存
files = tf.data.Dataset.list_files("in_hospital_death_at_24hrs/*.tfrecord")
ds = (tf.data.TFRecordDataset(files, num_parallel_reads=4)
.map(tf.train.SequenceExample.FromString, num_parallel_calls=4)
.padded_batch(32, padded_shapes=({}, {})))
这里还有一个常被忽略的细节:TFRecordDataset 的读取顺序与文件内的写入顺序一致,但文件之间的顺序不保证稳定。如果训练依赖样本顺序(例如在线难例挖掘),需要自己加一层固定种子的 shuffle;如果只做常规的随机批训练,shuffle 的缓冲区应不小于单个文件的样本量,否则同一个文件内的样本会成块出现。
padded_batch 是这段的关键。序列长度不一致,直接 batch 会在最后一步报错;填充到批内最长即可,但要注意填充值不能与真实 token 的索引冲突,通常把 0 留给填充、词表从 1 开始编号。
5.4 把序列摊平成张量
解析出 feature_lists 之后,真正的工程量才开始。官方给出的建议是:建模前先遍历数据集,把感兴趣的解析张量取出来看。这一步不能省——不同特征的时间轴对齐方式,决定了后续是用循环网络、Transformer,还是先做时间分桶再喂给树模型。
| 做法 | 优点 | 代价 | 适用 |
|---|---|---|---|
按 eventId 对齐后逐时间步嵌入 |
保留原始时序 | 实现复杂,需处理稀疏 | 序列模型 |
| 按小时分桶聚合 | 长度可控,便于批处理 | 丢掉桶内顺序 | 常规基线 |
| 只取统计量(计数、均值、末值) | 最快,可接任意模型 | 丢掉时序 | 传统模型对照 |
| 取最近 N 个事件 | 长度固定,聚焦近期 | 长病史被截断 | 早预警任务 |
四种做法没有优劣,只有代价落在哪里。第一种最忠实,但对显存的要求随最长样本走:一批里只要有一条几百个时间步的样本,整批都要填充到那个长度。第二种把长度压到住院小时数,代价是把同一小时内的先后顺序抹平,而用药的先后有时正是关键。第三种最省,但把「什么时候发生」彻底丢掉了,之后无论怎么解释模型都无从谈起。第四种在早预警任务里最常见,因为它天然对齐了「只看今天之前」的临床逻辑。
5.5 词表对齐
词表是按文件夹给的,不是全库共用。原因很直接:不同任务的包可能包含不同的特征集合,词表必须与包内实际出现的键一致。硬编码一份词表跨包使用,会在遇到未见 token 时静默出错——多数实现会把未知 token 映射到索引 0,而 0 往往同时是填充位,错误就此被吞掉。
正确做法是把词表当作包的一部分来管理:加载哪个包,就加载同目录的 ZIP;建立映射时保留一份反查表,遇到未知 token 显式记录并计数。
5.6 六个最容易出错的地方
| 坑 | 现象 | 原因 | 处理 |
|---|---|---|---|
| 按样本随机切分 | 测试集指标虚高 | 同一患者的多条样本被分到两侧 | 按 patientId 分组切分 |
| 把四个包合并 | 同一次住院被计四次 | 四个包是同一批住院的四种视图 | 一次只用一个包 |
| 直接拿整数当数值 | 数值尺度错乱 | 部分字段是索引,部分是浮点 | 按字段类型分别处理 |
| 忽略时间截断 | 用到了预测时点之后的信息 | 只看了标签没看时间轴 | 用 timestamp 过滤事件 |
| 把 context 当序列 | 张量维度对不上 | 官方明确列了哪些属 context | 按官方清单分组 |
| 词表跨包复用 | 静默产生未知 token | 各包词表不通用 | 词表与包绑定加载 |
§6 与库内词条的关系
6.1 关系图谱
| 词条 | 关系 | 差异要点 |
|---|---|---|
| MIMIC-III 重症监护临床数据库 | 直接上游 | 二十六张关系表,本库是它的序列化派生 |
| MIMIC-IV 重症监护医疗数据库 | 同族更新版 | 覆盖年份更晚、结构重排,本库未跟进 |
| MIMIC-IV on FHIR | 同族、同方法、不同终点 | 那个停在 FHIR 资源层,本库继续压成序列样本 |
| FIDDLE 重症 EHR 特征矩阵 | 同类目的、不同形态 | 那个产出特征矩阵,本库产出序列样本 |
| MIMIC-IV-Ext-22MCTS | 同类目的事件时间序列 | 那个是事件计数级长表,本库是协议缓冲 |
| MIMIC-III-Ext-MIMIC-Patient | 同类目的、逐患者组织 | 那个面向问答语料,本库面向预测任务 |
| MIMIC-Ext-SynNotes | 文本侧派生 | 那个生成合成笔记,本库只保留分词结果 |
| CliniQ | 检索基准 | 那个做实体检索评测,本库做结局预测 |
6.2 检索路径
如果目标是「拿一份能直接训练的 MIMIC 数据」,路径是:先确认任务是不是住院级预测;是,则本库、FIDDLE 特征矩阵、事件时间序列三者择一,按「要不要时序」决定;否,则回到 MIMIC-III 本体。
如果目标是「研究 EHR 预处理口径的影响」,路径是:以本库为固定口径,另建一套自己的口径,在同一批住院上对比。这时本库的价值不在数据,而在「一组已知的、不再变动的选择」。
如果目标是「教学」,路径是:用一个包的少量文件讲完「二进制容器到张量」的全流程,再用第二个包说明「同一批住院换标签会怎样」。这条路径不需要完整下载,也不需要训练出好结果,只需要解析成功,因此对本库的版本陈旧问题最不敏感。
如果目标是「FHIR 互操作」,路径是:MIMIC-IV on FHIR 给资源层,本库给「资源层之后」,两者恰好构成一条完整链路的两端。
6.3 分工判据
| 你的判据 | 选它 | 不选它 |
|---|---|---|
| 要马上训练,不想写 ETL | 是 | 不适用 |
| 要自定义特征 | 不适用 | 回上游 MIMIC-III |
| 要做波形或影像 | 不适用 | 换 MIMIC-IV-Waveform、MIMIC-CXR |
| 要最新年份 | 不适用 | 换 MIMIC-IV 系 |
| 要可复现的基线数字 | 是 | 不适用 |
| 要研究预处理敏感性 | 是,作为对照组 | 不适用 |
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
本节不打「好用/不好用」的总分,只拆开五个可分别评价的维度:原料质量、转换保真度、标签可信度、文档完备度、可维护性。四者的证据强度差别很大——原料质量可以追到 MIMIC-III 的公开文档,转换保真度只能追到方法段的两句话,标签可信度取决于上游编码质量,文档完备度则是这个库最弱的一环。
7.1 五维评分
| 维度 | 评价 | 依据 | 强度 |
|---|---|---|---|
| 原料质量 | 高 | 上游 MIMIC-III 是经过长期检验的公开库 | 强 |
| 转换保真度 | 无法独立验证 | 映射工具未公开,只知先 FHIR 后序列 | 弱 |
| 标签可信度 | 中高 | 死亡与诊断均取自结构化字段 | 中 |
| 文档完备度 | 中 | 结构与语义写得清楚,规模与文件清单缺失 | 中 |
| 可维护性 | 低 | 单版本、六年未更新、上游已换代 | 强 |
第三行与第五行值得展开。标签的中高评价来自标签来源:住院死亡与出院诊断都是病案与 HIS 里的结构化字段,不是人工标注,也不依赖文本抽取。它们的误差主要继承编码质量,而不是本库引入的误差。可维护性的低评价则没有争议:一个 2020 年发布、此后没有任何版本记录的库,在上游已经迭代两代之后,只能作为历史基线使用。
7.2 标签的两层可信度
第一层是事件层:死亡这件事本身。医院内死亡在 HIS 里有明确记录,可信度高。但「出院后死亡」不在本库范围内——官方只承诺住院死亡,不做出院后随访。
第二层是编码层:诊断码由病案编码员在出院时填写,受编码规范、报销规则、个体习惯影响。ICD-9 的多标签尤其如此:同一次住院,不同编码员给出的码数可能相差数倍。CCS 分组是在此之上的再一次映射,把一个可能的编码噪声转成一个更粗的类别,噪声被压缩但也被固化。
7.3 已知的、可枚举的偏差
| 偏差 | 机制 | 影响方向 |
|---|---|---|
| 住院时长筛选 | 只收 ≥24 小时 | 排除极轻与极重两端 |
| 单中心 | 一家医学中心的诊疗常规 | 外推性受限 |
| 年代偏差 | 2001–2012 年的用药与监测习惯 | 与当代实践有差距 |
| 编码体系 | ICD-9 已停用 | 迁移需重建映射 |
| CCS 剔除 | 1.3% 不可计费主要诊断被去掉 | 主要诊断任务的类别边界被收窄 |
| 历史拼接 | 既往住院全部纳入 | 长病史患者样本更长,模型可能偏向他们 |
| 文本不可逆 | 只保留 token | 依赖原文的任务无法做 |
前三行的偏差是这类单中心回顾数据的共性,无法通过换划分方式消除。第四行与第六行是本库特有的:编码体系决定了它与当代数据的接口必须经过一次映射,历史拼接决定了长病史患者在样本长度上的话语权更大。做长度归一化时,如果不区分「本次住院的事件数」与「历史事件数」,模型很可能学到「住院次数多的人死亡率高」这种相关性,而它在临床上并不构成可干预的因果路径。
这张表里唯一有官方数字的是第五行,其余都是结构性描述。结构性描述不需要统计支撑,只需要读文档;这也是本文只写这三类数字的原因。
7.4 外部验证矩阵
| 验证方式 | 是否可行 | 说明 |
|---|---|---|
| 同一库内换划分 | 可行 | 但必须按患者重切,否则与官方划分不可比 |
| 与 MIMIC-IV 对照 | 部分可行 | 需自行在 MIMIC-IV 上重建同口径流水线 |
| 与 MIMIC-IV on FHIR 对照 | 不可直接比 | 终点不同,一个是资源层一个是序列层 |
| 跨机构外部验证 | 不可行 | 本库只含单中心数据 |
| 时间外推 | 部分可行 | 上游只到 2012 年,无更晚数据 |
这张矩阵的读法是:五行里有三行只能打「部分」或「不可」。也就是说,任何想用它证明「模型能泛化到新医院」的研究,都缺一个关键环节。可行的替代是把本库当作预训练或超参数搜索的场所,把真正的泛化声明留给另一份多中心数据——这个分工比硬把单中心结果说成通用结论要诚实,也更容易被审稿人接受。
7.5 它为何仍需被引用
一个六年没更新、上游已换代的派生库,为什么还值得写进方法段?因为它提供了一个别处拿不到的东西:一组不再变动的预处理决定。在可复现性讨论里,「别人怎么切的」往往比「切得对不对」更重要。引用它,等于声明「我的输入口径与此一致」或「我以此为基线」。这两种声明都比「我们参照 MIMIC-III 自行处理」要精确得多。
§8 生态位与历史
8.1 沿革
这条线的起点是 2018 年那篇把 EHR 表示成 FHIR 再喂给深度模型的论文。它提出的关键主张不是某个网络结构,而是一个工程主张:把不同医院的异构数据先统一到 FHIR,再让模型只面对一种语法。这个主张在工业界很快被接受,因为它解决的是「每接一家医院就要重写一次 ETL」的成本问题。
2019 年,Kemp 等人把这条流水线用在临床文本上,做了分层患者分类与语言模型预训练。2020 年,作为那项工作的数据副产物,这个库被整理发布。所以它的血统很清楚:它不是为公开而生的数据集,而是一条产业流水线在公开数据上跑过一遍之后留下的痕迹。
8.2 与 Rajkomar 2018 的关系
| 维度 | Rajkomar 等 2018 | 本库 |
|---|---|---|
| 目标 | 证明 FHIR 序列化 + 深度模型可行 | 把该流水线的产物公开 |
| 数据 | 两家医院的私有数据 | 公开的 MIMIC-III |
| 输出 | 论文与结果 | 可下载的 TFRecord |
| 代码 | 未公开 | 未公开 |
第四行是理解这个库的关键:方法公开在论文里,实现没有公开,只有产物公开。这决定了使用者只能在产物上做文章,不能改流水线。
8.3 生态位
| 需求层次 | 对应资源 | 本库位置 |
|---|---|---|
| 原始数据 | MIMIC-III v1.4 | 上游 |
| 互操作层 | MIMIC-IV on FHIR | 平行分支 |
| 序列样本 | 本库 | 唯一公开成品 |
| 特征矩阵 | FIDDLE 等 | 同类替代 |
| 事件长表 | 22MCTS 等 | 同类替代 |
8.4 谁在用
从引用结构推断(不是从使用统计推断),它的使用者集中在三类:一是做 EHR 序列模型、需要快速搭基线的研究组;二是讨论预处理可复现性的方法学论文,把它当作「已固定口径」的对照;三是医学信息学课程,用它演示「从表到张量」的完整链路。第三类的用法最不需要担心版本问题,因为教学目标不是最新数据,而是理解转换过程。
这三类用法背后有一个共同点:它的「可替代性」并不对称。作为序列样本,它很容易被自建流水线替代——只要愿意投入工程,任何人都能在 MIMIC-III 上重造一份同样形态的数据。作为「一组公开的、不再变动的预处理决定」,它几乎没有替代品:自建的口径再合理,也只是另一组选择,不能充当别人论文里的参照点。这种不对称解释了为什么它的下载量未必高,却在方法段里反复出现。
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一步 | 第二步 | 注意 |
|---|---|---|---|
| 建模者 | 办访问、下一个包 | 用 24 小时死亡包跑通基线 | 不要一上来就合并四个包 |
| 方法学研究者 | 读方法段与词表结构 | 自建一套口径做对照 | 对照必须在同一批住院上做 |
| 教学者 | 挑一个包的少量文件 | 演示解析与词表加载 | 强调稀疏与时间轴 |
9.2 一条最短的可用流程
- 完成 CITI 培训,签署 DUA 1.5.0,取得凭证访问权限。
- 下载
in_hospital_death_at_24hrs一个文件夹,先跑通解析。 - 用
SequenceExample.FromString逐条读出context,确认patientId、timestamp、label三类键存在。 - 列出词表 ZIP 内的文件名,确认特征键与
feature_lists的键一致。 - 按
patientId重做一次分组划分,与官方 80/10/10 对照,确认自己的实现没有泄漏。 - 用 §5.3 的
padded_batch组批,先跑一个最简单的循环网络,拿到基线数字。 - 再换第二个包,比较同一模型在两个预测时点上的差距。
9.3 引用方式
| 项 | 内容 |
|---|---|
| 数据集引用 | Kemp, J., Zhang, K., & Dai, A. (2020). MIMIC-III - SequenceExamples for TensorFlow modeling (version 1.0.0). PhysioNet. https://doi.org/10.13026/n2v5-5b32 |
| 上游引用 | 使用本库必须同时引用 MIMIC-III v1.4,官方在父项目一栏明确要求 |
| 平台引用 | PhysioNet 平台综述论文,按官方 Cite 按钮生成 |
| 版本号 | 写 1.0.0,不要写 latest |
| 划分说明 | 若自行重切,须写明与原划分的差异 |
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,编辑把关结构与事实 |
| 数字来源 | 规模、结构、边界三类数字取自 PhysioNet 官方页与上游 MIMIC-III 页面 |
| 文件核验 | 官方页与版本子页可直接访问;文件清单因地区限制与凭证要求不可见 |
| 不一致说明 | 上游患者规模的精确计数(Johnson 等 2016 给出的四万六千余人与五万八千余次住院)未在本次核验中从官方页复现,正文只采用「超过四万名」这一官方表述 |
| 论文信息 | 方法学出处与使用场景依据官方参考文献列表,未逐篇读全文 |
| 未核验内容 | 各包样本数量、文件体积、词表规模、24 小时死亡标签的精确定义 |
| 图像 | 无配图;封面为生成式提示词,不含真实病历内容 |
| 免责 | 本文不构成临床建议;数据使用须遵守 DUA 1.5.0 与上游许可 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「它是 MIMIC-III 的完整副本」 | 只含住院时长满 24 小时的部分,且每条样本在预测时点被截断 | 官方数据描述段 |
| 「它是波形时序数据」 | 是事件序列,不含任何波形 | 官方把所有特征描述为 FHIR 资源路径 |
| 「下载就能用」 | 仅凭证用户可访问,须 CITI 培训加 DUA 1.5.0 | 官方 Access 栏 |
| 「它和 MIMIC-IV on FHIR 是一回事」 | 上游不同、终点不同:那个停在 FHIR 资源层 | 两个项目的官方页 |
| 「四个包可以合并训练」 | 同一批住院的四种视图,合并即重复计数 | 官方说明四个文件夹仅标签与时点不同 |
| 「80/10/10 可以随便切」 | 官方按患者 ID 切 | 官方数据描述段 |
| 「标签是 ICD-10」 | ICD-9,且 CCS 任务剔除 1.3% 不可计费码 | 官方数据描述段 |
| 「文件是 CSV 或 Parquet」 | TFRecord,逐条为 SequenceExample | 官方数据描述段 |
| 「它一直在更新」 | 只有一个版本,2020 年至今未变 | 版本历史仅 1.0.0 |
| 「里面附带 FHIR 原始资源」 | 只给转换后的序列样本,映射工具未公开 | 官方方法段 |
| 「词表全库通用」 | 每个任务文件夹各一份 | 官方数据描述段 |
| 「时间戳是相对入院的小时数」 | 全部是 Unix 秒 | 官方使用说明段 |
FAQ
Q1:它到底有多少条样本?
官方页没有给出数字,只说明了样本池是 MIMIC-III 中住院时长满 24 小时的全部住院,并给出了患者级 80/10/10 的划分比例。精确条数需要在取得凭证访问后清点文件或逐条计数。任何声称「约五万八千条」的说法都来自对上游住院数的直接套用,忽略了 24 小时筛选与截断规则,不应采信。
Q2:为什么它比 MIMIC-III 小这么多?
三个原因叠加:只保留住院级记录(丢掉 ICU 停留级的独立记录与未映射字段)、只保留满 24 小时的住院、只保留被映射进 FHIR 的字段。三次裁剪之后,剩下的是一份面向预测任务的窄表,而不是完整病案。
Q3:四个文件夹该用哪一个?
先问你的任务在临床上对应哪个时点。要早期预警,用 24 小时死亡包;要做结局归因,用出院死亡包;要做编码辅助,用 ICD-9 包;要做粗粒度分组,用 CCS 包。不要为了「数据多」而合并。
Q4:官方划分能直接用吗?
能,但要注意两点:一是官方只给了比例,没给划分清单,你得自己按 patientId 复现;二是如果你改了样本池(比如剔除某些住院),划分必须整体重做,不能沿用。
Q5:文本特征能还原成原句吗?
不能。库里只有分词后的 token 与它在词表中的位置,没有原始字符串,也没有标点与大小写信息。需要原文时必须回到 MIMIC-III 的 NOTEEVENTS 表。
Q6:能不能只用它的标签,输入自己造?
可以,这是它被低估的用法之一。四个包的标签口径清晰、时点明确,把标签取出来与本地的输入流水线对齐,等于借用了一份经过整理的监督信号。
Q7:为什么它不做 ICD-10?
因为它冻结在 MIMIC-III v1.4,而该库覆盖 2001–2012 年,那个时期美国用的是 ICD-9。后续的 MIMIC-IV 才提供 ICD-9 与 ICD-10 双版本。
Q8:它的许可能商用吗?
许可为 PhysioNet Credentialed Health Data License 1.5.0,附带数据使用协议。协议的核心约束是不得尝试重新识别个体、不得再分发原始数据。具体条款以官方许可全文为准,商业使用前应逐条核对,不要只看许可名称。
术语表
| 术语 | 解释 |
|---|---|
| SequenceExample | TensorFlow 的序列样本协议缓冲,由 context 与 feature_lists 两部分组成 |
| context | 整条样本只有一个值的特征集合 |
| feature_lists | 随时间变化、每个时间步可有零到多个值的特征集合 |
| feature_list | feature_lists 中的一条,对应一个特征随时间的变化 |
| TFRecord | TensorFlow 的二进制记录容器,逐条顺序存储 |
| FHIR | 快速医疗互操作性资源,医疗数据交换的现代标准 |
| 资源 | FHIR 中的基本数据单元,如 Patient、Observation |
| 词表 | 离散特征取值到整数索引的映射 |
| token | 文本或编码经切分后的最小单位 |
| CCS | Clinical Classifications Software,把 ICD 码归入粗类别的分组方案 |
| ICD-9-CM | 第九版国际疾病分类临床修改版,美国 2015 年前使用 |
| 主键 | 关系表中唯一标识一行的字段 |
| HADM_ID | MIMIC 中标识一次住院的主键 |
| 预测时点 | 样本序列的截止时刻,此后信息不可见 |
| 截断 | 丢弃预测时点之后的数据 |
| 历史拼接 | 把同一患者既往住院的数据并入当前样本 |
| 患者级划分 | 同一患者的所有样本只进训练侧或只进测试侧 |
| 稀疏 | 特征在每个时间步上不一定有值 |
| 填充 | 组批时把短序列补到统一长度 |
| 凭证访问 | 需完成培训与协议后才能下载的受限访问方式 |
| DUA | 数据使用协议,规定允许与禁止的用途 |
| CITI | 研究伦理与受试者保护的培训课程体系 |
附录 A:核心数字核对表
| 项 | 值 | 来源 |
|---|---|---|
| 全名 | MIMIC-III - SequenceExamples for TensorFlow modeling | 官方页面标题 |
| 版本 | 1.0.0,唯一版本 | 版本历史栏 |
| 发布日期 | 2020 年 9 月 29 日 | 官方页面 |
| DOI(本版) | 10.13026/n2v5-5b32 | 官方页面 |
| DOI(latest) | 10.13026/6jx9-cy34 | 官方页面 |
| 预测任务数 | 4 | 数据描述段 |
| 划分比例 | 约 80% / 10% / 10%,按患者 ID | 数据描述段 |
| 纳入下限 | 住院时长 ≥ 24 小时 | 数据描述段 |
| CCS 任务剔除比例 | 1.3% | 数据描述段 |
| context 特征数 | 7 项 | 使用说明段 |
| 输入特征条目 | 4 组 | 使用说明段 |
| 元数据字段数 | 6 项 | 使用说明段 |
| 上游表数量 | 26 张 | MIMIC-III 官方页 |
| 上游患者规模 | 超过四万名 | MIMIC-III 官方页 |
| 上游年份跨度 | 2001–2012 | MIMIC-III 官方页 |
| 参考文献数 | 5 篇 | 参考文献栏 |
| 致谢人数 | 15 人 | 致谢栏 |
| 许可 | PhysioNet Credentialed Health Data License 1.5.0 | 访问栏 |
附录 B:数字的来源分层
第一层:官方页面明写。 四个任务文件夹、80/10/10 划分、24 小时门槛、1.3% 剔除、七项 context 特征、Unix 秒时间戳、许可与 DUA 版本、两个 DOI、发布日期、单版本事实。这些数字在正文中出现时都可回溯到官方页对应段落。
第二层:上游官方页。 二十六张表、超过四万名患者、2001–2012、CareVue 与 MetaVision 两套系统。这些来自 MIMIC-III v1.4 的项目页,不在本库页面上,引用时须写清是上游统计。
第三层:未核验。 各包样本数量、文件体积、词表规模、24 小时死亡标签的精确定义、官方划分的具体清单。这些信息要么因凭证限制不可见,要么官方本就没有公布。正文中凡涉及处均只做定性描述,并在 §10 列明。
附录 C:完整参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | 本库官方页 v1.0.0 | https://physionet.org/content/mimic-seqex/1.0.0/ | 全部结构、边界与许可信息 |
| 2 | MIMIC-III v1.4 官方页 | https://physionet.org/content/mimiciii/1.4/ | 上游规模与表结构 |
| 3 | Johnson 等,MIMIC-III 论文(Scientific Data, 2016) | 官方参考文献第 1 条 | 上游方法学背景 |
| 4 | Rajkomar 等,npj Digital Medicine, 2018 | https://doi.org/10.1038/s41746-018-0029-1 | FHIR 序列化方法出处 |
| 5 | Kemp 等,arXiv:1909.03039 | 官方参考文献第 4 条 | 本库数据的使用场景 |
| 6 | MIMIC-Extract(官方参考文献第 2 条) | arXiv:1907.08322 | 同类预处理流水线对照 |
| 7 | Sjoding 等通用化流程(官方参考文献第 3 条) | MLHC 2019 | 同类预处理流水线对照 |
| 8 | PhysioNet 平台综述(2026,Nature Health) | https://doi.org/10.1038/s44360-026-00096-z | 托管与引用规范 |
附录 D:任务代码
任务一:按患者重做分组划分
import tensorflow as tf
from collections import defaultdict
#-- 先扫一遍所有样本,只取 patientId,用于自己复现分组划分
def scan_patients(pattern):
pids = []
for raw in tf.data.TFRecordDataset(tf.io.gfile.glob(pattern)):
ex = tf.train.SequenceExample.FromString(raw.numpy())
f = ex.context.feature["patientId"]
pids.append(f.bytes_list.value[0].decode("utf-8"))
return pids
pids = scan_patients("in_hospital_death_at_24hrs/*.tfrecord")
uniq = sorted(set(pids))
#-- 以患者为最小单位切分,绝不按样本切
n = len(uniq)
train = set(uniq[: int(n * 0.8)])
val = set(uniq[int(n * 0.8): int(n * 0.9)])
test = set(uniq[int(n * 0.9):])
assert not (train & val) and not (train & test) and not (val & test)
print(len(uniq), len(train), len(val), len(test))
任务二:确认时间截断是否生效
import tensorflow as tf
#-- 序列里最后一个事件不应晚于 context 的 timestamp
def check_cut(path, k=200):
bad = 0
for i, raw in enumerate(tf.data.TFRecordDataset([path]).take(k)):
ex = tf.train.SequenceExample.FromString(raw.numpy())
ts = ex.context.feature["timestamp"].int64_list.value[0]
ev = ex.feature_lists.feature_list["eventId"].feature
if ev and ev[-1].int64_list.value[0] > ts:
bad += 1
return bad
print(check_cut("in_hospital_death_at_24hrs/part-00000.tfrecord"))
两段代码的用途不同:第一段防泄漏,第二段防越界。它们都不依赖任何私有工具,只用到 TensorFlow 自带的解析原语,可以在拿到数据的第一天就跑起来。文件名请以实际目录为准,本文不对未见过的文件名做推测。
附录 E:如果只记五件事
| 序号 | 记住什么 | 为什么 |
|---|---|---|
| 1 | 四个包,同一批住院,标签与时点不同 | 合并即重复计数,选包先选任务 |
| 2 | 按患者 ID 做 80/10/10 | 按样本切会让指标虚高 |
| 3 | 只收满 24 小时的住院,ICD-9 时代 | 决定了它能回答与不能回答的问题 |
| 4 | TFRecord 里的 SequenceExample,context 加 feature_lists | 解析思路由此确定 |
| 5 | 口径已冻结,改不动 | 当基线用最合适,当实验台不合适 |
编辑说明
本文的核验时间为 2026 年 10 月 28 日。核对方式为直接访问 PhysioNet 项目主页与 1.0.0 版本子页,逐段比对摘要、背景、方法、数据描述、使用说明、致谢、利益冲突与参考文献;文件清单一栏因地区限制与凭证要求返回不可用,故全文不对具体文件名、文件体积、样本数量做任何推测。上游数字另经 MIMIC-III v1.4 官方页核对。未覆盖的内容包括各包样本数量、词表规模、标签精确定义与官方划分清单,这些已在 §10 与附录 B 列明。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- mimic-iii — 共享标签:电子病历 / 重症监护 / 结构化EHR
- mimiciv — 共享标签:电子病历 / 重症监护 / 结构化EHR
- mimic-iv-fhir — 共享标签:电子病历 / 数据工程 / FHIR 中转
- mimic-eicu-fiddle-feature — 共享标签:电子病历 / 机器学习 / 特征矩阵
- mimic-iv-ext-22mcts — 共享标签:电子病历 / 序列样本
- mimic-patient-json — 共享标签:电子病历 / 派生数据集
- mimic-ext-synnotes — 共享标签:电子病历 / 文本派生
- cliniq — 共享标签:电子病历 / 机器学习
- mimic-iv-clinical-database — 共享标签:重症监护 / 结构化EHR
- mimic3wdb — 共享标签:重症监护 / 数据工程
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

