信息速览
MIMIC-IV-Ext-22MCTS 解决的是一个很具体的问题:出院小结里写着「三天前开始发热」「术后第二天拔管」「入院前两周停用华法林」,但机器读不出来。这个数据集把这些话拆成了一条条「事件 + 相对入院多少小时」的记录,一共 2,258 万条。
这个数据集由美国国家医学图书馆(NLM)院内研究部构建,2025 年 9 月 29 日发布在 PhysioNet,DOI 10.13026/dkj6-r828,配套论文是 arXiv:2505.00827。
它真正稀缺的地方不是「事件多」——事件多是靠 26.7 万份小结堆出来的。稀缺的是它把一段完全非结构化的叙事文本,强行对齐到了一根以入院为零点的时间轴上,而且把这条对齐是怎么做的、错在哪里、错多少,全写在了页面上。 用它必须先接受一件事:这里没有金标准。官方在 Limitations 里第一句就写了「No Ground Truth Labels」,并建议用于预训练、弱监督、半监督,而不是严格评测。任何把它当 ground truth 用的做法,都会在某个环节出问题——而单位写着小时、精度却只到天,是最容易踩的第一个坑。
INFOBOX — MIMIC-IV-Ext-22MCTS 一屏速览
维度 内容 全称 MIMIC-IV-Ext-22MCTS: A 22 Millions-Event Temporal Clinical Time-Series Dataset with Relative Timestamp 出处 NLM 院内研究部(NIH)/PhysioNet 版本 1.0.0,2025-09-29 DOI 10.13026/dkj6-r828 来源 MIMIC-IV-Note v2.2 出院小结 小结数 267,284 份(上游 331,794,保留 80.6%) 事件数 22,588,586 条 每份均值 84 条(区间 1–244) 事件长度 平均 3 token,最长 299 token 时间戳 相对入院小时,入院前负、入院后正 时间分布 入院前 36.99% / 住院中 51.19% / 出院后 11.80% 分箱 9 个区间,边界 -60/-30/-15/0/15/30/60/120 h 标注模型 Llama-3.1-8B(本地 HPC 推理) 检索 上下文 BM25 top 100 + BGE-Large-en @0.75 金标准 无(官方明示) 访问 Credentialed Access,需 CITI 培训 + DUA 许可 PhysioNet Credentialed Health Data License 1.5.0
§1 它到底解决什么问题
1.1 你的处境
如果你正在做下面任何一件事,这一节直接决定你该不该继续读:
你有一堆 EHR 结构化表,但发现关键信息不在里面。 chartevents 记了每一次心率,但没记「患者说胸痛是从昨天晚饭后开始的」。diagnoses_icd 记了诊断编码,但没记「这个诊断是什么时候第一次被怀疑的」。你想做的是「入院后 6 小时内是否会发生脓毒症」这类问题,而答案的线索藏在主诉和现病史里。
你想做临床语言模型,但通用语料里没有时间概念。 你用出院小结训练一个模型,它能学会「肺炎用抗生素」,但学不会「先发热三天,然后咳嗽加重,第四天才拍片」。时间关系是临床推理的主干,通用文本里几乎没有显式的时间标注。
你在做临床试验匹配,患者描述与 trial 纳入标准之间的时间约束对不上。 「过去 6 个月内未发生心梗」这种条件,需要知道事件发生在什么时候。
你要复现某个「LLM 抽取临床事件」的流程,想找一个已经跑完的参照。 22MCTS 的管线写得相当完整:切块大小、检索模型、相似度阈值、prompt 设计、后处理规则,全都公开了。
1.2 它能帮你什么
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 事件文本 + 相对时间 | 2,258 万条,平均每份小结 84 条 | 够,这是它的主产品 |
| 事件类型分类 | 没有,全是自由文本 | 不够,需自己跑 NER |
| 标准医学编码(ICD/SNOMED) | 没有,刻意不映射 | 不够,需自己映射 |
| 绝对日历时间 | 没有,只有相对小时 | 不够,需回连 MIMIC-IV 的 admittime |
| 金标准校验 | 没有,官方明写 | 不够,需自己抽样人工核验 |
| 患者级去重 | 未提供患者 ID | 需通过 Hadm_id 回连 admissions 表 |
| 现成的训练/验证/测试划分 | 论文给了 80/10/10 的按小结划分做法 | 部分够,但要自己实现 |
1.3 一句话决策
你要的是「事件在时间轴上的大致位置」——用它。你要的是「事件发生的准确时刻」——不要用它,去 MIMIC-IV 结构化表里找,或者自己人工标。
1.4 不适合谁
这一节很重要,因为 22MCTS 的定位容易被误读成「MIMIC 的时间序列版本」。
需要精确时间戳的任务,它给不了。 官方 prompt 验证中,匹配事件的相对时间完全一致的比例只有 50–75%,70–85% 的事件误差在 24 小时以内。24 小时的误差对「入院后 6 小时预警」这类任务等于没有信息。要分钟级时间,必须回 MIMIC-IV 的 chartevents/labevents。
需要可辩护的评测集,它给不了。 没有金标准,意味着你在它上面报的任何「准确率」都是在跟 Llama-3.1-8B 的输出比,不是跟临床事实比。官方自己在 Limitations 里把这条列为第一条。
需要跨语言或中文临床文本,它给不了。 全部英文,来源是美国单一医学中心的出院小结。中文病历的主诉书写习惯、时间表达方式(「3 天前」「半月前」「自幼」)与英文差异大,迁移需要重做 prompt 与验证。
需要覆盖门诊、急诊、社区医疗,它偏了。 上游 MIMIC-IV-Note 只含 BIDMC 一家三级医院的住院与急诊记录,2008–2019。基层、慢病长期随访、护理院场景都不在里面。
需要事件之间的因果或时序依赖图,它只有并列。 它给的是「事件 → 时间点」的二元关系,不是「A 导致 B」「B 在 A 之后 3 小时且同一次病程内」这类结构化关系。要做病程图需要自己从时间轴上二次推断。
需要大样本患者级统计,样本量可能不够。 26.7 万份小结听起来多,但对应的是「最多 14.6 万名患者」的上界;罕见病、特殊人群的样本依然稀疏。而且上游按「含 100 字符以上简明病程」筛掉了近 20% 的小结,这个筛选本身可能带来偏倚——病程描述简短的小结往往对应简单病例。
§2 规格与构成:它到底长什么样
2.1 从 331,794 到 267,284:第一道筛选
上游 MIMIC-IV-Note v2.2 有 331,794 份去标识出院小结,来自 145,915 名患者,采集自波士顿 Beth Israel Deaconess Medical Center 的住院与急诊,时间跨度 2008–2019。
22MCTS 只用了其中 267,284 份。筛选条件有两条:
- 小结须落在患者某次就诊一年之内;
- 小结须包含「简明病程」(Brief Hospital Course)段落,且该段超过 100 个字符。
第二条是硬条件,因为整条管线的检索 query 就是这段简明病程。没有它,BM25 无从下手。
| 环节 | 份数 | 比例 |
|---|---|---|
| 上游 MIMIC-IV-Note v2.2 | 331,794 | 100% |
| 22MCTS 实际使用 | 267,284 | 80.6% |
| 被筛掉 | 64,510 | 19.4% |
这 19.4% 不是随机丢失。简述病程写得短的小结,通常对应住院过程简单、并发症少的病例。也就是说,数据集在「复杂度」这个维度上有一个隐性下限——过于简单的住院记录在 22MCTS 里是缺失的。如果你的任务包含「区分简单与复杂病例」,这个偏倚会直接影响结果。
2.2 四条核心统计
| 指标 | 数值 | 出处 |
|---|---|---|
| 事件-时间戳对总数 | 22,588,586 | PhysioNet 页面 + 论文 |
| 每份小结最少事件数 | 1 | 官方描述 |
| 每份小结最多事件数 | 244 | 官方描述 |
| 每份小结平均事件数 | 84 | 官方描述 |
| 每个事件平均 token 数 | 3 | 官方描述 |
| 单个事件最长 token 数 | 299 | 官方描述 |
把 22,588,586 除以 267,284 得到 84.51,与官方给的「平均 84 条」吻合。这说明两个数字是同一次统计口径下的结果,没有内部矛盾。
2.3 时间维度:入库前 37%,入库后过半
官方给出的时间分布是理解这份数据性格的关键:
| 时间段 | 占比 | 含义 |
|---|---|---|
| 入院前(负时间戳) | 36.99% | 既往史、院外病程、入院前用药 |
| 住院期间(非负) | 51.19% | 本次住院的事件主线 |
| 出院后(正时间戳,超出出院日) | 11.80% | 随访计划、出院带药调整、预后交代 |
三条加起来 99.98%,剩下 0.02% 是官方四舍五入残差。
这个分布本身就是一条重要提示:超过三分之一的「事件」不是本次住院发生的。它们是病史。如果你直接把整条时间轴当作「本次住院病程」输入模型,会把两年前的胆囊切除术和昨天的发热混在同一条序列里。
2.4 四个字段
官方页面原文说「There are five columns in the table」,然后只列出四个:Hadm_id、Event、Time、Time_bin。这是页面上的笔误,实际结构就是四列。
| 字段 | 类型 | 含义 | 注意 |
|---|---|---|---|
Hadm_id |
整数 | 出院小结唯一标识 | 可回连 MIMIC-IV-Note 与 MIMIC-IV-Ext-BHC;不是 subject_id |
Event |
文本 | 临床事件短片段 | 自由文本,无实体类型、无标准编码 |
Time |
浮点 | 相对入院小时数 | 入院为 0,入院前为负,出院后为正 |
Time_bin |
整数 0–8 | 离散时间区间索引 | 左闭右开,见 §3.3 |
Hadm_id 不是患者 ID,这是最容易出错的一点。同一个 Hadm_id 对应一次住院的一份小结;同一位患者多次住院会有多个 Hadm_id。要做患者级划分,必须先 JOIN admissions 拿到 subject_id。跳过这一步直接按 Hadm_id 分训练测试集,就会让同一位患者的不同次住院分落两边,指标虚高。
2.5 版本与更新节奏
| 项目 | 内容 |
|---|---|
| 当前版本 | 1.0.0 |
| 发布日期 | 2025-09-29 |
| 更新说明(官方原文) | “This is the initial release… Future updates may include additional records, further preprocessing improvements, and expanded metadata.” |
| 数据现状 | 页面在部分地区显示 “Data Not Available — Data is not available in your region due to legal or policy restrictions.” |
| 浏览量 | 337(当前版本 / 全部版本) |
「1.0.0」意味着还没有经过一轮使用者反馈的修整。PhysioNet 上同类派生数据集的经验是:首版的事件边界与时间戳误差,往往在后续版本里会被重跑调整。如果你要在论文里引用具体数字,务必锁定版本号。
§3 那根时间轴是怎么造出来的
这是整份数据集最值得读的部分。理解了管线,才知道哪些事件可信、哪些不可信。
3.1 五步管线
出院小结(平均 2,267 ± 914 token)
│
├─① 切块:每块 5 token,前 5 + 后 5 token 作上下文
│ → 每份小结 200–400 块进入块池
│
├─② 上下文 BM25:以「简明病程」为 query 取 top 100 块
│ → 每份小结保留 100 块
│
├─③ 语义检索:BGE-Large-en 计算相似度,阈值 0.75
│ → 每份小结命中 200–400 块
│
├─④ 合并去重:②与③的结果并集
│ → 每份小结 200–400 块
│
└─⑤ Llama-3.1-8B 标注
→ 判定 50–100 块含事件
→ 清洗后常低于 50 块
→ 展开为事件-时间戳对,均值 84 条
第 ① 步的「5 token」需要特别说明:原文是 “Each discharge summary form is split into a list of chunks with 5 tokens, the previous 5 tokens and the following 5 tokens are treated as the context”。也就是滑动窗口切块,窗口 5 token,上下文各 5 token。5 token 在英文里大约是 3–5 个词,约半个短语。这个粒度极细,目的是让 LLM 能在极短片段上做判定,而不是在一整段里含糊取舍。
第 ③ 步的 0.75 阈值,论文说 “based on empirical evaluation”——是经验值,不是调优出来的最优点。
第 ⑤ 步的收缩很猛:从 200–400 块降到 50–100 块,再降到清洗后的不足 50 块。这意味着一份小结里只有很小一部分文本被认为含临床事件。 官方 Figure 3 的说明里有一句:「有大约 8,000 份小结在 Llama 标注后剩 20 块」。
3.2 为什么用 Llama-3.1-8B 而不是更大的模型
论文给的理由是三条的权衡:MIMIC 数据的访问限制、计算效率、标注质量。
第一条最关键。MIMIC 数据受 DUA 约束,不能送到第三方 API。官方页面在安全说明里写得很明确:
“The LLaMA-3.1-8B model was downloaded and executed locally in a firewalled, access-controlled, non-networked HPC cluster. No patient data or model outputs were transmitted to or processed on any third-party cloud or external server.”
所以这不只是技术选择,是合规约束下的唯一可行路径。28 万份小结 × 每份数百块,全部要本地推理,8B 是一个能在 NIH Biowulf 集群上跑完的规模。
3.3 九个时间分箱
Time_bin 把连续小时映射成离散区间,边界是 -60、-30、-15、0、15、30、60、120:
| Bin | 区间 | 左闭右开 | 临床含义 |
|---|---|---|---|
| 0 | (-∞, -60) | ✓ | 入院前两个月以上,既往史 |
| 1 | [-60, -30) | ✓ | 入院前 1–2 个月 |
| 2 | [-30, -15) | ✓ | 入院前 2–4 周 |
| 3 | [-15, 0) | ✓ | 入院前两周内 |
| 4 | [0, 15) | ✓ | 入院后前 15 小时 |
| 5 | [15, 30) | ✓ | 入院后第 1 天 |
| 6 | [30, 60) | ✓ | 入院后 1–2.5 天 |
| 7 | [60, 120) | ✓ | 入院后 2.5–5 天 |
| 8 | [120, ∞) | ✓ | 入院后 5 天以上 |
官方给的例子:时间戳 -120 落在 Bin 0,时间戳 45 落在 Bin 6。
这个分箱的疏密是刻意设计的:在入院前后各 15 小时处切得最细。因为临床决策最密集的窗口就是入院当天。而 Bin 8 把 5 天以上的全部压成一类——对平均住院 4–5 天的 ICU 人群问题不大,对长住院(比如骨髓移植、严重创伤)就丢掉了内部时间分辨。
3.4 后处理:官方承认的四种脏数据
论文在 “Post processing for LLM based Annotation” 一节里列了 Llama-3.1-8B 的典型输出错误:
| 错误类型 | 具体表现 | 处理 |
|---|---|---|
| 非法时间戳 | 输出 “NaN” 或 “in” 而不是数字 | 剔除 |
| 重复事件 | 同一事件被输出多次 | 去重 |
| 列错位 | 事件写进 Time 列、时间戳写进 Event 列 | 交换或剔除 |
| 非文本内容 | 输出里混入非文本字符 | 剔除 |
| 空话填充 | 反复输出 “no acute process” | 剔除 |
这段坦白很有价值:它告诉你数据的噪声来源是结构性的、可枚举的,不是随机的。你在使用时会遇到同样的模式——如果发现某份小结的 Event 列里出现纯数字,那就是列错位没清理干净。
3.5 Prompt 有效性验证:10 份病例、三个人工/模型对照
为了证明 prompt 设计合理,作者做了一次小规模验证:从公开病例报告中随机选 10 份(PMC4478313、PMC4818304、PMC5667582、PMC6030904、PMC6034490、PMC7337692、PMC7747049、PMC8127753、PMC9871993 等),由一位医生人工标注,再让 GPT-4 与 O1-preview 用同一套 prompt 跑,对比结果。
Table 4 原文数据(中位数 [区间]):
| 统计量 | 人工 | GPT-4 | O1-preview |
|---|---|---|---|
| 事件数 | 32 [14, 70] | 46 [20, 297] | 39 [27, 58] |
| 不同时间戳数 | 6 [2, 13] | 6 [1, 16] | 6 [3, 13] |
三个方法给出的「不同时间戳数」中位数都是 6,这一点很关键——说明模型没有乱造时间点,它识别出的关键时间节点数量与医生一致。但事件数上,GPT-4 的上界 297 远高于人工的 70,说明模型会过度拆分。
一致性指标(原文):
| 指标 | GPT-4 | O1-preview |
|---|---|---|
| 事件匹配率(cosine 距离阈值 0.1 起) | 70–80% | — |
| 时间戳一致率(concordance) | 0.912 | 0.951 |
| 相对时间完全一致比例 | 50–75% | — |
| 误差 < 24 小时比例 | 70–85% | — |
注意这里的口径差:一致率 0.912 与「完全一致 50–75%」不是矛盾,是两个不同指标。前者是相关性/一致性统计,后者是逐条严格比对。很多二手解读把这两个数混为一谈,说「模型准确率 91%」,这是错的。
Table 3 给出一个完整例子(病例 PMC4300884,腰椎神经根病):
| 事件 | 时间戳(小时) |
|---|---|
| 右侧 L5 神经根病症状起病 | -4320 |
| 到诊所就诊 | -1440 |
| 影像(X 线 + CT)显示 L5-S1 前方大骨赘 | -1440 |
| 选择性 L5-S1 神经根阻滞注射 | -720 |
| 注射后症状暂时改善 | -720 |
| 保守治疗穷尽,患者选择手术 | -168 |
| 手术:L5-S1 前路椎间融合 + 骨赘切除 | 0 |
| 术后即刻腿痛缓解 | 0 |
| 术后六个月无症状,康复中 | 4320 |
这个例子把数据集的性格暴露得很清楚:-4320 小时是 180 天前,-1440 是 60 天前,-720 是 30 天前,-168 是 7 天前,0 是手术(这里把手术当作 pivot,不是入院),4320 是 180 天后。时间颗粒度是「天」级别,不是「小时」级别。虽然字段单位是小时,但实际推断精度到不了小时。
这条要用大字写在心上:单位是小时,精度是天。
§4 接口层:怎么把它读进来
4.1 访问申请
22MCTS 与 MIMIC-IV 使用同一套 PhysioNet 凭证体系。申请流程:
- 注册 PhysioNet 账号;
- 完成 CITI Program 的「Data or Specimens Only Research」课程并通过考核(通常 4–6 小时);
- 在 PhysioNet 上提交 Credentialed Access 申请,上传机构身份证明;
- 签署 PhysioNet Credentialed Health Data Use Agreement 1.5.0;
- 审核通过后,
wget或浏览器下载。
因为来源是 MIMIC-IV-Note,通常与 MIMIC-IV 主库一起申请,避免重复走流程。
4.2 加载与基本检查
import pandas as pd
df = pd.read_csv("clinical_event_timestamp.csv")
#--基本体检:行数应为 22,588,586
assert len(df) == 22_588_586, f"行数异常: {len(df)}"
#--四列结构
print(df.columns.tolist())
#--['Hadm_id', 'Event', 'Time', 'Time_bin']
#--每份小结的事件数分布
per_note = df.groupby("Hadm_id").size()
print("小结数:", per_note.size) # 期望 267,284
print("均值:", per_note.mean()) # 期望约 84.5
print("最大:", per_note.max()) # 期望 244
print("最小:", per_note.min()) # 期望 1
这三个数与官方声明是对得上的——这是这份数据集的优点之一:核心统计量自洽。
4.3 时间轴的三个坑
坑一:负时间戳不是错误。 Time < 0 表示事件发生在入院前。直接 df[df.Time >= 0] 会丢掉 37% 的数据,而这里面恰恰包含了最重要的既往史信息。
坑二:Time = 0 不等于「入院那一刻发生」。 论文说 pivot「通常是入院事件」,但例子里 pivot 是手术。也就是说 0 点在不同小结里可能指代不同事件。要做跨小结对齐,必须先确认这份小结的 pivot 是什么——从 0 附近的事件文本可以大致判断。
坑三:Time_bin 是左闭右开,边界值归属要看清。 Time = 0 落在 Bin 4([0,15)),不是 Bin 3。Time = -15 落在 Bin 3([-15,0)),Time = -15.0 严格等于边界时归 Bin 3。用 pd.cut 复现时要显式设 right=False。
import numpy as np
BINS = [-np.inf, -60, -30, -15, 0, 15, 30, 60, 120, np.inf]
#--复现 Time_bin,注意 right=False 实现左闭右开
recomputed = pd.cut(df["Time"], bins=BINS, labels=False, right=False)
mismatch = (recomputed != df["Time_bin"]).sum()
print("分箱不一致行数:", mismatch)
如果 mismatch 不为 0,先查是不是 Time 有 NaN,或者 Time_bin 有越界值(0–8 之外)。
4.4 回连 MIMIC-IV 拿患者与时间
-- 在 MIMIC-IV 的 PostgreSQL 实例里执行
-- 目的:把 Hadm_id 换成 subject_id,并拿到真实入院时刻
SELECT
e.hadm_id,
a.subject_id,
a.admittime,
a.dischtime,
a.admission_type,
a.insurance
FROM your_22mcts_table e
JOIN mimiciv_hosp.admissions a
ON a.hadm_id = e.hadm_id;
注意 hadm_id 在 MIMIC-IV 里是整数,在 22MCTS 的 CSV 里可能被读成 int64 或 object,join 前统一类型。
4.5 把事件序列拼成模型输入
论文里对 GPT-2 的做法是:词汇表新增 [TIME] 与 [EVENT] 两个特殊 token,序列化格式为:
[TIME]<timestamp>[EVENT]<description>
示例(按时间排序后):
[TIME]-72 [EVENT]fever
[TIME]-72 [EVENT]chills
[TIME]-48 [EVENT]presented to emergency department
[TIME]0 [EVENT]admission
[TIME]2 [EVENT]started on ceftriaxone
[TIME]6 [EVENT]blood culture positive for strep pneumoniae
最大序列长度 128 token,空样本丢弃。训练超参:batch size 8、学习率 1e-5、3 个 epoch。
这个序列化方式有个隐含问题:它按时间排序后就把事件当作序列,但同一时间点上的多条事件之间没有顺序。fever 和 chills 都在 -72 小时,模型无法从序列位置区分它们谁先出现。要建模同刻事件的关系,需要额外的位置编码或分组标记。
§5 三层:字段层、内容层、任务层
5.1 字段层:只有四个字段能给你什么
四个字段看起来单薄,但组合起来的信息量不小:
| 你能问的问题 | 用哪些字段 | 局限 |
|---|---|---|
| 这份小结讲了多少件事 | groupby(Hadm_id).size() |
受管线筛选影响,不代表文本真实信息量 |
| 事件大致发生在病程哪个阶段 | Time |
精度约到天 |
| 入院前后事件密度对比 | Time 正负分组 |
需要区分病史与本次病程 |
| 有哪些高频反复出现的事件 | Event 词频 |
同义写法未合并 |
| 事件的长尾程度 | Event 去重计数 |
自由文本,长尾极重 |
| 时间分箱的临床节奏 | Time_bin + Hadm_id |
Bin 8 内部无分辨 |
5.2 内容层:事件文本的性格
事件是「短文本片段」,平均 3 token。这意味着它通常是一个名词短语或极短的动宾结构:
feverright lower lobe pneumoniastarted on ceftriaxonehistory of cholecystectomydenies chest pain
Max tokens per event 达 299,说明存在极少数长片段——很可能是 LLM 把一整句甚至一段话当成一个事件输出了。这类超长事件在使用时应当单独处理,它们往往包含了多个可拆分的事件。
论文明确讲了拆分规则:「Separate conjunctive phrases into their component events, for example, convert ‘fever and rash’ to two events ‘fever’ and ‘rash’」。所以 fever and rash 会变成两条。但这条规则执行得不完全——299 token 的长事件就是证据。
事件不做 UMLS 归一化是刻意的设计选择,论文给了理由:cTAKES、MetaMap 这类工具依赖预设词表,新概念会漏;而临床事件之间的关联常是概念上的而非语义上的(举的例子是胺碘酮与心血管疾病——常被用于严重心律失常患者,但两者不可互换)。代价是同义写法无法自动合并,fever、febrile、elevated temperature 会是三条独立事件。
5.3 任务层:三类下游用法
| 任务类型 | 怎么用 22MCTS | 需要额外什么 | 风险 |
|---|---|---|---|
| 预训练 / 继续预训练 | 直接把事件-时间序列当语料喂给编码器或解码器 | 无需额外标注 | 继承了标注噪声 |
| 弱监督微调 | 用它做中间任务,再在下游小样本上微调 | 下游标注 | 中间任务的错会传导 |
| 事件关系分类 | 用 Time 的大小关系构造因果/顺承标签 |
无(论文做法) | 时间先后 ≠ 因果 |
| 临床试验匹配 | 用时间约束筛候选 | trial 库 | 约束语义需另解 |
| 严格评测基准 | 不适用 | 无 | 无金标准 |
论文自己做的 BERT 微调就是「事件关系分类」:给定同一患者的两条事件 Ea、Eb,Ea 先出现。若 Ta = Tb 标为无关联(0);若 Tb > Ta,表示 Eb 是 Ea 的结果,标为正相关(1);若 Tb < Ta,表示 Eb 是 Ea 的可能原因,标为负相关(2)。
这个标签构造方式值得单独说一句:它把「时间先后」直接当作「因果关系」的代理。这在数据规模上可行,但逻辑上不成立——先发生不代表是原因。用这套标签训出来的模型,学到的是时间箭头,不是因果结构。如果你的目标是因果推断,这条路走不通。
§6 AI 就绪指南
6.1 五分钟跑通一个最小验证
import pandas as pd
df = pd.read_csv("clinical_event_timestamp.csv")
#--挑一份事件数接近均值的小结做样例
sizes = df.groupby("Hadm_id").size()
target = sizes[(sizes >= 80) & (sizes <= 90)].index[0]
sample = df[df.Hadm_id == target].sort_values("Time")
print(f"Hadm_id = {target},{len(sample)} 条事件")
print(sample.head(20).to_string(index=False))
看到输出后先问自己三个问题:这份小结的 pivot(Time=0)是入院还是手术?-1440 附近是院外病程还是既往史?Bin 8 里的事件是不是把出院后的随访混进来了?
6.2 坑点 1:把负时间戳当脏数据删掉
最常见的错误写法:
#--错误:直接过滤负值
clean = df[df.Time >= 0]
这样会丢掉 36.99% 的数据。而这 37% 里包含既往手术史、长期用药、症状起病时间——恰恰是临床推理最需要的背景。正确做法是保留,但在特征里显式区分「入院前/住院中/出院后」三段。
6.3 坑点 2:按 Hadm_id 随机划分训练测试集
#--错误:按小结划分,同一患者可能跨集
from sklearn.model_selection import train_test_split
train_ids, test_ids = train_test_split(df.Hadm_id.unique(), test_size=0.2)
论文里对 GPT-2 的做法确实是「收集唯一出院小结 id,随机打乱,按 80/10/10 划分」。但论文同时也说了这是按小结划分。如果你的下游任务是患者级预测(比如「这位患者明年会不会再入院」),按小结划分会造成同患者泄漏。
正确做法:
-- 先拿到患者映射,再按 subject_id 划分
SELECT hadm_id, subject_id FROM mimiciv_hosp.admissions;
hadm2subj = pd.read_sql(sql, conn).set_index("hadm_id")["subject_id"]
df["subject_id"] = df.Hadm_id.map(hadm2subj)
#--按患者划分
from sklearn.model_selection import GroupShuffleSplit
gss = GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
train_idx, test_idx = next(gss.split(df, groups=df.subject_id))
6.4 坑点 3:把「不同时间戳数」当成事件精度
一份小结只有 6 个不同时间戳是常态(人工标注、GPT-4、O1-preview 三者中位数都是 6)。这意味着同一天里的多件事共享同一个时间戳。你若按 Time 去重事件做统计,会把大量同刻事件合并掉。
#--每份小结的不同时间戳数,官方口径中位数约 6
per_note_ts = df.groupby("Hadm_id")["Time"].nunique()
print(per_note_ts.describe())
6.5 坑点 4:把 Time_bin 当连续特征
Bin 0 覆盖 (-∞, -60),它的「宽度」是无穷大;Bin 8 覆盖 [120, ∞),同样是无穷。把 Time_bin 当数值特征输入线性模型,等于假设 Bin 0 与 Bin 1 的距离和 Bin 4 与 Bin 5 的距离相同——这显然不对。
正确做法是用 one-hot,或者用 Time 的连续值配单调变换(如 sign(t) * log1p(|t|))。
6.6 坑点 5:忽略 Bin 8 的时间塌缩
对长住院(> 5 天),所有事件都进 Bin 8。一份住院 30 天的骨髓移植小结,第 6 天和第 29 天的事件在 Time_bin 上完全一样。
#--检查长住院的比例
long_stay = df[df.Time >= 120].groupby("Hadm_id").size()
print("含 Bin 8 事件的小结数:", long_stay.size)
print("Bin 8 事件总数:", long_stay.sum())
如果这部分占比高,而你的任务又关心住院后期的事件,Time_bin 就不能用,必须用连续 Time。
6.7 坑点 6:把事件文本直接当规范术语用
Event 是自由文本,同一概念多种写法。要统计「有多少患者发热」,直接 df.Event == "fever" 会严重低估。需要先做归一化:
#--最小限度的归一化:小写 + 去标点 + 去尾部空白
import re
def norm(s):
s = str(s).lower().strip()
s = re.sub(r'[^\w\s]', ' ', s)
return re.sub(r'\s+', ' ', s).strip()
df["event_norm"] = df.Event.map(norm)
更彻底的做法是接一个 UMLS 映射或句向量聚类,但那是另一个工程量。
6.8 坑点 7:以为 22MCTS 能替代结构化查询
22MCTS 的事件时间精度是天级别。要做「入院后 6 小时内乳酸是否 > 2」这种查询,必须用 MIMIC-IV 的 labevents,那里有精确到分钟的 charttime。22MCTS 能用的是「乳酸升高这件事在这份小结的病程里被提到了,大致在第 1 天」。
两者是互补关系:结构化表给你精确的数值与时刻,22MCTS 给你叙事层面的因果链与背景。
6.9 坑点 8:跨小结直接拼接时间轴
不同小结的 Time = 0 可能指代不同事件(入院 vs 手术 vs 其他 pivot)。把同一患者多次住院的序列直接拼成一条时间轴,会导致轴上的零点语义漂移。
要拼必须先统一 pivot:
-- 用 admittime 做统一参考点
SELECT hadm_id, subject_id, admittime
FROM mimiciv_hosp.admissions;
然后 absolute_time = admittime + Time * interval '1 hour'。但要注意:如果某份小结的 pivot 是手术而非入院,这个换算会整体偏移。这个偏移没有官方修正方案,只能靠人工抽查估算。
§7 质量评估:DAIMS 框架
读这一节之前先纠正一个认知:22MCTS 的质量问题不是「数据脏」,而是「数据的不确定性没有被标注出来」。它每一行都没有置信度、没有来源块号、没有人工核验标记。你无法从数据本身判断某条事件的可靠性。
7.1 DAIMS 五维评分
| 维度 | 评分 | 依据 |
|---|---|---|
| Data Collection(采集) | ★★★☆☆ | 上游 MIMIC-IV-Note 是成熟的去标识流程;但仅一家医院、仅住院与急诊、仅 2008–2019 |
| Annotation(标注) | ★★☆☆☆ | LLM 单模型标注,无人工复核,无金标准;prompt 验证仅 10 份病例 |
| Intrinsic Quality(内在质量) | ★★★☆☆ | 核心统计量自洽(84 条均值可复算);但存在列错位、超长事件等已知脏数据 |
| Metadata(元数据) | ★★★☆☆ | 四字段定义清晰;但页面有「五列」笔误,未给患者数、文件大小、事件类型体系 |
| Standardization(标准化) | ★★☆☆☆ | 未映射 UMLS/SNOMED/ICD;时间分箱自定义;无 schema 定义文件 |
7.2 为什么 Annotation 只给两星
不是因为 Llama-3.1-8B 不行,而是因为验证规模与数据规模严重不匹配:
| 指标 | 数值 |
|---|---|
| 数据集规模 | 267,284 份小结 / 22,588,586 条事件 |
| Prompt 验证规模 | 10 份病例报告 |
| 验证中的人工标注者 | 1 位医生 |
| 验证集与数据集的关系 | 完全不同的来源(公开病例报告 vs MIMIC 出院小结) |
10 份验证 267,284 份,比例是 0.0037%。而且验证用的是公开病例报告(PMC 系列),不是 MIMIC 小结——两者的写作风格、长度、术语密度都不同。这个验证能证明「prompt 设计是合理的」,不能证明「在 MIMIC 上的产出是准确的」。
这不是挑刺,官方自己在 Limitations 里承认了。这里只是把它的含义讲清楚:你在 22MCTS 上看到的任何统计现象,都要先假设它可能是标注伪影。
7.3 已知的、可枚举的偏差
| 偏差 | 来源 | 影响 |
|---|---|---|
| 简单病例缺失 | 上游按「简明病程 > 100 字符」筛选 | 19.4% 的小结被排除,模型对简单病例的覆盖不足 |
| 事件过度拆分 | LLM 倾向于把短语拆细 | 事件数虚高,长尾被放大 |
| 时间精度天花板 | 文本本身只给「三天前」这类模糊表述 | 精度约到天,小时是伪精度 |
| 同刻事件无顺序 | 6 个时间戳承载 84 条事件 | 无法建模同日内的先后 |
| 缺失否定与不确定 | prompt 未显式要求处理「否认」「疑似」 | denies chest pain 可能被记为一条事件 |
| 单一机构 | BIDMC 一家三级医院 | 术语习惯、记录风格、患者构成都有机构特征 |
| 时间跨度 2008–2019 | 上游数据截止 | 新冠时期、近五年新药与新术语缺失 |
「否认」这一类要特别提。denies chest pain 在文本里确实是「胸痛」相关的一段,但它的临床含义是「没有胸痛」。如果它被记成一条 Event,时间轴上就多了一个不存在的胸痛事件。论文的 prompt 指导里要求「尽可能多地收录事件」,这条要求会放大这个问题。
7.4 它凭什么还活着
一个没有金标准、验证规模只有 10 份病例的数据集,为什么值得用?
第一,它填了一个真空。 在此之前,公开的临床事件时间序列数据集基本没有万级别的,更没有千万级别的。要研究「怎么把叙事文本变成时间轴」,需要有一个够大的参照物。
第二,它的管线是可复制、可批评的。 切块大小、检索模型、阈值、LLM 型号、prompt 指导、后处理规则,全部写在论文与页面上。你可以完全照抄,也可以只替换其中一个环节做消融。这种透明度在派生数据集里并不常见。
第三,它的下游验证给出了真实增益。 不是刷分,是在 PubMedQA 与 TREC 两个公开基准上,用同一套 BERT 架构、同一套超参,只换预训练数据,得到可复现的提升。这至少证明标注里有真实信号。
第四,它承认自己的问题。 Limitations 一节写得比很多论文的正文还实在:明说没有金标准、明说可能幻觉、明说时间估计不精确、建议用户抽样人工验证。
第五,它把 LLM 标注的合规路径走通了。 本地部署、防火墙内推理、数据不出网——这套流程对任何要在受限数据上跑 LLM 的团队都是直接可用的模板。
7.5 与其他 MIMIC 派生集的关系
站内已有多个 MIMIC 派生条目,22MCTS 在其中的位置需要说清:
| 条目 | 派生自 | 产出物 | 与 22MCTS 的关系 |
|---|---|---|---|
| MIMIC-IV-Ext-22MCTS | MIMIC-IV-Note | 事件-相对时间戳对 | 本文 |
| MIMIC-IV-Ext-ECG-Glucose | MIMIC-IV + MIMIC-IV-ECG | ECG 与血糖时间配对 | 同为「时间配对」,但对象是信号与检验值 |
| MIMIC-IV-Ext-PE | MIMIC-IV(报告) | CTPA 报告五类标签 | 同为文本标注,但无时间维度 |
| MIMIC-Ext-SynNotes | MIMIC-III/IV 笔记 | 改写后的合成语料 | 同为文本加工,但目标是隐私增强而非结构化 |
| MIMIC-Ext-CXR-QBA | MIMIC-CXR | 视觉问答三元组 | 同为问答构造,但对象是影像 |
一句话区分:别的派生集在做「配对准不准」,22MCTS 在做「时间对不对」。
§8 基准与生态
8.1 PubMedQA:10 折均值,47.77% → 54.07%
论文用 PubMedQA 的 1,000 条专家标注子集,10 折交叉验证,比较原始 BERT 与在他们的数据集上微调的 Temporal BERT。两者分类头结构一致(输入 768、隐层 256),优化器 Adam、学习率 3e-5、3 个 epoch、batch 16。
Table 5 逐折准确率:
| Fold | BERT | Temporal BERT |
|---|---|---|
| 0 | 53.6 | 56.2 |
| 1 | 50.00 | 56.66 |
| 2 | 46.00 | 55.2 |
| 3 | 47.00 | 55.2 |
| 4 | 50.00 | 55.2 |
| 5 | 47.6 | 55.2 |
| 6 | 44.2 | 42.6 |
| 7 | 47.00 | 55.2 |
| 8 | 48.4 | 55.2 |
| 9 | 44.00 | 55.2 |
| 均值 ± 标准差 | 47.77 ± 7.57 | 54.07 ± 16.72 |
读这张表要注意三件事。
第一,Fold 6 是反向的(44.2 → 42.6)。10 折里有 1 折退步,说明增益不是无条件的。
第二,Temporal BERT 的标准差从 7.57 涨到 16.72,翻了一倍多。均值提升 6.3 个百分点,但波动也大幅增加。8 折的准确率都精确落在 55.2——这个数字重复得太整齐了,暗示这 8 折上模型可能都收敛到了同一个退化解(比如全判某一类)。这是一个需要警惕的信号。
第三,论文摘要里的「10% 提升」是相对提升:(54.07 - 47.77) / 47.77 ≈ 13.2%,或者说「提升约 6.3 个百分点」。22MCTS 页面写的「10% improvement in accuracy」如果被读成「准确率到 10%」,就完全错了。
8.2 TREC 临床试验匹配:三个数据集,八个指标
任务设定:把患者描述与 ClinicalTrials.gov 的试验做相关性排序,三档标签(不相关 0 / 潜在 1 / 符合 2)。
Table 6 数据集统计:
| 项目 | 训练集 | TREC 2021 | TREC 2022 |
|---|---|---|---|
| 患者数 | 59 | 75 | 50 |
| 试验数 | 204,855 | 375,580 | 448,631 |
| 患者年龄均值 | 38.5 ± 23.7 | 41.6 ± 19.4 | 35.3 ± 20.2 |
| 性别(男/女) | 50/50 | 50.6/49.4 | 56/44 |
| 不相关试验/患者 | 46 ± 379 | 323 ± 8,624 | 568 ± 26,926 |
| 潜在试验/患者 | 11 ± 103 | 80 ± 3,641 | 60 ± 4,291 |
| 符合试验/患者 | 7 ± 45 | — | — |
注意「不相关试验/患者」的标准差:TREC 2022 是 568 ± 26,926。标准差是均值的 47 倍——这个分布的尾部极重,意味着极少数患者面对几十万个候选试验。这种分布下 NDCG 这类指标会被少数样本主导。
Table 7 结果(NDCG / Precision / Recall,@10 与 @100):
| 指标 | 截断 | TC21 BERT | TC21 T/BERT | TC22 BERT | TC22 T/BERT |
|---|---|---|---|---|---|
| NDCG | @10 | 33.28 | 36.53 | 29.43 | 29.94 |
| NDCG | @100 | 33.19 | 35.15 | 22.69 | 26.86 |
| Precision | @10 | 49.06 | 50.13 | 34.00 | 36.00 |
| Precision | @100 | 39.86 | 40.42 | 23.76 | 27.68 |
| Recall | @10 | 3.57 | 3.52 | 2.85 | 2.52 |
| Recall | @100 | 29.01 | 30.39 | 16.01 | 21.57 |
读法:NDCG、Precision 上 Temporal BERT 在 8 个组合里 7 个赢,但 Recall@10 两项都输(3.57→3.52、2.85→2.52)。也就是说它把排在前面的做准了,但前 10 名里覆盖到的相关试验变少了。对临床试验匹配这种「宁可多给几个候选」的场景,Recall 下降是要注意的。
Recall@10 绝对值只有 2–3%,说明前 10 个结果里命中的相关试验占比极低——这与候选池有 20–45 万个试验有关。所有模型在这个任务上的绝对表现都很差,比较的只是「谁稍好一点」。
8.3 GPT-2 微调:只有定性对比
论文对 GPT-2 的评估是人工看输出,没有量化指标。三个示例问题:
- 化疗患者的周期与随访影像通常是什么时间安排?
- 哪些指标提示需要进 ICU?
- 术后早期管理要点是什么?
结论是微调后的 GPT-2「更贴近化疗语境」「提到了输液与静脉镇痛」这类具体措施,而原始 GPT-2「太宽泛,没有提到实际时间安排或影像计划」。
| 项目 | 设定 |
|---|---|
| 序列最大长度 | 128 token |
| 新增特殊 token | [TIME]、[EVENT] |
| batch size | 8 |
| 学习率 | 1e-5 |
| epoch | 3 |
| 数据划分 | 按小结 80/10/10 随机 |
GPT-2 这部分证据强度弱于 BERT:没有量化指标、没有盲评、没有多人评分一致性。把它当作「方向性演示」而不是「性能证明」更合适。
8.4 生态位置
| 资源 | 规模 | 时间标注 | 与 22MCTS 的差异 |
|---|---|---|---|
| MIMIC-IV-Ext-22MCTS | 2,258 万事件 / 26.7 万小结 | 相对小时(LLM 推断) | 本文 |
| MIMIC-IV 结构化表 | 数亿行 | 绝对时刻(设备记录) | 精确但只覆盖被系统采集的项目 |
| MIMIC-IV-Note | 33.2 万份小结 | 无 | 22MCTS 的原料 |
| MIMIC-Ext-BHC | 简明病程摘要 | 无 | 22MCTS 的检索 query 来源 |
| n2c2 时序挑战赛数据 | 数百份 | 人工标注事件与时间 | 小但有人工金标准 |
| THYME / i2b2 时序 | 数百份 | 人工标注 | 同上 |
| MIMIC-Ext-SynNotes | 464 万份合成笔记 | 无 | 目标是隐私增强,不是结构化 |
这张表说明了 22MCTS 的独特处境:它是有金标准的小数据集(n2c2、THYME)与无标注的大语料(MIMIC-IV-Note)之间的一种折中。规模上去了,标注质量下来了。选哪一端,取决于你的任务能不能容忍噪声。
§9 使用指引
9.1 四类用户的路径
做预训练/继续预训练的人: 直接用 [TIME]/[EVENT] 序列化格式,按 Hadm_id 划分,注意别把负时间戳删掉。评估时不要用 22MCTS 自己的「准确率」,去下游任务上报。
做临床 NLP 研究的人: 把 22MCTS 当 baseline 管线的复现参照。重点看它的后处理规则(§3.4)与 prompt 验证方法(§3.5),这两部分比数据本身更有复用价值。
做风险预测的人: 用 22MCTS 做特征增强,不要做唯一特征。与结构化表(labevents、chartevents)联合建模,22MCTS 负责补充叙事层的背景与因果链。
做数据工程的人: 这套「切块 → 双路检索 → LLM 标注 → 后处理」的管线可以直接搬到其他非结构化临床文本上(护理记录、影像报告、病理报告)。本地部署 LLM 的合规路径也是现成模板。
9.2 引用要求
必须同时引用三样:
-
数据集本身:
Wang, J., Niu, X., Zhang, T., Shen, J., Kim, J., & Weiss, J. (2025). MIMIC-IV-Ext-22MCTS: A 22 Millions-Event Temporal Clinical Time-Series Dataset with Relative Timestamp (version 1.0.0). PhysioNet. RRID:SCR_007345. https://doi.org/10.13026/dkj6-r828
-
PhysioNet 平台(官方明确要求):
Pollard, T., Moody, B. E., Lehman, L., Gow, B., Fernandes, C., Xie, C., Johnson, A., Mark, R. G., & Heldt, T. (2026). PhysioNet as a global platform for biomedical research. Nature Health. https://doi.org/10.1038/s44360-026-00096-z
-
上游父项目 MIMIC-IV-Note v2.2(官方原文:「Please cite them when using this project.」)
配套论文:arXiv:2505.00827(v1 2025-05-01,v2 2025-11-17)。注意 v2 标题加了「for Risk Prediction」后缀,与 v1 不同。
9.3 版本锁定建议
在论文里引用时,至少写清四件事:版本号 1.0.0、事件总数 22,588,586、小结数 267,284、访问日期。因为 1.0.0 是首版,官方明确说后续会加记录与改进预处理——数字会变。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 数据性质 | 由 LLM 从去标识出院小结中抽取的事件-时间戳对,非人工标注金标准 |
| 可否直接用于训练 | 可以,但须视为弱标签;建议配合下游人工标注做微调 |
| 建议用途 | 预训练、继续预训练、弱监督中间任务、事件关系分类、管线复现 |
| 不建议用途 | 严格评测基准、高利害临床决策、精确时间查询、因果推断 |
| 幻觉风险 | 官方明示 LLM 可能生成原文本不存在的事件,或混入无关小结内容 |
| 时间精度 | 单位小时,实际精度约到天;50–75% 匹配事件时间完全一致 |
| 伦理注意 | 受 DUA 约束,不得尝试重识别;事件文本可能含罕见病与特殊人群描述,输出前需脱敏审查 |
| 偏差风险 | 单一医院、2008–2019、仅住院与急诊、简单病例被筛除 |
| 引用要求 | 数据集 DOI + PhysioNet 平台 + MIMIC-IV-Note v2.2 三者齐备 |
| 版本标注 | 必须写 1.0.0,并注明 22,588,586 / 267,284 两个核心数字 |
| 页面状态 | published |
常见误读(避坑清单)
| 常见说法 | 实际情况 | 证据 |
|---|---|---|
| 「时间戳是真实发生时间」 | 是 LLM 推断的相对小时,精度约到天 | 官方 prompt 验证:完全一致 50–75%,误差 <24h 占 70–85% |
| 「模型准确率 91%」 | 0.912 是一致性统计,不是逐条准确率 | 同页另写「50–75% 完全一致」,两个口径不同 |
| 「10% 提升 = 准确率 10%」 | 是相对提升,绝对值 47.77% → 54.07% | Table 5 十折均值 |
| 「2,258 万事件 = 2,258 万患者事件」 | 覆盖上界 145,915 名患者,实际人数官方未给 | 论文:331,794 份 / 145,915 人;筛选后 267,284 份 |
| 「MCTS 是蒙特卡洛树搜索」 | 是 Multiple Clinical Time Series 缩写 | 数据集全名 |
| 「表有五个字段」 | 官方写五列但只列四列,实为四列 | 页面原文 “five columns” 后仅列 Hadm_id/Event/Time/Time_bin |
| 「Hadm_id 就是患者 ID」 | 是一次住院的标识,同患者多次住院有多个 | 需 JOIN admissions 取 subject_id |
| 「负时间戳是脏数据」 | 是入院前事件,占 36.99%,是核心信息 | 官方时间分布 |
| 「Time=0 一定是入院时刻」 | pivot 通常是入院,但例子里是手术 | Table 3 病例 PMC4300884 |
| 「全部 33.2 万份小结都用上了」 | 只用了 267,284 份,保留 80.6% | 上游按「简明病程 >100 字符」筛选 |
| 「事件映射到了标准医学术语」 | 刻意不映射,全是自由文本 | 论文明确说明不用 cTAKES/MetaMap 的理由 |
| 「可以直接当评测基准」 | 官方明写 No Ground Truth Labels | Limitations 第四条 |
FAQ
Q1:这个数据集和 MIMIC-IV 是什么关系?
它派生自 MIMIC-IV-Note v2.2(出院小结),不是 MIMIC-IV 主库。三者关系是:MIMIC-IV 主库提供结构化表与 admissions/patients 等键;MIMIC-IV-Note 提供 33.2 万份文本;22MCTS 从文本里抽出事件时间序列。要用它做患者级分析,Hadm_id 必须回连主库。
Q2:为什么叫 Ext?
PhysioNet 上 MIMIC 系列的惯例:MIMIC-IV-Ext-XXX 表示从 MIMIC-IV 派生的扩展集。同族还有 MIMIC-IV-Ext-ECG-Glucose、MIMIC-IV-Ext-PE、MIMIC-IV-Ext-BHC 等。
Q3:能不能只下 CSV 不下原始笔记?
可以。CSV 本身不含原文,只有 Hadm_id + 事件片段 + 时间。但注意事件片段已经是原文摘录,仍然受 DUA 约束。
Q4:事件片段里会不会有 PHI?
上游 MIMIC-IV-Note 已完成 HIPAA 去标识(人名、日期、机构名等被替换)。但 LLM 抽取的片段可能把去标识后的占位符(如 [**Name**])也一并抽成事件。使用时要检查这类条目。
Q5:中文病历能用这套管线吗?
管线逻辑通用,但要换三样东西:切块粒度(中文 token 与英文不同)、检索模型(BGE 有中文版)、prompt(中文时间表达的规则不同,如「半月前」「自幼」需要额外规则)。
Q6:为什么平均只有 84 条事件?出院小结通常信息量更大。
因为管线做了四道收缩(§3.1):块池 200–400 → BM25 留 100 → 语义检索与合并 → Llama 只判 50–100 块含事件 → 清洗后常低于 50 块。最终 84 条是「一个块可能产出多条事件」后的结果。
Q7:Time 的浮点精度是多少?
官方未明确。从例子里看有 -4320、-1440、-720、-168 这类整齐值,推测是按可识别的整数小时输出,不做小数插值。
Q8:怎么判断某条事件是幻觉?
没有自动方法。可行的手段是抽样回原文核对:拿到 Hadm_id 后回到 MIMIC-IV-Note 定位对应小结,检索 Event 文本是否真的出现。官方也建议「consider validating subsets of the data with human experts」。
Q9:可以用它训练临床 LLM 吗?
可以用于预训练或继续预训练,但不宜直接做 SFT 的监督信号——因为目标是「抽事件」而不是「回答临床问题」。要做临床问答,仍需另找问答对。
Q10:为什么数据在部分地区不可用?
PhysioNet 页面对某些地区显示「Data is not available in your region due to legal or policy restrictions」。这是平台层面的合规限制,与数据集本身无关。解决方式是走机构合作的 DUA 通道。
术语表
| 术语 | 解释 |
|---|---|
| 22MCTS | Multiple Clinical Time Series,本数据集的缩写,与蒙特卡洛树搜索无关 |
| 相对时间戳 | 以某事件(通常入院)为 0 点的小时偏移,前负后正 |
| pivot | 时间轴的零点事件,论文说通常是入院,但例子里出现过手术 |
| Hadm_id | MIMIC 体系里一次住院的标识,非患者标识 |
| Time_bin | 把连续小时映射到 9 个左闭右开区间的离散索引 |
| 上下文 BM25 | 在 5 token 块前后各加 5 token 上下文后做的 BM25 检索 |
| BGE-Large-en | 北京智源开源的双语/英文句向量模型,此处用于语义检索 |
| RAG | 检索增强生成,此处指先检索候选块再让 LLM 判定 |
| 弱监督 | 用不完美的自动标注训练模型,此处指 22MCTS 的定位 |
| Brief Hospital Course | 出院小结中的「简明病程」段落,本管线的检索 query |
| Concordance | 一致性统计量,0.912 表示与人工标注的一致性程度,非逐条准确率 |
| DAIMS | Data and AI Maturity/Quality Schema,本百科用于多维质量评分的框架 |
| Credentialed Access | PhysioNet 的凭证访问级别,需培训 + DUA |
| DUA | Data Use Agreement,数据使用协议 |
附录 A:核心数字核对表
| 数字 | 官方值 | 复算 / 校验 | 结论 |
|---|---|---|---|
| 事件总数 | 22,588,586 | 页面与论文一致 | 一致 |
| 小结数 | 267,284 | 页面与论文一致 | 一致 |
| 平均事件数 | 84 | 22,588,586 ÷ 267,284 = 84.51 | 一致(四舍五入) |
| 最大事件数 | 244 | 官方单点声明 | 无法复算 |
| 最小事件数 | 1 | 官方单点声明 | 无法复算 |
| 平均 token/事件 | 3 | 官方单点声明 | 无法复算 |
| 最大 token/事件 | 299 | 官方单点声明 | 无法复算 |
| 时间分布三档 | 36.99 / 51.19 / 11.80 | 合计 99.98%,四舍五入残差 0.02 | 一致 |
| 上游份数 | 331,794 | 论文给出 | 一致 |
| 上游患者数 | 145,915 | 论文给出 | 一致 |
| 保留比例 | 未给 | 267,284 ÷ 331,794 = 80.56% | 派生 |
| 筛除份数 | 未给 | 331,794 − 267,284 = 64,510 | 派生 |
| PubMedQA 均值 | 未给 | 十折均值 47.77 / 54.07 | 派生(逐折数据在 Table 5) |
| 访问量 | 337 | 页面显示当前版本 = 全部版本 | 一致 |
一处官方文档不一致:页面原文说「There are five columns in the table」,随后只列出 Hadm_id、Event、Time、Time_bin 四列。以四列为准。
附录 B:数字的来源分层
本篇数字分三类,混用是常见错误来源:
| 类别 | 例子 | 可信度 | 引用方式 |
|---|---|---|---|
| 官方声明 | 22,588,586 / 267,284 / 84 / 244 / 299 | 高(但未给复现脚本) | 直接引,注明版本 1.0.0 |
| 官方派生 | 36.99% / 51.19% / 11.80% | 中(百分比无分子分母) | 引时说明是官方给的占比 |
| 本文派生 | 84.51 / 80.56% / 64,510 | 中(算术正确,口径假设) | 标明「派生」并给算式 |
| 论文 Table | 47.77 / 54.07 / NDCG 36.53 等 | 高(逐折数据可核) | 引 arXiv:2505.00827 表号 |
写论文时最容易混的是第三类和第一类。比如「84.51 条均值」是本文用官方两个数相除得到的,不是官方直接声明的 84。
附录 C:完整参考文献
| 编号 | 文献 | 用途 |
|---|---|---|
| 1 | Wang J. et al. MIMIC-IV-Ext-22MCTS v1.0.0. PhysioNet. DOI 10.13026/dkj6-r828 | 数据集本体 |
| 2 | Wang J. et al. arXiv:2505.00827 (v2, 2025-11) | 方法与实验 |
| 3 | Johnson A. et al. MIMIC-IV-Note. Scientific Data 10 (2023) | 上游数据 |
| 4 | Johnson A. et al. MIMIC-IV v3.1. PhysioNet | 结构化表与键 |
| 5 | Touvron H. et al. Llama 3 (2024) | 标注模型 |
| 6 | Xiao S. et al. BGE (2023) | 语义检索模型 |
| 7 | Devlin J. et al. BERT (2019) | 下游基线 |
| 8 | Radford A. et al. GPT-2 (2019) | 生成式下游 |
| 9 | Jin Q. et al. PubMedQA (2019) | 评测集 |
| 10 | Koopman B., Zuccon G. (2016) | TREC 临床试验匹配测试集 |
| 11 | Aali et al. (2024) | 简明病程段落筛选依据 |
| 12 | Pollard T. et al. PhysioNet platform. Nature Health (2026) | 平台引用要求 |
附录 D:它为何存在,以及靠什么持续
一个没有金标准、验证只有 10 份病例的数据集,凭什么在 PhysioNet 上被引用、被下载、被当作基线?这个问题值得单独拆开,因为它决定了你该把多少信任放进去。
D.1 需求侧:有个洞一直没人填
临床 NLP 领域长期存在一个断层。「小规模人工标注」这一端有 n2c2、THYME、i2b2 的时序挑战赛数据——几十到几百份文档,标注精到事件边界与时间关系,但规模上不去。另一头是 MIMIC-IV-Note 这样的原始语料——33 万份小结,覆盖广,但一行标注都没有。
中间地带是空的:十万份量级、有时间标注、可公开获取。这不只是学术上的空白,是工程上的刚需——任何做临床时序模型的团队都要面对「标注不起」的问题。一份出院小结从阅读到标完时间关系,熟练标注员也要 20–30 分钟。26.7 万份靠人力是不可能完成的,成本量级在十万人时以上。
自动标注提供了一个「先有再优」的通道。即使只有 60% 可用,也把可行的工作范围扩大了一个数量级。
D.2 供给侧:三个前提同时成立
这个数据集能在 2025 年做出来,需要三件事在那之前刚好凑齐。
第一,8B 级别的模型足够做这件事。 2022 年的模型要在「判定这一小块文本是否含临床事件 + 估计相对时间」这件事上达到可用水平,需要大得多的模型。Llama-3.1-8B 在消费级成本下做到了,而且可以本地部署——这是关键,因为 MIMIC 数据不能出网。
第二,检索技术成熟到能把长文档压到 LLM 的上下文窗口内。 一份小结平均 2,267 token,长的到 5,000 以上。块池每份 200–400 块,不筛选直接喂 LLM 成本不可接受。BM25 + BGE 双路检索把候选压到 50–100 块,这一步是工程上的分水岭。
第三,MIMIC 派生生态已经形成了成熟的分发路径。 PhysioNet 的 Credentialed Access、DOI 注册、RRID、版本管理,让一个派生集可以独立于母库被引用。MIMIC-IV-Ext-BHC 在 22MCTS 之前就已经用同一套模式发布过,22MCTS 直接复用了它的「简明病程摘要」作为检索 query。
D.3 维护侧:谁在推动它继续存在
| 角色 | 承担什么 | 动机 |
|---|---|---|
| NLM 院内研究部 | 算力(NIH Biowulf)、研究人员、合规审查 | 机构使命:让临床数据可被研究利用 |
| PhysioNet | 托管、凭证审核、DOI、版本归档 | 平台定位:生物医学数据的公共基础设施 |
| 上游 MIMIC-IV-Note | 原始文本、去标识流程、键体系 | MIMIC 生态的持续投入 |
| 下游复现者 | 引用、报错、提 issue、派生新集 | 自己的研究需要 |
这四条里最脆弱的是第四条。因为数据集没有维护基金,改进动力主要来自使用者反馈。官方在 Release Notes 里写「Future updates may include additional records, further preprocessing improvements, and expanded metadata」——用的是 may,不是 will。
这意味着 1.0.0 可能长期是唯一版本。 如果它的已知问题(无金标准、时间精度天级、事件不归一化)在你的任务里是硬伤,不要指望下一版修好。
D.4 它不会被替代的部分
即使将来出现更好的自动标注数据集,22MCTS 有几样东西是被固定下来的:
管线记录的完整度。 切块参数、检索阈值、prompt 指导、后处理规则、验证方法,全部公开。新的数据集通常在方法描述上更简略。
合规路径的示范。 「在防火墙内本地部署 LLM 处理受 DUA 约束的临床文本」这套流程,已经被 NLM 背书过一次。这对医疗机构的合规部门是有说服力的先例。
负样本价值。 一个明确声明「我没有金标准」的数据集,本身就是一个好的教学材料——它让「LLM 标注能做什么、不能做什么」这个讨论有了具体的、可核查的例子。
D.5 什么情况下它会失效
| 情形 | 后果 |
|---|---|
| 上游 MIMIC-IV-Note 升级到 v3 并改变文本结构 | 管线需重跑,Hadm_id 映射可能变化 |
| PhysioNet 收紧派生集分发政策 | 访问门槛提高,复现成本上升 |
| 出现人工标注的十万级时序数据集 | 22MCTS 退居预训练用途 |
| Llama 系列模型许可变更 | 标注流程需换模型,产出不可比 |
最后一条最值得注意:用不同 LLM 重跑同一条管线,产出的是另一个数据集,不是 22MCTS 的新版本。事件边界、时间估计、拆分粒度都会变。这也是为什么版本锁定在这个数据集上格外重要。
附录 E:与三条替代路线的对照
做「把临床文本变成时间轴」这件事,除了 22MCTS,还有三条现实路线。选哪条取决于你的噪声容忍度与算力预算。
E.1 路线一:规则 + 词典(最便宜,精度看场景)
用现成的时序标注工具(HeidelTime 的临床扩展、SUTime、CTakes 的时间模块)在出院小结上跑规则。优点是完全可解释、零 GPU 成本、结果稳定可复现。缺点是单句内的显式时间(“three days ago”)能抓,跨句指代(“the next day”)与需要临床常识的推断(“a week of antibiotics before admission”)基本抓不到。
| 维度 | 表现 |
|---|---|
| 显式时间表达式召回 | 较高 |
| 跨句时间推理 | 低 |
| 事件边界判定 | 需另接 NER |
| 部署成本 | 极低 |
| 可复现性 | 完全可复现 |
适合:规则明确的窄任务,比如「抽取所有检查报告的日期」。
E.2 路线二:小规模人工标注(最贵,最可信)
按 n2c2 2012 时序挑战赛的模式,请临床背景的标注员标几百到几千份。优点是事件边界与时间关系都有金标准,可以做严格评测。缺点是标注成本不可扩展,且标注一致性本身就是个研究问题(同一段文本两位医生标出的事件数可能差一倍,见 22MCTS 的 Table 4:人工 32 [14,70] 的区间跨度已经五倍)。
适合:需要发表严格评测结果的研究,或者需要为自动标注提供验证集。
E.3 路线三:换用更大的模型但不上规模(折中)
不上 26 万份,只挑 1–5 万份,用更强的模型(GPT-4 级别)配上人工抽检。22MCTS 的 prompt 验证里有直接证据:10 份病例上 GPT-4 的时间戳一致率 0.912,O1-preview 是 0.951,都高于 Llama-3.1-8B 用在数据集上的整体水平。
| 方案 | 份数 | 单份成本 | 质量 | 合规 |
|---|---|---|---|---|
| 22MCTS | 267,284 | 低(8B 本地) | 中 | 本地部署,合规 |
| 大模型小规模 | 10,000–50,000 | 高 | 高 | 数据不能出网,需私有部署 |
| 人工标注 | 500–2,000 | 极高 | 最高 | 需签保密协议 |
E.4 三条路线怎么选
| 你的约束 | 推荐 |
|---|---|
| 要最大规模,容忍噪声 | 22MCTS |
| 要可解释、可复现、零 GPU | 规则 + 词典 |
| 要严格评测或为自动标注做验证集 | 人工标注小规模 |
| 要质量但不想人工 | 大模型 + 私有部署,小规模 |
最实际的组合往往是分层:用 22MCTS 做预训练,用人工标注的 500 份做微调与评测,用规则做兜底的一致性检查。三者各有各的位置,不是替代关系。
编辑说明
本篇所有数字均来自 PhysioNet 项目页(1.0.0 版)、配套论文 arXiv:2505.00827 v2 与官方代码仓 README 三处,未引用二手解读。核验时间 2026-10-26。
数据本体受 DUA 约束,本篇未下载 CSV,因此 22,588,586 / 267,284 / 84 / 244 / 299 等数字为官方声明值,未做逐行复算。文中已明确标注哪些是官方值、哪些是本文用官方值相除得到的派生值(附录 A、B)。
发现一处官方页面内部不一致:正文称表有「五列」,随后只列出四列(Hadm_id、Event、Time、Time_bin)。以四列为准,已在 §2.4 与附录 A 标注。
论文摘要中的「10% improvement」为相对提升口径(47.77% → 54.07%,相对 +13.2%),不是绝对百分点。已在 §8.1 与避坑清单中说明,防止误读为「准确率只有 10%」。
Table 5 中 8 折的 Temporal BERT 准确率均为 55.2,标准差 16.72 高于 BERT 的 7.57,已作为需警惕信号写入 §8.1,未做进一步解释性归因(原文未给)。
未覆盖内容:数据集实际文件大小与行级校验(受 DUA 限制);患者级去重后的真实人数(官方未公布);事件类型分布与高频事件表(需下载后统计);中文场景适配方案(官方未提供)。
数据范围为 1.0.0 版,不涉及后续版本。文中提及的 MIMIC-IV、MIMIC-IV-Note、MIMIC-Ext-BHC 等仅作关系说明,未做逐表核对。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- chinese-critical-care-database — 共享标签:医疗NLP / 电子健康记录 / 时序数据
- loinc — 共享标签:医疗NLP / 电子健康记录 / 临床文本
- coral — 共享标签:医疗NLP / 电子健康记录 / 临床文本
- asclepius — 共享标签:医疗NLP / 电子健康记录 / 临床文本
- mimic-iii — 共享标签:医疗NLP / 电子健康记录
- mimiciii-legacy — 共享标签:医疗NLP / 电子健康记录
- nosocomial-risk-mimic — 共享标签:医疗NLP / 电子健康记录
- phenotype-annotations-mimic — 共享标签:医疗NLP / 电子健康记录
- paediatric-intensive-care — 共享标签:医疗NLP / 电子健康记录
- stroke-scale-mimic-iii — 共享标签:医疗NLP / 电子健康记录
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

