PM Vibe

高质量数据集

1. 病案室要的三样东西,当初装在一个库里

一家三甲医院的病案室同时接到三个需求。质控科要训一个「病案首页填写质量核查」的模型,让它在提交前把填错的项挑出来;信息科要给临床助手接一份诊疗规范,让医生问「这个手术的术前准备有哪些」时查得到;病案室自己还要一批题,用来验核查模型到底准不准。

三个需求要的东西不一样,病案室第一版把三样都放进了一个数据目录,文件夹名字就叫「病案数据」。

结果出了三处毛病。

训练集不干净。目录里有五万份历史病案首页,其中大部分从来没人工核查过。填错的、漏填的、编码抄错的,都在里面。模型照着这批数据学,学到的「正确写法」里混着大量当年的错法。

口径有三套。手术编码这件事,病案首页、结算清单、质控报表三套系统里各有一套写法,三套都进了目录。同一个手术在库里对应三个编码,模型学完不知道以哪一套为准。

没人管版本。临床路径刚改过一版,新版文件进了目录,旧版没撤,两份都在。医生助手检索的时候,可能把旧版的术前准备要求答出来。

三处毛病对应三个问题:这份数据是给谁用的、什么算合格、这件事归谁负责。

2. 三类数据各干什么

2.1 训练集、知识库语料、验证集

同一批业务数据,按用途可以分成三类,三类的做法完全不同。

训练集(Training Set)是拿来训模型或做微调的。它要的是「大量、有标注、能代表真实分布」,条目越多越好,但每一条都必须是人工确认过的。

知识库语料是拿来给它查的。它要的是「准、全、能追到出处、带权限」,条目多少不是重点,重点是每一条都能说出它出自哪一版文件。

验证集(Validation Set)是拿来测效果的。它要的是「干净、有标准答案、覆盖到典型错误」,条数不用多,但每一条都必须有明确的正确答案。

病案室那三件事正好对应这三类:训核查模型要训练集,临床助手要语料,验模型要验证集。

用途 合格线
训练集 条数要多、每条都人工确认过、能代表真实分布
知识库语料 准、全、能追到出处、带权限标签
验证集 条数不用多、有明确正确答案、覆盖典型错误

同一批医院业务数据分成三路;用途不同,合格线也不同,不能混着装。

图注:同一批原始数据分成三路之后,合格线各自不同,混着装就会哪一路都用不好。

2.2 三类的合格线各是什么

把三类的差别摆成一张表,看得更清楚。

比较项 训练集 知识库语料 验证集
条数 越多越好,几千条起步 够用就行,几百份文件常见 不必多,几百条也能跑
人工确认 每一条都要 每一份文件要审过 每一条都要,且要有标准答案
能不能出错 不能,错了模型就学错 不能,错了答错还带着出处 不能,错了测出来的是假分数
出错之后的影响 模型整体偏,改起来要重训 改那一份文件即可 把它换掉即可
谁维护 算法同学加业务标注人 业务口的内容负责人 产品经理加业务验收人

最后一行是三类型的差别里最容易被忽略的:训练集出了错,改起来最贵,可能要重新训一遍;所以训练集的数据来源一定要挑已经人工核查过的那些,宁愿少,不要脏。

2.3 混着用会怎样

病案室第一版把三类装在一个目录里,带来的问题有三个。

拿错数据。算法同学从目录里直接抽了五万份没核查过的首页当训练集。

测不准。验模型的时候从同一个目录里随机抽了一千份,这批题里本来就有错,模型答「这一项填错了」被判成错,其实它答对了。

口径漂移。三套手术编码混在一个目录里,谁也不知道当前用的是哪一套。

分开装只需要多建几个目录,成本几乎为零;混着装的成本要到模型上线之后才发现。

3. 数据从哪儿来

3.1 业务系统导出

最稳的一类来源,是已经跑在人管的流程里、并且经过人工核过的那部分记录。病案室那五千份训练集,就是从「已通过质控核查」的首页里挑的。

从系统导出有三件事要在导出那一刻就定下来:导哪些字段、按什么条件筛(比如只导核查通过的)、导出来的时间点。时间点要记,因为业务系统每天都在变,今天导出的和下周导出的不是同一批数。

3.2 公开数据

公开数据集、行业标准、公开发布的技术规范都属于这一类,来源清楚、可以直接引用,适合做补充。

用公开数据要过两道检查:一是许可,看它允许什么用途;二是口径,公开数据的字段定义跟单位内部往往不一致,直接拼进来会出现两套口径。病案室用的手术操作分类标准属于公开规范,可以入语料,但要标明版本。

3.3 人工整理

