PerturBench:单细胞扰动预测的标准化基准测试框架解析
1. 项目概述:为什么我们需要一个统一的扰动预测基准测试库?
如果你在单细胞转录组学或者计算生物学领域做过一阵子,尤其是尝试过构建或复现那些预测基因敲除、药物处理后细胞表达谱变化的模型,那你大概率经历过这样的痛苦:好不容易从GitHub上扒拉下来一个模型的代码,吭哧吭哧配好环境,跑通了作者提供的示例数据,结果想换到自己的数据集上,或者想跟另一个SOTA模型公平地比一比,发现根本无从下手。数据格式千奇百怪,预处理流程各说各话,评估指标五花八门,甚至连“训练-验证-测试”划分都能搞出七八种不同的定义。最后,你花在数据对齐和工程实现上的时间,可能比研究模型本身还要多。
这就是单细胞扰动预测领域长期存在的一个痛点:缺乏一个公认的、标准化的基准测试框架。大家各玩各的,论文里的漂亮数字换个环境可能就复现不出来,模型之间的比较也常常是“关公战秦琼”,说服力有限。PerturBench的出现,就是为了填上这个坑。它不是一个新模型,而是一个基于PyTorch的开源软件库和基准测试套件,目标很明确:为这个领域的研究者提供一套统一的“尺子”和“跑道”。
简单来说,PerturBench想解决三个核心问题:
- 可复现性:让任何人拿到一篇论文的模型,都能用同一套数据、同一种划分、同一个评估流程,跑出可比较的结果。
- 可扩展性:让研究者能轻松地将自己的新模型、新数据集接入这个生态,快速进行基准测试,而不是从头造轮子。
- 深入评估:不仅看传统的RMSE、余弦相似度,还要引入更鲁棒、更能揭示模型本质问题的评估指标,比如它重点提出的排序指标(Rank Metrics),专门用来诊断模型是否发生了“模式崩溃”(Mode Collapse)——也就是模型不管输入什么扰动,都输出差不多的结果,这种“偷懒”行为在生成式模型中很常见,但传统指标很难发现。
这个库主要面向两类人:一是模型开发者,你可以用它作为脚手架,快速搭建和训练你的新模型,并确保你的评估是标准、公平的;二是模型使用者或评估者,你可以用它来系统性地比较不同模型在你关心的任务(比如跨细胞系预测、组合扰动预测)上的优劣,为你的生物学问题选择最合适的工具。
接下来,我会结合自己折腾这类模型的经验,带你深入拆解PerturBench的设计哲学、核心模块,并分享一些在真实使用中可能遇到的“坑”和实战技巧。
2. 核心设计思路:模块化、兼容性与面向未来的架构
PerturBench的架构设计充分体现了其“基准测试平台”的定位,核心思路是高内聚、低耦合,同时最大化地拥抱社区已有的成熟工具链。它不是要取代什么,而是要成为连接它们的“胶水”。
2.1 基石技术栈的选择:站在巨人的肩膀上
PerturBench没有重复发明轮子,而是明智地选择了几个在各自领域已成为事实标准的库作为基础,这大大降低了用户的学习和使用成本。
- PyTorch:深度学习模型构建的绝对主流。Pytorch的动态计算图和灵活的
Dataset/DataLoader抽象,为定义复杂的数据加载逻辑(比如单细胞数据特有的控制组匹配)提供了完美的基础。PerturBench的数据模块就是构建在PyTorch的Dataset抽象之上的。 - PyTorch Lightning:用过纯PyTorch写训练循环的人都知道,里面充斥着大量重复的样板代码(设备管理、梯度累积、日志记录、检查点保存等)。PyTorch Lightning将这些抽象成
LightningModule和LightningDataModule,让研究者能更专注于模型结构和数据逻辑本身。PerturBench的基类PerturbationModel就继承自LightningModule,使得模型训练、验证、测试的流程变得极其简洁和标准化。 - Hydra:做基准测试,意味着有海量的超参数、数据集路径、模型配置需要管理。用一堆命令行参数或者散落的配置文件很容易失控。Hydra提供了一个强大的层级化配置管理系统,支持从命令行动态组合配置,还能方便地集成超参数优化工具(如Optuna)。这使得复现任何一个实验(比如“用CPA模型在Norman19数据集上跑第6号数据划分”)只需要一条清晰的命令。
- AnnData:单细胞数据分析领域的“普通话”。
AnnData对象将基因表达矩阵(X)、细胞元数据(obs)、基因元数据(var)以及各种中间计算结果(obsm,obsp,layers)统一封装在一个数据结构里。PerturBench将AnnData作为数据的输入、内部交换和输出的标准格式。这意味着你可以直接用Scanpy等工具预处理你的数据,保存为.h5ad文件,然后无缝喂给PerturBench。模型预测的输出也是一个AnnData对象,你可以直接用Scanpy进行下游的可视化或分析。这种设计消除了格式转换的麻烦,是工程上的一大亮点。
实操心得:这种技术栈选择非常“接地气”。一个新手研究者,很可能已经熟悉了PyTorch和Scanpy/AnnData。PerturBench在此基础上搭建,学习曲线相对平缓。当你需要调试时,由于底层都是这些熟悉的库,你很容易定位问题是出在数据预处理、模型定义还是训练流程上。
2.2 核心抽象:数据、模型、评估的三位一体
PerturBench的代码库清晰地分为三个核心模块,这也是大多数机器学习项目的通用范式,但在单细胞扰动预测这个具体领域做了高度特化。
perturbench.data:定义了如何将单细胞数据(AnnData)转化为模型可用的张量(Tensor)。其核心是Example这个命名元组(NamedTuple),它规范了一个样本(一个细胞)必须包含和可选包含哪些信息。比如,gene_expression(基因表达向量)和perturbations(施加的扰动列表)是必需的;而controls(匹配的控制细胞表达)和covariates(协变量,如细胞类型、供体)等是可选的,用于支持更复杂的任务(如控制匹配、条件预测)。perturbench.model:提供了模型基类PerturbationModel。任何想要接入PerturBench基准测试的模型,都需要继承这个类,并实现关键的predict方法(给定一个反事实批次数据,预测扰动后的表达)。基类已经帮你封装好了PyTorch Lightning的训练/测试循环、优化器配置、以及调用评估流程的钩子。你只需要关心模型的前向传播逻辑。perturbench.analysis:这是评估部分的核心。它提供了一套统一的评估指标计算流程,并且设计成了类似Kaggle竞赛的API风格:你只需要将模型预测结果(一个AnnData对象)丢给Evaluator,指定任务名称(如"sciplex3-transfer"),它就会返回一个包含所有指标结果的DataFrame。这极大地简化了评估流程,保证了公平性。
这种模块化设计的好处是,你可以像搭积木一样使用它。你可以只用它的数据模块来加载和处理你的数据,然后用你自己的训练框架。你也可以只继承它的模型基类来获得标准化的评估接口。当然,最完整的用法是三者全用,享受一站式的便利。
3. 数据抽象详解:从AnnData到模型输入的关键转换
数据是机器学习的燃料,在单细胞扰动预测中,数据准备更是重中之重,且异常繁琐。PerturBench在数据抽象上花了很大功夫,旨在覆盖从简单到复杂的各种实验设计。
3.1 核心数据结构:Example与Batch
一切始于Example类。它定义了一个样本(一个细胞)的标准结构。理解每个字段的含义至关重要:
class Example(NamedTuple): gene_expression: Tensor # 必需:该细胞的基因表达向量(例如,top 4000高变基因的logCPM值) perturbations: list[str] # 必需:应用于该细胞的扰动列表,如 [‘TP53_knockout‘],组合扰动则为 [‘DrugA‘, ‘DrugB‘] covariates: dict[str, str] # 可选:协变量字典,如 {‘cell_type‘: ‘T细胞‘, ‘donor‘: ‘D1‘} controls: Tensor # 可选:匹配的控制细胞表达向量,用于某些需要显式控制匹配的模型或损失函数 gene_names: list[str] # 可选:基因名列表,与`gene_expression`的维度顺序对应 extra: dict[str, Any] # 可选:其他任意额外信息,如预计算的细胞嵌入(cell embeddings)一个Batch就是多个Example的集合,通常由PyTorch的DataLoader自动组装而成,并增加了批次维度。
注意事项:
perturbations字段是列表,这巧妙支持了组合扰动(Combinatorial Perturbations)的表示。这是很多早期工具忽略的一点。例如,同时敲除基因A和B,就表示为[‘GeneA_KO‘, ‘GeneB_KO‘]。协变量covariates使用字典,也使得多条件、多因素的实验设计(如不同细胞系+不同药物处理)能够被统一表征。
3.2 四类数据集(Dataset)及其应用场景
PerturBench提供了四种PyTorchDataset类,对应不同的任务阶段和实验设计:
SingleCellPerturbation:基础训练数据集。它从AnnData对象中读取表达矩阵和元数据,构建一个用于模型训练的数据集。每个样本返回一个Example。它通过工厂方法from_anndata创建,需要指定哪个obs列是扰动标签(perturbation_key),以及如何分隔组合扰动中的多个扰动名称(perturbation_combination_delimiter,例如用分号;)。SingleCellPerturbationWithControls:带控制匹配的训练数据集。它继承自上一个类,但增加了一个关键功能:为每个扰动细胞动态采样一个匹配的控制细胞。匹配通常基于协变量(例如,同一个供体、同一种细胞类型、同一块培养板)。这个功能对于某些强调“差异效应”的模型或损失函数(如基于对照的损失)非常有用。它在内部维护了一个从协变量组合到控制细胞索引的映射表(control_indexes),以实现高效采样。Counterfactual:反事实预测数据集。用于模型推理(inference)阶段。它的目的不是提供有标签的数据,而是定义“你想让模型预测什么”。你给它一组控制细胞(control_expression)和一组你感兴趣的“反事实”扰动条件(perturbations和covariates),它就会生成相应的Batch,输入给模型的predict方法。例如,你可以问:“如果把这些原本健康的T细胞(控制组)都用药物X处理,它们的表达谱会变成什么样?”CounterfactualWithReference:带真实参考的反事实预测数据集。这是评估阶段的核心。它继承自Counterfactual,但额外包含了一个真实的、观测到的扰动数据集(reference_adata)。同时,它还有一个映射表(reference_indexes),能将每个“反事实查询”(特定扰动+特定协变量)映射到reference_adata中对应的、真实观测到的细胞索引上。这样,在评估时,系统就能自动将模型的预测值与真实观测值进行逐对比较。
实操心得:理解这四种
Dataset的区别是正确使用PerturBench的关键。很多错误源于用错了数据集类型。比如,在评估模型时,你必须使用CounterfactualWithReference来构建测试集,这样才能获得用于计算指标的真实标签。SingleCellPerturbationWithControls在训练时非常有用,特别是当你的数据集中扰动细胞和对照细胞数量不平衡时,它能确保每个批次内都有合理的对照信号。
3.3 数据划分策略:超越简单的随机分割
在基准测试中,如何划分训练集、验证集和测试集,直接决定了任务的难度和评估的公正性。PerturBench实现了三种更具生物学意义和挑战性的划分策略,通过DataSplitter类来管理:
- 跨协变量划分:这是为了测试模型的泛化能力。例如,在训练集中包含细胞类型A、B、C的扰动数据,但在测试集中要求模型预测细胞类型D(训练时从未见过)对某些扰动的响应。这模拟了现实场景:我们无法为所有细胞类型都做一遍实验。
- 组合划分:这是为了测试模型对高阶相互作用的理解。训练集包含单一扰动A、B、C的数据,以及部分组合扰动如A+B的数据。测试集则包含训练时未见过的组合,如A+C或B+C,甚至三重组A+B+C。这要求模型能够推理出扰动之间的非线性叠加效应。
- 逆向组合划分:这是一个更刁钻的任务。训练集包含了组合扰动A+B的数据,以及单一扰动B的数据。测试集要求模型预测单一扰动A的效应。这测试了模型能否从组合效应中“解耦”出单个成分的贡献。
DataSplitter通过两个主要参数来控制划分的严格程度:m(最多保留的协变量类型数量)和f(每个协变量类型中保留的扰动比例)。m越大,保留的协变量越少,任务越难;f越大,保留的扰动越少,任务也越难。这种设计允许研究者系统地研究数据量、数据平衡性对模型性能的影响。
4. 模型接口与评估流程:如何让你的模型“上车”
4.1 实现一个兼容PerturBench的模型
要让你的自定义模型能在PerturBench的框架下训练和评估,你需要创建一个继承自PerturbationModel的类。这个基类(本身也是LightningModule)已经为你处理了大部分样板代码。
你需要完成的最核心工作是实现抽象方法predict(self, counterfactual_batch: Batch) -> torch.Tensor。这个方法接收一个由Counterfactual数据集产生的批次数据,返回模型预测的扰动后基因表达张量。这个Batch里包含了控制细胞的表达、协变量信息以及你想要施加的扰动列表。
此外,你通常还需要重写__init__方法来定义你的网络结构,以及forward方法(可选,用于训练时的前向传播)。configure_optimizers方法基类提供了默认的Adam优化器,你也可以按需重写。
import torch import pytorch_lightning as pl from perturbench.model.base import PerturbationModel class MyCustomModel(PerturbationModel): def __init__(self, n_genes: int, perturbation_vocab_size: int, hidden_dim: int = 128): super().__init__() # 定义你的网络层 self.pert_embedding = torch.nn.Embedding(perturbation_vocab_size, hidden_dim) self.encoder = torch.nn.Linear(n_genes + hidden_dim, hidden_dim) self.decoder = torch.nn.Linear(hidden_dim, n_genes) # 可以在这里保存一些必要的配置到 self.training_record self.training_record[‘n_genes‘] = n_genes def predict(self, counterfactual_batch: Batch) -> torch.Tensor: """ 核心推理方法。 counterfactual_batch 包含: - control_expression: 控制细胞表达 [batch_size, n_genes] - perturbations: 扰动列表的列表 - covariates: 协变量字典 """ # 1. 获取控制细胞表达 x_control = counterfactual_batch.gene_expression # 2. 将扰动名称转换为嵌入(这里需要你自己的词表映射逻辑) pert_indices = self._convert_pert_names_to_indices(counterfactual_batch.perturbations) pert_emb = self.pert_embedding(pert_indices) # [batch_size, hidden_dim] # 3. 将控制表达和扰动嵌入拼接,通过网络 combined = torch.cat([x_control, pert_emb], dim=-1) latent = self.encoder(combined) x_pred = self.decoder(latent) # 预测的扰动后表达 return x_pred def _convert_pert_names_to_indices(self, pert_list): # 实现将扰动名称字符串映射到索引ID的逻辑 # 例如,使用一个预定义的字典 pass def training_step(self, batch, batch_idx): # 如果你需要自定义训练步骤(例如,使用不同的损失函数),可以重写这里 # 否则,基类会使用默认的MSE损失在 predict 的输出和真实标签之间计算 x_real, y_real = batch # batch 来自 SingleCellPerturbation 数据集 y_pred = self.forward(x_real) # 需要你实现 forward 方法 loss = torch.nn.functional.mse_loss(y_pred, y_real) self.log(‘train_loss‘, loss) return loss注意事项:
predict方法的输入是Counterfactual批次,输出是预测的表达值,而不是表达值的变化量(Δ)。这意味着模型需要学习从“控制状态”到“扰动状态”的完整映射。你的模型内部如何处理控制细胞信息(是直接拼接,还是作为解码器的条件,抑或是用其他方式),完全由你决定。这给了模型设计很大的灵活性。
4.2 训练与评估的标准化流程
得益于PyTorch Lightning和Hydra的集成,训练一个模型变得非常简洁。通常会有一个train.py脚本,它通过Hydra读取配置文件。配置文件中定义了模型架构、数据集路径、数据划分策略、训练超参数(学习率、批次大小、轮数)、日志记录器等所有设置。
运行训练就像这样:
python train.py model=my_custom_model dataset=norman19 split=cross_covariate训练结束后,PyTorch Lightning的Trainer会自动调用test_step,使用CounterfactualWithReference测试集对模型进行评估。所有指标会被计算并汇总。
4.3 核心评估指标解读:超越RMSE
PerturBench计算一套综合的评估指标,从不同角度衡量预测质量:
- RMSE (均方根误差):最直接的回归指标,衡量预测表达值与真实值在绝对数值上的差距。但它对异常值敏感,且无法衡量分布层面的相似性。
- Cosine Similarity of LogFC (对数倍变化余弦相似度):这是一个更生物相关的指标。它先计算每个基因在扰动组 vs 控制组之间的对数倍变化(Log Fold Change),然后比较预测的LogFC向量与真实的LogFC向量之间的余弦相似度。这个指标关注的是变化的方向和模式,而不是绝对表达值,对于很多下游分析(如通路富集)更有意义。
- MMD (最大均值差异):一个衡量两个概率分布差异的指标。PerturBench分别在原始基因表达空间(MMD GEX)和PCA降维后的空间(MMD PCA)计算MMD。这用于评估模型预测的细胞群体分布是否与真实扰动后的细胞群体分布一致。一个好的模型应该能捕捉到扰动引入的细胞异质性,而不仅仅是预测一个“平均”响应。
- DEG Recall (差异表达基因召回率):识别哪些基因因扰动而发生显著变化(差异表达基因,DEG)是许多生物学分析的关键。这个指标计算模型预测出的top N个变化最大的基因中,有多少是真实的DEG。它衡量模型捕捉最显著生物学信号的能力。
- Rank Metrics (排序指标):这是PerturBench的一大创新。对于每个测试样本(一个特定的扰动-协变量组合),它计算模型预测值与所有其他真实观测样本之间的相似度(如余弦相似度),然后看真实匹配的样本在其中排第几名(排名越靠前越好),最后对所有测试样本取平均。这个指标非常严苛,因为它要求模型不仅预测得准,还要在众多可能的“错误答案”中脱颖而出。它能有效暴露“模式崩溃”问题——如果一个模型对所有输入都输出相似的结果,那么它的预测与真实匹配样本的相似度排名可能会很差,即使它的RMSE看起来还不错。
5. 实战经验与避坑指南
在复现和使用PerturBench,以及基于它进行开发的过程中,我踩过不少坑,也总结出一些让流程更顺畅的经验。
5.1 数据预处理的一致性:成败的关键
基准测试的核心是公平比较,而公平比较的前提是所有模型使用完全相同的数据。PerturBench虽然提供了数据加载模块,但原始数据的预处理(如基因过滤、归一化)仍需用户自己完成,并保存为标准的AnnData文件。这里有几个关键点:
- 高变基因选择:PerturBench建议使用Seurat v3方法选择top 4000个高变基因。务必记录下这些基因的列表。在将新数据(或另一个模型所需的数据)输入基准测试前,必须将其投影到完全相同的基因空间。如果两个模型用了不同的基因集,比较就失去了意义。一个实用的做法是,在第一次处理基准数据集时,就将筛选出的高变基因列表保存下来,作为该数据集“官方”特征集。
- 归一化与缩放:是使用CPM(每百万计数)、logCPM,还是SCTransform的残差?不同的归一化方法会极大影响数据的分布,从而影响模型性能。必须在整个基准测试中固定使用一种方法。PerturBench的示例通常使用log1p(CPM)后的数据。
- 扰动与协变量编码:确保你的AnnData对象的
obsDataFrame中,扰动和协变量列的名称、格式与PerturBench的from_anndata工厂方法所期望的一致。特别是对于组合扰动,要明确分隔符(如;或+),并在所有数据集中保持一致。 - 控制细胞的明确标识:数据集中必须有一列来明确标识哪些细胞是未受扰动的控制组(Control)。通常这列的值是一个特定的字符串,如
‘control‘或‘NT‘(Non-Targeting)。在构建SingleCellPerturbationWithControls数据集时,需要正确指定perturbation_control_value参数。
5.2 模型实现中的常见陷阱
predict方法的输入输出维度:这是最容易出错的地方。务必清楚counterfactual_batch.gene_expression的形状是[batch_size, n_genes],你的模型输出也必须是这个形状。如果你的模型内部使用了基因嵌入或注意力机制,要确保最终解码回原始基因空间。- 扰动嵌入的处理:许多先进模型(如CPA, GEARS)会使用预训练的扰动嵌入(如药物的分子指纹、基因的GO注释向量)。如果你在模型中使用这类嵌入,需要在
Example的extra字段中提供,或者在模型内部实现一个嵌入层。要确保在训练和推理时,嵌入的查找方式一致。 - 与PyTorch Lightning的配合:
PerturbationModel是LightningModule的子类。这意味着你需要遵循PyTorch Lightning的规范。例如,在training_step中计算损失并使用self.log记录,优化器配置在configure_optimizers中定义。如果你需要更复杂的训练逻辑(如对抗训练、多任务学习),可能需要仔细重写这些方法。 - 设备管理:PyTorch Lightning会自动处理设备(CPU/GPU)放置。但在你的模型
forward或predict方法内部,如果进行了自定义的张量操作(如从外部文件加载嵌入矩阵),要确保这些张量也在正确的设备上。可以使用self.device属性来获取模型当前所在的设备。
5.3 评估阶段的关键步骤
- 正确构建测试集:评估必须使用
CounterfactualWithReference数据集。你需要提供:control_expression:用于生成反事实预测的控制细胞表达矩阵。perturbations和covariates:你想要评估的(扰动,协变量)对列表。reference_adata:包含真实扰动细胞观测值的AnnData对象。reference_indexes:一个字典,将每个(扰动,协变量)组合映射到reference_adata中的细胞索引列表。构建这个映射表是评估准备中最容易出错的一环,需要仔细检查每个组合在参考数据中是否都有对应的观测细胞。
- 理解评估输出:
Evaluator.evaluate()返回的DataFrame包含了所有指标在每个模型上的结果。注意,有些指标是“越高越好”(如Cosine LogFC),有些是“越低越好”(如RMSE, MMD)。排序指标*_rank的值在0到1之间,越接近0越好(排名越靠前)。仔细阅读文档,理解每个指标的确切含义。 - 模式崩溃的诊断:如果你的模型在RMSE上表现尚可,但排序指标(特别是
transposed-rank)非常差(接近0.5,即随机水平),那么很可能发生了模式崩溃。此时,应该像PerturBench论文附录中那样,绘制预测结果之间的余弦相似度矩阵热图。如果热图看起来“块状”明显(同一协变量下的不同扰动预测结果相似),或者整体颜色单一,那就是模式崩溃的典型标志。这时需要检查模型容量是否不足、正则化是否过强、或者训练数据是否存在严重不平衡。
5.4 性能优化与调试技巧
- 利用Hydra进行超参数扫描:PerturBench与Hydra和Optuna的集成使得超参数优化变得非常方便。你可以定义一个超参数搜索空间,然后并行运行数十个实验。这对于寻找最佳模型配置至关重要。记得合理设置搜索范围,并利用Hydra的多运行(multirun)功能。
- 注意内存使用:单细胞数据矩阵可能非常大。使用
SingleCellPerturbation数据集时,如果整个表达矩阵加载到内存中导致OOM(内存溢出),可以考虑使用torch.utils.data.Subset进行子采样,或者使用IterableDataset进行流式加载(但这可能会增加代码复杂度)。Counterfactual数据集通常较小,因为只涉及控制细胞。 - 日志与可视化:充分利用PyTorch Lightning的日志回调(如
TensorBoardLogger)。监控训练损失、验证损失以及任何你自定义的指标。对于生成式模型,定期可视化一些样本的预测结果与真实值的对比(例如,选择几个关键基因,绘制预测值与真实值的散点图),可以给你带来比数字指标更直观的感受。 - 从简单基线开始:在实现复杂的SOTA模型之前,强烈建议先实现并运行PerturBench提供的几个基线模型,如
LatentAdditive或DecoderOnly。这能帮助你快速验证整个PerturBench pipeline在你的机器和环境上是畅通的,并且能建立一个性能基准。之后,任何复杂模型都应该显著超越这些基线,否则就需要反思是模型问题还是实现bug。
6. 总结与展望:PerturBench的生态价值
折腾完PerturBench这一套,我的感受是,它确实为单细胞扰动预测这个快速发展的领域注入了一剂“标准化”的强心针。它通过严谨的软件工程实践,把数据接口、模型训练、评估指标这些琐碎但关键的部分给统一和自动化了,让研究者能更专注于模型创新本身。
它的几个设计选择我认为尤其值得称道:一是深度绑定AnnData,无缝对接现有单细胞分析生态;二是引入排序指标来诊断模式崩溃,戳中了许多生成式模型的软肋;三是提供了多种具有生物学意义的数据划分策略,推动模型向更具泛化能力的方向发展。
当然,作为一个工具,它也有其边界和可扩展的方向。例如,目前它主要处理的是静态的、单时间点的扰动响应预测。对于时间序列的扰动数据(如scRNA-seq时间序列),或者需要整合多组学信息(如ATAC-seq, 蛋白质组)的预测任务,当前的抽象可能需要进一步扩展。此外,对于如何将先验知识(如基因调控网络、通路数据库)更有效地融入模型框架,PerturBench提供了extra字段这样的扩展口,但更深入的集成可能需要社区共同探索。
对于想要进入这个领域的新手,我的建议是:把PerturBench的代码仓库克隆下来,从运行它的教程Notebook开始,尤其是复现一两个基线模型在某个数据集(如Srivatsan20)上的结果。在这个过程中,你会被迫理解它的数据流、模型接口和评估流程。一旦跑通,你就掌握了在这个领域进行可复现研究的“标准语言”。之后,无论是评估别人的模型,还是发布自己的模型,你都会发现沟通和比较的效率大大提升。
最终,像PerturBench这样的基准测试框架,其价值不仅在于提供了一组数字排名,更在于它定义了一套清晰的“游戏规则”,促进了开源、透明和累积性的科学研究。它让这个领域的进步,变得可以被客观地衡量和比较。
