2. 蛋白质序列数据基础与工程化预处理
蛋白质序列表征学习的第一步不是模型,而是数据。无论使用 ESM、ProtBert 还是自研的卷积/Transformer 编码器,输入序列的质量直接决定下游任务(如亚细胞定位、酶功能预测、突变效应打分)的上限。本节围绕 FASTA 解析、序列清洗、去冗余、长度分布分析、数据集划分与数据泄漏防范六个环节,给出一条可复现的工程化预处理链路。
一、FASTA 格式解析:从文本到结构化记录
FASTA 是最通用的蛋白序列交换格式,其结构为:以 > 开头的描述行(header),后跟若干行序列字符。一个典型条目如下:
>sp|P00698|LYSC_CHICK Lysozyme C OS=Gallus gallus OX=9031 GN=LYZ PE=1 SV=1
MRSLLILVLCFLPLAALGKVFGRCELAAAMKRHGLDNYRGYSLGNWVCAAKFESNFNTQATNRNTDGSTDYGILQINSRWWCNDGRTPGSRNLCNIPCSALLSSDITASVNCAKKIVSDGNGMNAWVAWRNRCKGTDVQAWIRGCRL
解析时需注意三点:其一,序列可能跨多行,必须拼接后再处理;其二,header 中的 OS=(物种)、GN=(基因名)等字段是后续分层划分的重要元数据;其三,非标准字符(如 U 硒代半胱氨酸、O 吡咯赖氨酸、X 未知残基、B/Z 模糊残基)在解析阶段应保留,清洗阶段再决策。Python 中可用 Biopython 的 SeqIO.parse(f, "fasta") 一次性获得 id、description 与 seq,也可用轻量脚本自行解析以控制内存。
二、序列清洗:合法性、异常与截断策略
清洗的目标是让每条序列满足“字符合法、长度合理、语义明确”。建议按以下顺序执行:
- 字符规范化:统一大写;将
U→C、O→K(按常见近似映射),或直接标记为特殊 token;B/Z/X视模型词表决定保留或替换为X。 - 非法字符剔除:去除
*(终止符)、数字、空白及-(比对空位)。若序列含大量非 20 种标准氨基酸字符,应记录并考虑丢弃。 - 长度过滤:过短序列(如 <30 aa)通常缺乏结构信息,过长序列(如 >3000 aa)会显著增加显存与计算开销。示例阈值可设为 [50, 2000],具体依任务调整。
- 截断策略:对超长序列,可保留 N 端前 L 个残基(如 L=1024),或采用滑窗切分生成多条子序列。截断会丢失 C 端信息,需在实验记录中明确。
三、去冗余:降低同源偏置
公共数据库(UniProt、PDB)中存在大量高度相似的序列。若不去冗余,训练集会被某些家族主导,模型倾向于记忆而非泛化。常用做法是基于序列相似度聚类,在每个簇内只保留一条代表序列。工具可选 CD-HIT(cd-hit -i input.fasta -o nr.fasta -c 0.5 -n 3,表示 50% 相似度阈值)、MMseqs2(更快,适合百万级)或 DIAMOND 聚类。阈值选择上,40%–50% 常用于减少同源泄漏,90% 以上则用于去除近乎重复的条目。去冗余后应记录簇数量与代表序列数量,作为数据集规模变化的依据。
四、长度分布分析:决定截断与分桶
蛋白长度跨度极大(从几十到数万残基)。在建模前绘制长度直方图或累积分布,可帮助确定最大长度、是否分桶(bucketing)以及 padding 策略。例如,若 95% 序列长度 ≤ 800,则可将最大长度设为 800,超出部分截断;若分布呈双峰,可考虑按长度分桶训练以减少 padding 浪费。长度分布也影响 batch 内序列的对齐效率,是工程实现中不可忽略的一步。
五、数据集划分:从随机切分到分层切分
随机按 8:1:1 切分在蛋白任务中往往过于乐观,因为同源序列可能同时落入训练与测试集。更合理的做法包括:
- 按聚类簇划分:先对全量序列聚类(如 30% 相似度),再以簇为单位分配至 train/val/test,确保同一簇不跨集合。
- 按物种或家族分层:若任务关注跨物种泛化,可留出特定物种作为测试集;若关注家族泛化,则留出特定 Pfam 家族。
- 时间切分:按 UniProt 收录日期切分,模拟“用旧数据预测新数据”的真实场景。
划分后应统计各集合的长度分布、物种分布与标签分布,确认无严重偏斜。若验证集与训练集分布差异过大,需重新调整划分策略。
六、数据泄漏防范:工程中的隐蔽陷阱
数据泄漏是蛋白工程中最常见也最致命的错误。典型场景包括:
- 同源泄漏:训练集与测试集含相似序列,模型实际在“记忆”而非泛化。防范手段是聚类后按簇划分,并在划分后再次用 BLAST/MMseqs2 检查跨集合相似度。
- 重复条目:同一序列以不同 ID 出现,随机划分时必然泄漏。去冗余阶段应彻底去除完全重复与近乎重复。
- 标签泄漏:若标签由序列本身计算得出(如某些理化性质),需确保特征工程不引入测试集信息。
- 预处理泄漏:归一化、词表构建等操作若在全量数据上完成,也会引入泄漏。正确做法是仅在训练集上拟合,再应用于验证/测试集。
七、可复现的预处理清单
为便于工程落地,以下清单可直接作为预处理脚本的检查项:
| 阶段 | 关键操作 | 输出/记录 |
|---|---|---|
| 解析 | 读取 FASTA,拼接多行,提取 header 元数据 | 原始记录数、字段完整率 |
| 清洗 | 大写化、非法字符处理、长度过滤 [50,2000] | 丢弃原因分布 |
| 去冗余 | CD-HIT 50% 聚类,保留代表序列 | 簇数、代表序列数 |
| 长度分析 | 直方图、分位数,确定 max_len | P50/P95/P99、截断比例 |
| 划分 | 按簇 8:1:1,分层检查 | 各集合规模与分布 |
| 泄漏审计 | MMseqs2 跨集合搜索 | 高相似命中列表 |
完成上述步骤后,得到的是一份“干净、无泄漏、长度可控”的序列数据集,可直接送入 tokenizer 与模型训练。下一阶段将在此基础上讨论序列的数值化表示与嵌入生成。