专家经验、操作规范、常见错误清单,这些不在任何系统里,只能人工整理。

整理的时候要定格式。同样一份「常见错误清单」,写成自由文本,以后没法筛;写成「错误类型、判断依据、正确写法」三列,就能既当语料又当标注指引。病案室把临床路径整理成了结构化文件,每份文件带版本号和适用科室。

3.4 对话与操作日志回流

日常使用里产生的记录,是最贴近真实分布的一类数据。客服对话、医生提问、用户点的每一个按钮,都在里面。

这一类有两个陷阱。一个是没有标准答案:用户问「这个手术要不要备血」,日志里有这一问,但没有「正确答案」这一栏,谁也没说答得对不对。另一个是含有敏感内容,出现在日志里的患者信息、客户信息要处理过才能用。

回流的做法是分层:对话记录先当语料和待标注的候选,不当训练集;要变成训练集,得先经过人工标注那一关。这套回流链路画出来是这样。

四类来源,各自能进哪个用途

每一条先自己挑一档,再点开下面的判定

业务系统导出

对话与操作日志回流

公开数据

人工整理

看判定
  • 业务系统导出停在「训练集」:要满足「已人工核查 + 记下导出时间点」
  • 对话与操作日志回流停在「人工标注」:没有标准答案,不能直接当训练集;三步是脱敏(去除患者姓名、身份证号、联系电话)、筛候选(只留答得不对或答得含糊的)、标注(按标注指引给出正确写法)
  • 公开数据停在「知识库语料」:要「标明版本与许可」
  • 人工整理停在「验证集」:每一条都要有标准答案,抽 20 条人工复核
  • 日志直接进训练集会被拦回来,里面只有问和答,没有人说答得对不对。

回流要过的节点

  • 日志过完脱敏和标注卡片上出现「已脱敏、已标注」两个标记,这才允许进训练集
  • 这个案例的底数训练集 5000 份(含 800 份标注)、语料 340 份临床路径加 46 份诊疗规范、验证集 1000 份双标一致率 91%

回流的做法是分层,日志先当语料和待标注的候选。

回流的做法是分层,日志先当语料和待标注的候选。

这一块要看懂什么:来源不同,能进的用途不同;日志回流要先脱敏、再筛候选、再标注,才能变成训练集。
对话和操作日志只作待标注候选,过完脱敏和人工标注再进训练集;抽检比例不低于 5%,不合格率超 2% 整批退回。

4. 什么算高质量的数据

4.1 五条标准

一条数据算不算合格,按五条看。

准确。字段值跟原始事实对得上。病案首页里「手术日期」填成了入院日期,就是不准确。

完整。该填的都填了。缺一个字段就可能让这一条没法用:训练集里少一列「错误类型」,这条数据对模型就没有意义。

口径一致。同一个概念在同一批数据里只有一种写法。手术编码三套口径同时在库里,属于口径不一致里最典型的一种。

有出处。每一条都能追到它是从哪份文件、哪个系统、哪个时间点来的。出了争议要能翻回去。

带权限标签。每一条标明哪些人能看。这一点在语料上尤其重要,因为语料是要被检索出来的。

4.2 脏数据会把后面哪几步拖垮

一份脏数据不会只坏一个地方,它会顺着链路往下滚。

拿训练集里的错编码说事:模型学了三套编码口径,训出来的核查模型给出的建议本身就带三套标准;医生助手查语料的时候,查到的是这套混乱口径下的说法;验证集如果也从同一批数据里抽,测出来的分数还偏高,因为题本身就有错,模型跟着错反而被判成对。三处问题在同一个方向上,谁也没报错。

源头一处口径错,会沿着训练、生成、评测一路走到底,而且每一步看起来都正常。
图注:源头一处口径错,会沿着训练、生成、评测一路走到底,而且每一步看起来都正常。

4.3 怎么抽查质量

全量核对不现实,靠抽。

抽查要定三样:抽多少、谁抽、抽出来不合格怎么办。病案室的规矩是按不低于百分之五抽,由质控员抽,不合格率超过百分之二就整批退回重做。

抽查记录要留。它有两个用处:一是这一批数据有没有过关有据可查;二是连着几批都不合格,说明上游的采集方式有问题,该去改流程,而不是反复退数据。

5. 数据标注怎么做

5.1 谁来标

标注这件事,找对人是第一位的。标准是「他平时就干这件事」。

病案首页的错误类型,找质控员标,他们每天的工作就是核对首页;手术术语的口径,找病案编码员标;临床路径里的适用条件,得找临床科室的医生。产品经理自己不标,但要定标注指引,把每一条怎么判、判错了算什么写清楚。

