TCR-HLA识别预测全流程:从数据构建到模型评估的踩坑指南

发布时间:2026/10/21 3:41:25
TCR-HLA识别预测全流程:从数据构建到模型评估的踩坑指南 TCR和HLA的预测这几年基本是免疫组库分析里最热闹、也最容易把人绕晕的方向。我做肿瘤新抗原筛选时第一次正面撞上这个问题手里有一批肿瘤突变肽和患者的HLA分型想从TCR组库序列里找出来哪些T细胞可能真的会认出这些肽。问了一圈答案五花八门——有人直接拿MHC结合预测当TCR识别预测用有人把单细胞TCR数据丢进深度模型里跑出一个AUC就宣称模型可用。但真到自己落地的时候光是训练集的阴性样本怎么构造就够你折腾两周。这篇文章把我在TCR-HLA预测这条路上踩过的东西整理了一遍包括生物层面的基本约束、数据如何清洗、模型怎么选型、评估阶段有哪些隐蔽陷阱最后聊聊实际项目里最容易翻车的地方。适合正在做免疫组库分析、搭肿瘤新抗原流程或者刚接触TCR识别模型的同学参考。文章里所有数据量级、对比结论都来自我自己的实验体会不是某个固定流程的复读你可以当作一份踩坑笔记来读。1. 免疫组库分析到底在解决什么问题TCR-HLA识别链路1.1 一条识别链路拆开看TCR、pMHC与CDR3T细胞识别抗原不是直接去抓游离的肽段而是通过T细胞受体TCR去识别一个复合物HLA分子把一段多肽呈递在细胞表面形成所谓的pMHC复合物。TCR只认这个复合物缺了HLA或者缺了肽都不行。这里的HLA在人类里也叫MHC是整条识别链路上多态性最夸张的分子。TCR本身是异源二聚体以最常见的αβ型TCR为例α链和β链各有一个可变区。可变区里有三个互补决定区CDR1、CDR2和CDR3。CDR1和CDR2主要由胚系基因编码负责跟HLA分子的螺旋区域接触相对保守CDR3则是V(D)J重排后形成的区域序列多样性极高直接负责跟肽段发生接触。可以粗浅地理解为CDR1和CDR2决定这个TCR能不能跟某个HLA分子“对上眼”CDR3决定它到底认不认那段具体肽。做TCR-HLA预测绝大多数模型处理的输入就是CDR3序列、肽段序列和HLA等位基因类型。CDR3的典型长度在10到20个氨基酸之间比抗体序列要短得多这也意味着能从序列里直接提取的信息密度非常集中。很多刚入门的同学会忽略一个事实这里说的“预测”本质上是在预测一个在三方协同作用下才会发生的事件单看任何一方都不充分。1.2 HLA多态性预测难点的根源HLA的经典一类分子HLA-A、HLA-B、HLA-C负责把内源性肽段呈递给CD8阳性的细胞毒性T细胞通常结合8到11个氨基酸的短肽以9肽为主二类分子HLA-DR、HLA-DQ、HLA-DP则呈递更长的肽段给CD4辅助T细胞长度可以到13到25个氨基酸。我们的讨论先聚焦一类分子因为TCR-HLA预测的数据绝大部分来自CD8场景。HLA之所以难处理根源在于等位基因数目太大。目前人类HLA等位基因库已经收录了几万个等位基因新的还在不断增加。多态性位点集中在肽结合槽附近不同等位基因的结合袋形状和理化性质差异很大导致它们偏好的肽段基序完全不同。同一条肽在HLA-A*01下的结合能力可能极高换个等位基因就完全不结合。不过也正因为多态性存在规律才让计算预测成为可能。学术界很早就把HLA等位基因按肽结合特异性分成若干超型同一个超型里的等位基因有相似的结合基序。后面出现的泛特异性pan-specific模型更是把结合槽关键残基的序列特征作为输入让模型能对没见过的新等位基因做一定程度的推断。这套思路同样可以迁移到TCR-HLA识别预测里不要只把HLA当成一个离散类别而是把它的结合槽序列信息喂给模型泛化能力会好很多。1.3 实验数据太贵计算预测成为刚需要拿到一条真实的“TCR识别某pMHC”的标签背后通常是一套不便宜的实验四聚体分选、克隆化、功能实验或者高通量单细胞TCR测序加上抗原刺激。实验方法能拿到高质量数据但通量有限一次实验能覆盖的TCR-HLA组合数跟组库本身的多样性比起来只是九牛一毛。人的TCR库有10的11到12次方量级的总数理论多样性在10的18次方以上穷举式验证根本不现实。所以在实际工作里计算模型的定位是“粗筛”从几万条候选肽里先圈出一个几百到几千条的小集合再让实验去验证。这跟MHC结合预测在抗原发现流程里的位置很像但要注意TCR识别预测解决的问题比MHC结合预测高一层。MHC结合预测回答的是“这条肽能不能被这个HLA呈递”而TCR预测回答的是“这个人的TCR库里有哪几条TCR可能认出这个pMHC”。两者常常被混着用实际是上下游关系。下面所有讨论都建立在这个区分之上。2. 训练集构建决定模型上限的第一道坎2.1 数据字段与来源选择我在数据上踩的第一个坑是想当然地认为训练数据越全越好。TCR-HLA识别的公开数据集来源有很多种文献里收集的已知表位和TCR配对、高通量筛选实验产物、单细胞测序加抗原富集得到的克隆。合并这些数据之前最好先想清楚字段是否对齐。一条能用来训练的最小记录至少要包含五项信息表位肽段序列标准化为单字母氨基酸HLA等位基因尽量到4位精度比如A*01:01这种粒度TCR的CDR3序列明确是TRA还是TRB链识别状态阳性还是阴性数据来源与实验方法用于后续划分验证集这里特别要提醒的是HLA命名精度。有些源头数据只给到2位比如HLA-A*02这个分辨率对不同等位基因的区分能力太差训练出来的模型学到的其实是超型级别的粗糙分类。我自己的处理原则很简单只保留4位精度的记录拿不准的宁可丢掉。虽然损失一部分数据量但能避免标签污染带来的系统性偏差。数据合并还有一个容易被忽略的问题同一批TCR序列可能在不同来源数据集里反复出现尤其是那些热点表位比如某个病毒来源的公共抗原决定簇。如果不做去重模型会频繁看到相似甚至相同的CDR3验证集里稍微一重叠结果就虚高。2.2 阴性样本构造最容易被低估的环节TCR-HLA预测任务里“阳性对”是稀缺资源但真正决定模型上限的常常是阴性对怎么造。这个问题在免疫组库研究里讨论度不够高却是我折腾时间最长的一部分。最简单粗暴的做法是随机配对从阳性数据集里把TCR和肽-HLA组合拆开随机拼出“不识别”的样本。这个做法的优点是便宜缺点是制造了大量不可靠标签。原因在于TCR的交叉反应性很强一条TCR很可能真的能识别某条随机配对的pMHC只是我们的实验没测过。把这种未知样本硬标成阴性会让模型学到错误边界。稍微好一点的策略是利用实验平台的内部阴性。很多高通量筛选实验会同时给出非结合结果比如某个TCR对一组pMHC完全没有响应这些是真正的实验阴性。问题是这类样本在公共数据里远没有随机阴性多直接用会导致训练集规模萎缩。再一种常用做法是“诱饵对”从同一个TCR的实验中选那些明确是阴性对照的表位来配对。实际做的时候可以把三种来源按比例混合。我自己常用的比例是实验阴性为主、随机配对为辅总体控制在阳性比阴性1比5到1比10。刻意不加太多阴性是因为负样本过多会把模型的预测分数整体压低还会让精确率在低阈值区间失真。平台推荐的做法是先用小验证集测试不同比例再选一个在独立外部数据集上分数最高的配置。2.3 特征编码从氨基酸序列到向量表示模型吃不了字符串特征编码是绕不过去的一步。TCR的CDR3序列长度不一一般会统一截断或补齐到固定长度。我习惯保留CDR3两端的保守锚点只对中间的变异区做处理然后把长度归一化到30左右既能保留信息又不至于引入太多填充噪声。氨基酸编码常见有三条路one-hot、替代矩阵嵌入和理化性质编码。One-hot是20维的稀疏编码简单直接但丢掉了氨基酸之间的相似性信息替代矩阵如BLOSUM62可以把每个氨基酸映射成20维的分布向量让模型知道亮氨酸和异亮氨酸在替换上更相近理化性质编码则把每个氨基酸压缩到几个数值维度上。HLA侧的处理我强烈建议用结合槽伪序列而不是把整条全长蛋白序列塞给模型。所谓伪序列就是取HLA结合槽里跟肽段直接接触的关键残基位置拼成一条短序列。一类HLA结合槽的接触残基大概有30多个位置把这些位点的氨基酸序列编码出来既能覆盖等位基因之间的差异又比全长序列少很多噪音。肽段侧编码跟CDR3类似但不需要截断因为9肽和更长肽段可以分别处理或者直接padding到统一长度。下面给一个我常用的编码伪代码做CDR3的one-hot加BLOSUM嵌入import numpy as np AA_LIST ACDEFGHIKLMNPQRSTVWY AA_TO_IDX {aa: i for i, aa in enumerate(AA_LIST)} MAX_LEN 30 def encode_cdr3_sequence(cdr3: str) - np.ndarray: # 返回 (MAX_LEN, 20) 的 one-hot 矩阵 seq cdr3.strip() if len(seq) MAX_LEN: seq seq[:MAX_LEN] matrix np.zeros((MAX_LEN, 20), dtypenp.float32) for i, aa in enumerate(seq): if aa in AA_TO_IDX: matrix[i, AA_TO_IDX[aa]] 1.0 return matrixBLOSUM嵌入的做法就是把one-hot再乘一个20乘20的替代矩阵得到每个位置的分布向量。值得注意的是模型不一定要从零开始学氨基酸表征直接加载预训练的蛋白质语言模型特征有时候比手工特征效果更好但显存开销和过拟合风险也会同步上升小数据集上未必划算。3. 模型选型从浅层基线到注意力机制3.1 先定义问题二分类还是排序TCR-HLA识别预测通常被定义为二分类问题给定一条TCR的CDR3序列、一段肽和一个HLA等位基因模型输出一个概率表示“是否识别”。但在真实业务里你往往不是要判断某一条TCR是否有效而是要从一个巨大的组库里给某个pMHC找出一批候选TCR或者给某条TCR找出一批可能被它识别的表位。前者是二分类后者本质上是排序任务。我的建议是模型训练用二分类损失评估和上线用排序指标。分类头学的是概率分布排序时自然能用分数高低来决定候选顺序不需要额外改动结构。重点在于训练数据里阳性和阴性的比例会影响分数尺度后面部署时需要重新做概率校准。3.2 CNN能做的和不能做的如果训练数据量在几千到几万条这个量级卷积网络是性价比很高的基线。CDR3序列里的功能模式往往表现为局部motif卷积核对局部连续窗口天然敏感。把CDR3、肽段和HLA伪序列分别过几层卷积和池化拼接起来再进全连接层就能拿到一个不错的分类器。CNN有个容易被忽略的特点它对序列位置的翻译不敏感这对TCR识别建模是有好处的。同一个结合motif在CDR3里出现在不同位置生物学上可能是等效的卷积通过共享权重把这种平移不变性带进来了。但反过来CNN建模TCR和pMHC之间长程依赖关系的能力很弱如果两个关键接触位点在序列上隔得很远卷积堆再深也不如注意力结构来得直接。3.3 注意力机制如何建模TCR与pMHC的互作注意力机制在这些任务里流行不只是因为Transformer在NLP领域的光环。它解决了一个实际问题TCR序列上的哪个位置跟肽段上的哪个位置发生接触应该是模型自己学出来的而不是靠人工指定。实践中我用过两类做法。第一类是把CDR3、肽段、HLA伪序列拼成一个序列直接过Transformer编码器用序列内部的注意力去学习全局依赖第二类是分别编码TCR和pMHC再用交叉注意力让两边的表示互相更新。后者在概念上更符合生物学直觉TCR侧的注意力权重可以直接对应到CDR3的接触残基上便于事后分析。交叉注意力说起来不复杂# 伪代码一个简化交叉注意力块 cdr3_enc transformer_encoder(cdr3_embedding) # (B, L1, D) pmhc_enc transformer_encoder(pmhc_embedding) # (B, L2, D) q linear_q(cdr3_enc) # 查询来自TCR k linear_k(pmhc_enc) # 键来自pMHC v linear_v(pmhc_enc) attn_out softmax(q k.T / sqrt(D)) v # 交叉注意力输出再把这个输出跟原始CDR3特征拼接进入分类头。注意力头的数量不用贪多一到两个头在很多数据集上反而更稳定头太多容易把注意力分散到无关模式上。整个HLA序列到底要不要进模型是个可以争论的问题。我的看法是用结合槽伪序列进模型足够在大多数公开数据上拿到好结果整条HLA序列信息更多但噪声也更多而且HLA全长序列的多个区域跟识别无关。除非你的训练集覆盖了几百个不同等位基因否则没必要上全序列。3.4 横向对比结果与选型建议我用一套中等规模的数据集做过几轮对比结论大致稳定在下面这个表里。数据规模用的是我手工合并、清洗后的数量级未必适合你的具体场景但趋势可以参考模型方案数据规模实测AUC区间训练成本备注手工特征 梯度提升几千对0.78-0.85极低特征工程量大稳定性好CNN分支拼接几千对0.80-0.87低小数据下足够扎实交叉注意力几万对0.85-0.92中数据量上来后优势明显预训练蛋白质语言模型几万对0.87-0.93高强但容易过拟合需要正则如果公开数据只够你凑出几千个阳性对别急着上大模型。先跑一个手工特征加梯度提升的基线把数据清洗和验证流程理顺再考虑CNN或注意力。数据量到五万对以上注意力模型的优势才会真正显现。另外我一般会同时保留一个CNN模型做对比注意力模型的注意力权重偶尔会学到一些看似合理但不稳定的模式有CNN结果互相印证能减少误判。4. 评估体系别让AUC骗了你4.1 数据泄漏交叉验证分割方式评估TCR-HLA预测模型最常见也最致命的问题是数据泄漏。很多人拿到数据之后直接按行随机切训练集和验证集看着AUC到0.9就高兴实际上模型早就在背题。泄漏来源主要有三个。第一个是CDR3序列重复同一条CDR3在数据库里出现多次随机切分会让完全相同的序列同时出现在训练集和验证集里。第二个是表位重复同一个表位配不同TCR的多条记录随机切分之后验证集里的TCR可能已经被训练集里同表位的其他TCR“剧透”了生物学模式。第三个是HLA等位基因的分布如果验证集里全是训练集出现过的等位基因模型的泛化能力会被高估。我的切分方式是分三层先按CDR3的序列相似度聚类同一个聚类整体落到训练集或验证集再按表位做分组交叉验证验证模型对新表位的泛化能力最后如果能凑出足够多罕见等位基因的数据单独做一次“未见HLA等位基因”测试。这三层切分里的任意一层通过都不能替代另外两层。4.2 指标组合AUC、AUPR与Top-k二分类任务最常用的是ROC-AUC但这个指标在阳性样本极少、阴性样本很多的时候会显得过于乐观。TCR-HLA识别里阳性对本来就稀缺负样本如果又多加了几倍AUC值会被人为抬高。所以我会把精确率-召回率曲线下的面积也就是AUPR当作主要参考指标。AUPR对阳性样本的比例敏感比AUC更能反映模型在正类上的真实分辨能力。实际筛选场景还需要看Top-k召回率比如给定一个pMHC和一万条候选TCR模型排序后真实阳性的TCR有多少出现在前100或者前1000。这个指标直接对应业务效率我每次评估都会统计。另一个容易忽略的是概率校准。模型输出的概率未必等于真实识别概率尤其在负样本比例刻意调整过之后。上线前用独立的校准集做一次温度标定或者等渗回归能把分数恢复到可解释的尺度尤其是需要设置筛选阈值的时候。4.3 可解释性用于排查错误很多人把注意力权重当成可解释性的唯一来源但单独的注意力热图其实很容易产生误导。我的习惯是结合三种手段看注意力权重、原位突变扫描、motif富集。原位突变扫描特别好用把肽段上的每个位置依次替换成其他氨基酸观察模型输出分数变化多少。如果某个肽段位置突变后分数骤降说明模型依赖了这个接触位点这跟结构生物学上的关键锚定残基往往能对上。反过来如果模型对某个位置的突变一点都不敏感那这个位置可能根本没被模型利用你需要检查是不是编码或数据分布出了问题。Motif富集则是在识别阳性的CDR3集合里寻找显著富集的短序列模式再跟已有文献里的结合基序比对。这个方法能快速发现模型是在学真正的生物学规律还是在钻数据预处理漏洞。有一次我检查时发现模型对某个肽段头两个残基的模式非常敏感追查后发现那个模式实质上是从数据集的特定实验批次里带进来的技术性偏差而不是生物学意义上的结合特征。这种问题光看AUC永远发现不了。5. 从模型到业务场景落地与踩坑5.1 新抗原筛选和TCR-T里的实际位置在肿瘤新抗原流程里TCR-HLA预测通常放在MHC结合预测之后。流程大致是对肿瘤样本做测序找出非同义突变把突变肽段拿去跑MHC结合预测筛出有可能被呈递的肽再把候选肽跟患者的TCR组库数据比对用TCR预测模型找出可能已经识别这些表位的T细胞克隆最后根据克隆的丰度和功能状态给新抗原排序。这里有个容易混淆的点MHC结合预测说“这条肽能被HLA呈递”不等于说“患者体内一定有T细胞认识它”。新抗原能不能引起免疫反应最终要看TCR这边有没有对应的克隆。把两个模型接在一起用才能避免选出太多“能结合但没人认”的候选肽。TCR-T方向的应用则相反目标是找到一条TCR把它工程化到T细胞上让改造后的T细胞去攻击肿瘤。这个场景对特异性要求极高一条TCR如果跟某个正常组织表达的自身pMHC有交叉反应输回患者体内可能造成严重副作用。所以落地时除了找阳性识别还要做反向筛选用模型批量检查候选TCR对一组正常肽-HLA的预测分数把交叉反应风险高的排除掉。5.2 踩坑实录三个真实翻车现场先说第一个阴性样本随手生成导致的全线高估。早期我在一个几千条记录的数据集上随手做了随机配对训练完模型AUC接近0.9但拿去独立实验数据上一测和随机猜差不多。原因是随机负样本里大量混入了“其实是阳性但没被实验验证过”的组合模型学到的决策边界完全错位。后来我把负样本换成实验内部的非结合结果AUC掉下来一大截但外部验证性能反而好了。第二个坑发生在合并多来源数据时。两个数据集的同一个表位记录CDR3序列存在大量相近但不完全相同的克隆型。我一开始按精确字符串去重实际上这些近似克隆型也构成了泄漏。换成按CDR3相似度阈值聚类再切分之后模型成绩从虚高的0.88回落到0.82但这才是不掺水的数字。第三个坑是概率尺度失真。某个项目需要设定一个筛选阈值我直接用训练时的分数分布来定阈值结果在真实批次里误筛掉了不少有反应活性的克隆。后来检查发现训练集里的HLA等位基因分布和实际患者队列偏离很大导致模型对队列里占多数的等位基因整体低估。解决办法是对目标队列先做一次无标签数据的分数分布回归分析再决定阈值。5.3 一些值得长期坚持的实操习惯做TCR-HLA预测没有银弹但有一些习惯能显著减少返工。数据层面我每次都在代码里固化一个去重和切分流程新数据进来先跑一遍输出后再进训练管线。这样无论模型怎么改评估结果都可以横向比。模型层面不追单一大模型CNN和注意力模型同时训练并做简单集成通常比任何单个模型稳定。集成成本不高遇到某个模型在某种表位上抽风时能兜住底。验证层面每个项目我都会留一批“压箱底”数据不在训练和调参阶段碰只在最终评估时拿出来用一次。压箱底数据最好是跟训练集完全不同批次的实验产物否则验证意义会打折扣。可解释性工具要跟模型一起交付。每次训练完模型顺手导出几条高分数样本的注意力权重和原位突变热图贴在项目文档里。三个月后再回头看这些图能帮你快速判断当初的筛选结果靠不靠谱。我在实际过程中体会最深的一条是TCR-HLA预测的成败多半不在模型而在数据。把数据清洗、泄漏防护和独立验证这三件事做扎实比在模型结构上反复炫技有效得多。如果你刚开始做这个方向不要急着复现那些花哨的深度模型先花两周时间把你手里的数据彻底摸清楚把验证流程搭好后面的一切都会顺很多。最后再分享一个小技巧遇到模型成绩莫名其妙特别高的时候先别高兴去检查是不是CDR3或表位序列在训练集和验证集之间偷偷串门了——这个检查能省下你至少一周的返工时间。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询