去年有个内部项目把我震了一下:一版用某肿瘤药物历史真实世界数据训练的疗效预测模型,开发阶段AUC就冲到了0.92,交叉验证的曲线也漂亮得挑不出毛病,算法团队信心爆棚。结果把它放到新启动的前瞻性临床队列里做验证,期中分析一出来,全场沉默——模型预测的“高响应组”实际疗效反而低于“低响应组”。
当时团队第一反应是“数据清洗有问题”,第二反应是“这个队列人群偏了”,折腾了快三周才找到真正原因:模型的标签定义里混进了事后信息,特征也带了一部分随访期数据。说白了,新药评估模型从一开始就把题目做错了。这件事让我意识到,AI在药物研发里最大的坑往往不是算法本身,而是整个评估逻辑没有跟上。
这篇文章想把我在几个实际项目里反复踩过的AI陷阱、验证方法和工作流选择摊开讲一遍,给准备在新药评估里引入AI的团队一些参考。它适合做临床统计、转化医学、数智化平台建设的人,也适合医药投资人想判断这类AI产品的真实含金量。
任何模型落到新药评估这个场景,都会面对比推荐系统、图像识别更严苛的约束。推荐系统推荐错了,下次推荐换一个;新药评估模型如果给出错误的风险分层或疗效预测,影响的可能是受试者安全和巨额研发资源的去向。所以宁可把问题拆细一点、验证做重一点,也别让Demo上的高指标冲昏头脑。
1. 我见过的最典型的“AI高光时刻”:Demo很好,落地崩盘
1.1 一个让人沉默的前瞻验证结果
那个项目本身并不复杂:某公司想做一个辅助筛选工具,用历史试验数据训练模型,预测患者对某候选药物的疗效响应概率,计划用于后续试验的人群富集。算法团队提供了一版模型,训练指标全线飘绿,领导在评审会上一句话问得很直接:“能不能直接拿来筛下一批入组患者?”
当时所有人都觉得能。谁也没想到,真上了前瞻数据以后,模型排名靠前的患者群体,无进展生存反而比排名靠后的群体短。这个结果不是“指标差一点”的问题,而是方向性的反转。如果按模型的排序去富集患者,会把真正可能获益的人筛掉,留下效果更差的人群,后果非常严重。
复盘时我们把整个建模链路捋了一遍,问题链条很清楚:结局变量使用了“随访期结束后由影像学确认的最佳缓解”,但特征里包含了同一随访周期内的部分实验室检查结果。本质上是把“未来的结果”当输入,去预测同一个“未来的结果”,测试集里面这样的样本占了相当大比例,训练的时候模型实际上在背答案。
1.2 为什么Demo表现不能外推到真实评价场景
这件事让我对“交叉验证分数高”这件事彻底脱敏。交叉验证体现的是“在同一个数据分布里,模型有没有记住噪声”,它回答不了“换个时间、换个中心、换套入组标准,模型还能不能用”。
新药评估模型真正面对的是高度时变、高度依赖采集协议的现实场景。试验方案改了,入排标准变了,中心实验室换了仪器,甚至季节性的患者招募差异都会让数据分布悄悄漂移。这些因素在历史数据的随机切分里完全不会被暴露,因为随机切分的训练集和测试集来自同一个时期、同一批中心、同一套标准。
所以后来我在项目评审里养成了一个习惯:先问“验证集是怎么切出来的”,再问“模型指标到底是多少”。如果对方只能拿出随机交叉验证结果,没有时间外验证、中心外验证或前瞻性验证,那这个模型的成熟度就要打一个大问号。
2. 先把评估这件事拆成四个具体问题
2.1 疗效评估与安全性评估是两套逻辑
新药评估模型这个名字听着挺集中,实际拆开,至少有四个完全不同的场景。疗效评估关心的是“药到底有没有用、在谁身上更有用”,数据主要来自疗效终点、肿瘤测量、生物标志物;安全性评估关心的是“不良反应会不会发生、在什么条件下发生”,数据来自不良事件上报、实验室指标、心电图、生命体征。
这两个场景的建模目标完全不一样。疗效是事件驱动,往往要处理删失、处理竞争风险,还要考虑测量偏倚;安全性更偏向稀疏事件预测,毒性属于低发生率高后果事件,小样本里可能只有十几例阳性,传统机器学习在这个场景里极其容易过拟合。
把这两者混在一起设计模型,是很常见的操作失误。比如用同一个特征集去预测“缓解”和“严重不良事件”,表面上是多标签学习,实际上损失函数和样本权重完全不同,模型性能常常顾此失彼。
2.2 模型要回答的四种问题,对应四种结构
我习惯把新药评估里的模型需求分成四类:
- 结局预测:给定基线特征,预测某个时间点的缓解状态、进展风险或死亡风险。典型结构是分类模型、生存模型。
- 效应估计:同一个患者,用药A vs 用药B,结局差多少。这需要对照组数据,本质是个体化处理效应估计,不是普通分类模型能直接解决的。
- 剂量选择与暴露-反应关系:预测不同剂量水平下的疗效和安全性,需要药代动力学数据和时间序列建模。
- 患者富集与风险分层:把人群按预测风险排序,用于入组决策或分层随机化。
这四类问题在数据结构、评价指标、验证方式上差别很大。结局预测可以用AUC、校准度来评价;效应估计必须讨论混杂和因果识别,没有对照数据根本做不了;剂量选择模型要求暴露量-结局关系稳定,往往需要用模型仿真来外推。
很多AI模型翻车,不是因为算法不好,而是因为团队把第二类问题当成第一类问题处理。手里只有观察性数据,却想回答“这个患者用药效果更好吗”,然后拿一个预测标签的模型输出当成因果结论,这已经超出了模型的适用范围。
2.3 别急着上深度学习:先分清“预测标签”还是“估计效应”
这里面的区别,直接决定了模型能不能用于决策。预测标签回答的是“这个患者更可能发生什么”,估计效应回答的是“这个患者用了这个药以后会怎么样”。前者只需要特征的预测能力,后者需要处理干预分配机制、混杂因素、时间依赖偏倚。
举个例子,观察到使用某药的患者生存期更长,可能是因为用药患者本身基础状态更好。一个分类模型会捕捉到“基础状态好”这个特征并给出高生存概率,但它完全没有回答“用药带来的增量收益是多少”。如果在患者富集时用这类分数排序,相当于把预后好的患者筛进来,但这不等于该药对他们更有效。
所以在新药评估场景里,我强烈建议在项目启动时先写清楚“模型输出给谁看、看完做什么动作”。如果动作是入组富集,需要的是效应估计或至少是预测富集收益的指标;如果动作只是风险分层报告,预测标签就够用。两个目标对应的建模路径完全不同,混搭使用基本都会出问题。
3. 实际项目里反复出现的五个AI陷阱
3.1 陷阱一:标签与特征里混进了“未来信息”
这是我在新药评估模型里见过最多的坑,而且往往藏在数据字典的角落里。表面上看,标签是“6个月无进展生存”,特征都是基线数据,逻辑上没问题。但实际排查时发现,某几个特征字段是“随访期间某次评估的实验室结果”,只是因为数据库结构的问题被合并进了基线表。
用混入未来信息的特征预测未来结局,模型会在训练时学到一个“捷径”:只要看到异常实验室值,就知道这个患者后续大概率进展了。这个捷径在历史数据里非常有效,AUC能冲到接近满值,但一到真实前瞻场景,这些特征根本没有办法在预测时点获取,模型立刻失灵。
检查方法是做时间可及性审查:一行一行核对特征表字段,确认每个字段的采集时间点都在预测时点之前。更稳妥的做法是再跑一遍“置换特征时间”的敏感性测试,把某个可疑特征打乱后观察AUC下降幅度。如果某个特征被打乱后指标大幅下跌,而这个特征本身来源可疑,宁可不用。
3.2 陷阱二:生存数据被当成二分类问题处理
新药评估里有大量时间-事件数据:无进展生存、总生存、至毒性发生时间。这些数据的核心是“事件是否发生 + 事件发生的时间 + 删失状态”。删失指的是患者还没有观察到事件就出组或研究结束,不代表事件不会发生。
很多团队图省事,把“随访期内是否缓解”做成一个二分类标签,删失患者一律标0。这样做的后果是信息量大打折扣:随访3个月的删失和随访30个月未进展被当成同一状态,随访期长短这个重要信息全部丢失。更严重的是,如果不同治疗组删失模式不同,二分类模型会学到错误的组间差异。
正确做法是保留时间结构,用生存分析框架:Cox比例风险模型、随机生存森林、深度生存模型。评价指标用时间依赖AUC或一致性指数,同时检查校准曲线。即使团队技术栈有限,也至少要用logistic回归加“随访时间”作为偏移项,而不是粗暴做二分类。
3.3 陷阱三:把模型输出概率当作真实概率
机器学习模型输出的0到1之间的数字,很多人下意识叫它“概率”。但除了经过严格校准的模型,这个数字只是评分,不代表真实事件发生率。
在新药评估里,这个混淆会造成实打实的决策错误。比如剂量选择时,模型预测某个患者出现严重毒性的概率是0.45,研究者可能觉得“这个风险还能接受”,但如果真实发生率只有0.15,这就是个危险误判。反过来说,预测0.05的患者实际可能有0.2的风险,容易被忽略。
解决方法是做概率校准,用校准曲线看预测分箱均值和实际事件率的对应关系。常见做法包括Platt缩放、保序回归、基于Brier分数的评估。校准应该在全数据集上用独立样本或嵌套交叉验证完成,不要用训练集自己的校准曲线自我表扬。
3.4 陷阱四:小样本高维特征下的交叉验证自嗨
新药评估数据普遍样本量小,几百例算不错,几十例也常见。但组学数据、影像特征动辄上千维,这个组合几乎是过拟合的温床。
随机交叉验证在这种场景下特别有迷惑性:同一个中心、同一批患者、特征维度远大于样本量,模型很容易记住个体ID级别的噪声,交叉验证折间还共享患者信息,分数虚高。我见过某特征数8000、样本量180的模型,随机交叉验证AUC 0.85,换到外部数据直接掉到0.52。
更可靠的判断方式是嵌套重采样:内层做特征选择和参数调优,外层严格评估泛化误差。同时要做时间切分验证:用前几年的数据训练,后几年的数据验证,模拟真实前瞻场景。如果数据来自多中心,一定要做留一中心验证,看看模型在没见过的中心表现如何。只有这些验证方式都过关,模型才有机会谈上线。
3.5 陷阱五:整体指标漂亮,亚组集体翻车
整体AUC高,不代表模型在所有亚组都好用。新药评估尤其要注意年龄、肝肾功能、既往治疗线数、生物标志物状态这些分层维度。
举例来说,某风险分层模型整体一致性指数0.78,看起来不错。拆开看,65岁以下人群0.81,65岁以上人群0.61;进一步排查发现,老年组样本量小、合并用药复杂,特征分布与训练集主体差异大。如果当初只用整体指标做决策,这个模型上了临床,老年患者就会被错误分层。
我建议建模阶段就按临床关心的人群维度做分层评估,至少报告各亚组的AUC、校准度和决策曲线分析。更重要的是,如果模型在某个亚组表现差,要么补充该亚组的数据重新训练,要么明确在模型说明里标注“不适用于该人群”,不能含糊带过。
下面把这个陷阱的排查方式整理成一个速查表:
| 陷阱 | 典型表现 | 根因 | 检查方式 |
|---|---|---|---|
| 标签特征信息泄漏 | 训练AUC接近0.95,外部验证大跌 | 特征采集时间在预测时点之后 | 时间可及性审查、置换特征测试 |
| 生存数据二分类化 | 删失患者被标为未发生事件 | 忽略随访时间和删失结构 | 检查标签定义、改用生存模型 |
| 概率校准缺失 | 预测概率与真实发生率系统性偏差 | 模型只优化排序未优化校准 | 校准曲线、Brier分数检查 |
| 小样本高维过拟合 | 随机CV高分,外部验证掉点 | 特征数远大于样本量 | 嵌套重采样、时间外验证、留一中心验证 |
| 整体指标掩盖亚组失败 | 整体AUC高但关键亚组AUC低 | 亚组样本少、分布偏移 | 分层评估、决策曲线分析 |
4. 一条被验证过的抗坑工作流(从问题定义到验证)
4.1 第一步:把临床问题翻译成可计算的决策问题
项目启动时多花两天写清楚问题定义,比后面返工省一个月。我要求团队必须回答四件事:目标人群是什么,预测时点是哪个时间点,结局事件怎么定义,模型输出后谁会采取什么动作。
比如说,“我要预测晚期患者一线治疗后的无进展生存概率”是一个描述,还不算可计算的定义。可计算的定义长这样:“对符合入排标准的晚期实体瘤患者,在治疗开始前收集基线特征,预测自治疗开始起的6个月无进展生存概率,输出将用于筛选高获益风险比的受试者进入试验扩展队列。”
这个定义一写清楚,很多坑自动关上。预测时点明确以后,随访期内的任何变量都不能进特征,这是一条硬规则,哪怕它预测能力再强。
4.2 第二步:数据合同,锁定独立测试集
数据合同是我从传统软件工程借过来的概念。在建模开始前,把数据分好训练集、验证集、独立测试集,测试集彻底锁死,任何人不得查看、不得触碰、不得参与特征选择。
实际执行中,这一条经常被突破。常见情况是特征工程做到一半,发现测试集上表现不好,就把测试集样本“反馈”到训练流程里重新跑。这本质上是把测试集变成了第二训练集,外部验证的意义就消失了。
更严格的做法是在时间维度上切分:早期数据用于开发和内部验证,最近一段时期的数据单独作为模拟前瞻测试集。这样能模拟真实环境下的分布变化,也是新药评估中最贴合实际的验证方式。
4.3 第三步:传统统计模型是必须的基线
深度学习、梯度提升树不是不能用,但所有AI模型都应该先跟传统统计模型比一比。在新药评估场景里,传统Cox模型、带正则化的logistic回归往往已经能提供不错的预测能力,而且稳定性好、可解释性强、监管接受度高。
如果AI模型在独立测试集上没有显著优于传统基线,我倾向于不用。这里要注意“显著优于”要有量化标准,不能只看AUC涨了0.02就说好,要看置信区间、净重分类改善指数、决策曲线下的净获益。
实际操作中,我会同时跑两套模型:一套是传统baseline,一套是候选ML模型。比较的时候注意超参数调优的公平性,不能让传统模型裸奔、让ML模型充分调参后比,这种比较没有意义。
4.4 第四步:嵌套重采样加时间外验证
嵌套重采样解决的是超参数选择和模型评估之间的信息泄漏。内层交叉验证负责选最优超参,外层交叉验证负责评估选出来的模型在这个流程下的泛化表现。每一折之间完全隔离,不共享样本。
时间外验证是更接近真实场景的测试:按时间先后把数据切成开发和验证两个窗口,只用早窗口数据训练调参,晚窗口数据验证一次。如果模型在晚窗口表现不佳,必须复盘特征分布是否有系统性变化,而不是直接归因于“患者组不同”。
如果数据来源是多中心,再加一道留一中心验证:每次拿一个中心的数据做验证,其余中心训练。只要模型在未见过的中心表现稳定,才有资格谈推广到新场景。
4.5 第五步:校准与可解释性,缺一不可
即使模型排序能力很好,如果校准差,决策还是会出错。我要求模型交付时同时附带校准曲线、Brier分数和按风险分层的实际事件率表格。一个模型如果输出0.8分的群体真实事件率只有0.5,不管AUC多高,都不能直接用于临床沟通。
可解释性方面,SHAP值只是起点,不是终点。我会进一步做特征工程层面的解释:哪些特征在医学机制上站得住脚,哪些特征纯粹是统计关联。对于新药评估模型来说,一个特征如果只有统计关联、没有任何生物学合理性,要么找文献支持,要么在报告中标注为“需要谨慎解释”。
5. 上线之前最容易忽视的三个非技术陷阱
5.1 盲法约束下的“模型禁言期”
任何双盲试验里,如果模型在试验进行中直接向研究者暴露预测结果,可能导致操作偏倚。研究者知道某患者被预测为“高进展风险”后,可能下意识调整随访密度或伴随治疗,这会污染整个试验的终点评估。
更麻烦的是,如果模型在期中分析阶段表现不佳,研究者已经看到了模型输出,就很难保持原有的临床决策行为。我的处理方式是设置“模型禁言期”:在试验方案规定的揭盲时间点之前,模型输出只进入独立数据安全监查流程,不流向研究中心和研究者。
如果模型本身设计为实时辅助工具,那它必须在方案中提前定义好输出规则、权限范围、以及输出被查看后的记录留痕。盲法临床试验里的模型部署,需要统计和运营团队共同把关,不能只由算法团队自己决定。
5.2 报告与追溯:模型卡不能只写准确率
新药评估模型上线前,需要准备一份完整的模型描述文档,包括训练数据来源、数据清洗规则、特征定义、缺失值处理方法、模型版本、超参数、验证结果、适用人群、已知限制。
很多团队把模型说明写成了“准确率报告”,AUC多少、灵敏度多少就完事。但在医药场景里,稽查和监管核查随时可能发生,任何字段定义的歧义都可能被挑战。特征里某个实验室指标的单位换算、某个结局定义的版本切换,都必须有记录和说明。
我建议给每个模型建一张类似药品说明书的结构化文档,至少包含:适用范围、禁忌人群、关键性能指标、校准状态、已知漂移信号、模型发布时间和再训练计划。这张卡片的读者应该包括临床医生、统计师和质控人员,不同角色要有对应的关键信息模块。
5.3 分布漂移:训练集的时代不会一直持续
治疗范式变化会让模型快速过期。某个模型在“某药单药治疗时代”数据上训练,几年后联合治疗成为标准方案,药物暴露模式、患者管理路径都变了,模型的风险分层逻辑很可能不再适用。
监管和流程层面,这种漂移往往比算法层面的性能下降更隐蔽。因为模型整体AUC可能没有大幅下降,但是特定治疗组的预测偏差却在累积。
应对方案是建立监控机制:定期在最新数据上重算预测分数与实际结局的校准曲线,设定预警阈值。一旦发现校准偏差超过可接受范围,立刻触发模型再训练评估流程。这个监控频率要写进模型运维方案里,不能等出了事再补。
6. AI在评估流程里的位置,以及我的几点体会
6.1 我的定位:AI是副驾驶,不是方向盘
做了这么多项目以后,我对AI在新药评估里的定位越来越明确:它适合做筛选和排序、异常检测、假设生成,但在确证性评估和法规决策上,学术界、工业界和监管体系的共识仍然是传统统计推断承担主责。
AI的价值在于把高维数据里的微弱信号揭示出来,帮助研究者设计更有针对性的问题和更高效的富集策略。从“AI替代传统评估”变成“AI辅助传统评估”,心态上会发生很大变化:不再追求模型的决策权,而是追求模型对决策质量的增量提升。
具体操作上,我会把AI输出当作“候选假设”而不是“结论”。比如模型提示某亚组可能存在更高的获益概率,那就把它转化为一个有明确统计假设的前瞻性验证设计,用试验数据去确认,而不是直接拿模型分数作为入组唯一依据。
6.2 交付模型时附一份“失败模式清单”
这个习惯来自一次惨痛教训:某模型在A中心表现良好,推广到B中心后整体指标尚可,但某个罕见亚型完全不工作。由于当初没有写清楚限制条件,临床团队在B中心把这部分患者也纳入了模型应用范围,差点导致错误决策。
从那以后,我要求每个模型交付时都附上一份失败模式清单:模型在哪些人群上表现好、在哪些人群上不可用、哪些输入特征的缺失会导致输出不可信、哪些分布漂移信号出现时应当暂停使用。这份清单比任何性能指标都更能防止误用。
写这份清单的过程也逼着团队把模型的应用边界想透。很多团队在开发阶段只会想“我们的模型能做什么”,很少认真想“我们的模型不能做什么”。后者对临床安全来说同样重要。
6.3 一个具体的小技巧:纳入阴性对照特征
教大家一个我长期使用的检查手段:在建模特征里故意加入几个“生理意义上不可能预测结局”的变量,比如患者ID的某种变换、随机噪声特征。
如果模型在训练时给这些特征分配了较高的重要性,或者把它们纳入决策路径,说明模型存在过拟合迹象。这个技巧成本极低,但对识别小样本高维模型的脆弱性非常有效。它不能代替外部验证,但能在一开始就帮团队建立对模型的审慎态度。
同样的思路也适用于AB测试:训练两个模型,一个用原特征集,一个把某个关键特征置换后再训练。如果性能几乎没有差异,说明原特征集里的这个变量可能并没有提供真实预测信号,它的重要性来自过拟合陷阱。这类反向检查,比单纯堆叠正向指标更能反映模型质量。