标注指引决定标注质量的上限。指引写得含糊,标注人各自理解,标出来的数据就没法用。指引要给出判定规则和一个正例、一个反例。

5.2 标多少条起步

起步量按「够不够看出问题」来定,不按「够不够训模型」来定。

先标三百条,跑一遍一致性检查。这三百条的目的是把标注指引里的含糊处找出来,不是拿去训模型。病案室那三百条标完,发现「手术编码错误」和「手术编码不规范」两类在不同人手里判得不一样,于是把这两类合并并补了一条判定规则。

三百条标完口径对上了,再按两千条、五千条往上滚。滚到五千条时,模型才有个能用的起点。

5.3 怎么验标注质量

三种做法,按投入从低到高。

双标。同一批数据让两个人各标一遍,算一致率。病案室的验证集是两位质控员双标,一致率 91%。一致率低于 85% 时先别往下标,回去改指引。

抽检。标完的批次里抽一部分,由更资深的人复核。抽检要抽得散,不能只抽前一百条。

交叉验证。把标注结果拿去训一版模型,看它在留出的那批数据上表现如何。分数反常地低,多半是标注本身出了问题。

十二行病案,两位质控员标不到一块去

左边 · 口径对齐之前

  • 12 行病案,两位标注员各标一遍两行不同,一致 10 条、一致率 83.3%
  • 两条判定规则手术编码错误:编码本身不在标准表内;手术编码不规范:编码在标准表内,但未按四位数精度填写
  • 第一行分歧A 标「编码错误」、B 标「编码不规范」,提示「两个人对同一件事的判定不同,先对规则」
  • 第二行分歧A 标「漏填」、B 标「不适用」,提示「规则里没写这种情况该归哪一类」

83.3% 标红,12 行里两行对不上。

右边 · 口径对齐之后

  • 补上一条规则字段不适用于本例的,统一标为「不适用」,不算错误
  • 补完一致 12 条、一致率 100%
  • 往下标之前先看门槛一致率低于 85% 先别往下标;先标 300 条跑一遍一致性,口径对上了再按 2000 条、5000 条往上滚
  • 人为改出 3 行不一致再送下一批被拦下来,75% 低于 85% 的门槛

第一批这三百条的用途是把标注指引里的含糊处找出来,不拿去训模型。

第一批这三百条的用途是把标注指引里的含糊处找出来,不拿去训模型。

这一块要看懂什么:一致率低于 85% 先改指引再往下标;两个人分歧的地方,多半是规则里没写清楚。
同一批数据两个人各标一遍,一致率低于 85% 先停下改指引;标完的批次抽检不低于 5%,双标一致率到 91% 这一档再往下滚量。

5.4 让模型批量造数据,要过两道关

人工标两千条就要花掉质控员好几天,想凑到几万条只能让模型帮忙造。造出来的东西不能直接用,要过两道关。

第一道是裁判打分。写一个评分标准,让另一个模型给每条造出来的数据打分,比如「错误类型是否明确」「正确写法是否与规范一致」「表述是否像真实病历」。分数低的先筛掉,这一道能把明显不合格的部分挡在外面。

第二道是人工验证。从过筛的数据里抽一部分,让质控员逐条看。病案室那次造了两万条,裁判筛掉四千条,人工抽八百条验证,发现其中百分之三不合格,整批退回重造。

两道关缺一不可。只有裁判打分,等于让模型给自己判卷,它的偏好会和造数据那个模型同向;只有人工验证,标不过来,几千条就要占用好几个人的整月。

判断这批造出来的数据能不能用,看人工验证那一关的不合格率:低于百分之一可以放行;百分之一到百分之五,把不合格集中的那几类挑出来补进裁判标准后重跑;超过百分之五,说明造数据的提示词本身有问题,回头改提示词,别急着往下滚量。

6. 数据治理归谁管

6.1 散在几个系统,先解决口径

同一件事在不同系统里有不同写法,是数据问题里最费时间的一种。病案室遇到的更典型:手术编码在病案首页、结算清单、质控报表三套系统里各有一套。

解决的第一步是先定一份口径对照表:哪个字段以哪套系统为准,其余系统的值怎么映射过来。对照表定完,才谈得上把数据合到一起。

三个系统三个写法,先对着表定出以谁为准,再动手合数据。
图注:三个系统三个写法,先对着表定出以谁为准,再动手合数据。

6.2 旧版本要下线

和知识库那一份里的规矩一样:新版本入库的时候,旧版要同时标失效,并在入库单上写明它替代了哪一版。临床路径改了版,新版生效当天旧版就该从语料里撤下来,两版并存的时间越短越好。

