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 内序列的对齐效率,是工程实现中不可忽略的一步。

蛋白质序列预处理与数据划分流程 FASTA 文件 header + 序列 解析 拼接多行序列 清洗 字符/长度过滤 去冗余 CD-HIT / MMseqs2 长度分布分析 直方图 / 累积分布 → 确定最大长度、截断策略、是否分桶 示例:95% 序列 ≤ 800 aa → max_len = 800 数据集划分 + 泄漏防范 按聚类簇划分 · 按物种/家族分层 · 时间切分 检查项 同源泄漏 重复条目

五、数据集划分:从随机切分到分层切分

随机按 8:1:1 切分在蛋白任务中往往过于乐观,因为同源序列可能同时落入训练与测试集。更合理的做法包括:

  • 按聚类簇划分:先对全量序列聚类(如 30% 相似度),再以簇为单位分配至 train/val/test,确保同一簇不跨集合。
  • 按物种或家族分层:若任务关注跨物种泛化,可留出特定物种作为测试集;若关注家族泛化,则留出特定 Pfam 家族。
  • 时间切分:按 UniProt 收录日期切分,模拟“用旧数据预测新数据”的真实场景。

划分后应统计各集合的长度分布、物种分布与标签分布,确认无严重偏斜。若验证集与训练集分布差异过大,需重新调整划分策略。

六、数据泄漏防范:工程中的隐蔽陷阱

数据泄漏是蛋白工程中最常见也最致命的错误。典型场景包括:

  • 同源泄漏:训练集与测试集含相似序列,模型实际在“记忆”而非泛化。防范手段是聚类后按簇划分,并在划分后再次用 BLAST/MMseqs2 检查跨集合相似度。
  • 重复条目:同一序列以不同 ID 出现,随机划分时必然泄漏。去冗余阶段应彻底去除完全重复与近乎重复。
  • 标签泄漏:若标签由序列本身计算得出(如某些理化性质),需确保特征工程不引入测试集信息。
  • 预处理泄漏:归一化、词表构建等操作若在全量数据上完成,也会引入泄漏。正确做法是仅在训练集上拟合,再应用于验证/测试集。
划分完成后,建议执行一次“泄漏审计”:用 MMseqs2 将测试集序列对训练集搜索,若存在 identity > 30% 且覆盖度 > 80% 的命中,应重新划分或剔除。

七、可复现的预处理清单

为便于工程落地,以下清单可直接作为预处理脚本的检查项:

阶段关键操作输出/记录
解析读取 FASTA,拼接多行,提取 header 元数据原始记录数、字段完整率
清洗大写化、非法字符处理、长度过滤 [50,2000]丢弃原因分布
去冗余CD-HIT 50% 聚类,保留代表序列簇数、代表序列数
长度分析直方图、分位数,确定 max_lenP50/P95/P99、截断比例
划分按簇 8:1:1,分层检查各集合规模与分布
泄漏审计MMseqs2 跨集合搜索高相似命中列表

完成上述步骤后,得到的是一份“干净、无泄漏、长度可控”的序列数据集,可直接送入 tokenizer 与模型训练。下一阶段将在此基础上讨论序列的数值化表示与嵌入生成。