训练数据这边还有一条不同的要求:已经用来训过模型的旧版数据不要删,要归档。模型的版本和数据集的版本要对得上,以后要复现某一次训练,得拿得到当时那一批数据。

6.3 版权与受保护的材料

三类材料要注意。

公开标准、公开发布的技术规范,可以用,但要标明版本和来源。

采购来的行业数据库和第三方报告,用之前先看许可,写清了不能用于模型训练的就不能用,哪怕技术上能导出来。

内部材料里带个人信息的,进数据之前先脱敏;带知识产权的设计图纸、专利文件,用之前要过法务。

6.4 谁负责,负责到什么程度

数据这件事一定要落到人头上。落到岗位,不落到「大家一起把关」这种说法。

分工通常是三层:业务侧出标准答案的人负责标和复核(病案室质控员、临床科室医生);产品经理负责定标注指引、抽查规则和验收口径,并把这些写成文件;技术侧负责采集、脱敏、入库和版本管理。

产品经理这一层要交出去的东西有三样:标注指引、抽查规则、数据集说明。数据集说明里写清这批数据从哪来、覆盖什么范围、什么时候采的、还差什么,别人拿到才敢用。

7. 病案室这套数据最后分成三个目录

病案室最后按三类分开,各建各的目录。

训练集从「已通过质控核查」的病案首页里挑,一共五千份,其中八百份标了错误位置和错误类型。标注由质控员做,先标三百条对口径,双标一致率上到百分之九十二之后才往下滚量。人工标了两千条,剩下的用模型造,造出来的两万条过裁判模型筛掉四千条,人工抽八百条验证,不合格率百分之三,退回重造一轮之后降到百分之零点八,才放进来。

知识库语料收的是十二类临床路径共三百四十份文件,加上四十六份诊疗规范。每一份都带版本号、适用科室和权限标签,新版本生效当天旧版标失效。检索时按科室和权限先过滤,再排序。

验证集一千份,由两位质控员双标,一致率百分之九十一,每一条都写明了正确答案。它从训练集里完全独立地抽,两边不重叠。

口径对照表定完了:手术编码以病案首页为准,结算清单和质控报表的值按表映射。三套写法的数据合到一起之后,一个手术只有一个编码。

抽查规则跟着批次走:每批按不低于百分之五抽,不合格率超过百分之二整批退回。连着两批超标的,不退了,回头去改上游采集的流程。

那三处毛病最后都有了对口的人:训练集归质控员和算法同学共同确认,语料归临床路径办公室维护,验证集归产品经理和质控科一起管。

8. 攒数据前,七件事先定下来

问题 答「否」的时候怎么办
这批数据是给训练集、语料,还是验证集用的? 用途没定的,先定用途再采集,三类不能混装
每一份来源是不是记了采集时间点和筛选条件? 补台账,来源和时间都要能追
同一件事在不同系统里的写法,是不是已经定了以哪套为准? 先出口径对照表,再合数据
训练集里的每一条,是不是都经过人工核查? 没核查过的先不放,宁可少
验证集是不是跟训练集完全分开? 有重叠的重新抽,重叠会让分数虚高
标注指引里有没有给出正例和反例? 补正例反例,否则标注人各自理解
这批数据有没有指定的负责人和抽查规则? 先落到具体岗位,再往下滚量

9. 三类数据混着装,上线才露馅

把三类数据混在一起用。 训练集、语料、验证集装在一个目录里,抽的时候凭感觉抽,训练集里混进没核查过的记录,验证集里混进错题。分开装几乎不花成本,混着装的代价要到上线之后才发现。

拿没标过的对话日志直接当训练集。 日志里没有标准答案,只有「发生过」这件事。它适合当语料和待标注的候选,要变成训练集必须先经过人工标注,中间还要脱敏。

没有人为数据质量负责。 采集的人、标注的人、复核的人、验收的人,一个都没指定,出了问题是「大家一起把关」的结果。数据这件事要落到具体岗位,并把标注指引、抽查规则、数据集说明三样交出去。

10. 数据备齐了,接下来要定它跑在哪儿

数据这一块要能答上四个问题:三类数据各干什么、自己的数据从哪儿来、什么算合格、谁来标又怎么验收。口径和版本由谁负责,也要落到人头上。

数据备好了,接下来要定的是它跑在哪儿。同一台诊间助手,装在本机工作站上,和跑在单位的云上,权限、成本、出错之后的退路都不一样;让它执行一段生成的代码,要不要关在隔离开的环境里跑,也是上线前必须定的。下一份材料讲运行环境与隔离:本机、云上、沙盒各是什么,跑坏了怎么退回去,以及它去操作别人的电脑和网页时要注意什么。