DeepChem 实战:基于 HIV 数据集的抗病毒活性筛选二分类建模
【免费下载链接】deepchemDemocratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology项目地址: https://gitcode.com/GitHub_Trending/de/deepchem
导读
本文围绕 DeepChem 仓库 examples/hiv 目录展开,完整讲解 HIV 活性筛选数据集的来源、CSV 字段含义与统计分布,以及两种开箱即用的建模方案:基于 ECFP 指纹的多任务全连接分类器(hiv_tf_models.py)与基于 IRV(表示学习投票)特征的分类器(hiv_irv.py)。读完本文,你将掌握load_hiv数据加载 API 的全部关键参数、scaffold 切分与类别平衡变换的实战用法,并能直接运行示例脚本在 4 万余个化合物上完成活性/非活性二分类训练与 AUC 评估。
一、数据集背景:DTP AIDS 抗病毒筛选计划
HIV 数据集由美国国家癌症研究所(NCI)的药物治疗项目(Drug Therapeutics Program,DTP)AIDS 抗病毒筛选(AIDS Antiviral Screen)引入。该筛选计划系统测试了超过 40,000 个化合物抑制 HIV 复制的能力,原始数据来自公开的 AIDS Antiviral Screen 数据库(NCI DTP 数据仓库)。
筛选结果被划分为三个类别:
- CI(Confirmed Inactive):确认无活性;
- CA(Confirmed Active):确认有活性;
- CM(Confirmed Moderately Active):确认中等活性。
DeepChem 在加载时进一步将后两个类别合并,从而把任务转化为"非活性(CI)vs 活性(CA 与 CM)"的二分类任务。这也是 DeepChem 官方文档对该数据集反复强调的默认设定(见 hiv_datasets.py 中的 docstring)。
二、数据文件解析:HIV.csv 的列结构与统计
本仓库直接在 examples/hiv/HIV.csv 中携带了完整数据文件(共 41,914 行,含表头),无需联网下载即可复现示例。CSV 使用逗号分隔,每行对应一个化合物,核心列为:
| 列名 | 含义 | 取值 |
|---|---|---|
smiles | 分子结构的 SMILES 表示 | 任意合法 SMILES 字符串 |
activity | 筛选结果三分类标签 | CI/CM/CA |
HIV_active | 合并后的二分类标签 | 1(CA/CM 活性)与0(CI 非活性) |
对仓库内 CSV 的实际统计(按HIV_active字段)为:活性样本 1,487 条,非活性样本 40,426 条,活性比例仅约 3.5%。这意味着该任务是一个典型的类别极不平衡的二分类问题——正因如此,load_hiv 默认会挂载类别平衡变换器(balancing),训练脚本也统一选用对不平衡不敏感的 ROC-AUC 作为评估指标。
数据文件首行示例(来自 HIV.csv):
smiles,activity,HIV_active CCC1=[O+][Cu-3]2([O+]=C(CC)C1)[O+]=C(CC)CC(CC)=[O+]2,CI,0三、数据加载:load_hiv 加载器与关键参数
示例脚本均通过 DeepChem 的统一 MoleculeNet 加载接口获取数据:
from deepchem.molnet import load_hiv hiv_tasks, hiv_datasets, transformers = load_hiv() train_dataset, valid_dataset, test_dataset = hiv_datasets该函数定义于 deepchem/molnet/load_function/hiv_datasets.py,返回三元组:任务名列表(HIV_TASKS = ["HIV_active"],即单任务)、切分后的数据集元组以及已应用的变换器列表。其完整签名与默认值如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
featurizer | 'ECFP' | 分子特征化方式,传入dc.feat.Featurizer实例或dc.molnet.featurizers中的名称。默认 ECFP(扩展连通性指纹)输出 1024 维特征 |
splitter | 'scaffold' | 数据切分器,传入dc.splits.Splitter实例或dc.molnet.splitters中的名称。官方明确推荐使用 scaffold 切分 |
transformers | ['balancing'] | 应用于数据的变换器列表,默认启用类别平衡 |
reload | True | 为 True 时,首次调用会把处理好的数据集缓存到磁盘,后续调用直接加载缓存,避免重复特征化 |
data_dir | None | 原始数据保存目录(若指定目录下无HIV.csv,加载器会自动从上游数据地址下载,见 hiv_datasets.py 的create_dataset) |
save_dir | None | 处理后数据集缓存目录 |
从源码实现看,_HIVLoader.create_dataset的加载链路为:确认HIV.csv存在(不存在则下载)→ 用dc.data.CSVLoader(tasks=["HIV_active"], feature_field="smiles", featurizer=...)读取 → 以shard_size=8192分片构建Dataset。也就是说,原始 CSV 中的activity三分类列在建模时并不直接使用,模型只消费由HIV_active生成的标签。
四、方案一:ECFP 指纹 + 多任务全连接分类器
示例脚本 hiv_tf_models.py 给出了最直接的基线模型:以 1024 维 ECFP 指纹为输入,训练MultitaskClassifier全连接网络。完整流程如下:
import numpy as np import deepchem as dc from deepchem.molnet import load_hiv np.random.seed(123) # 仅用于调试复现 n_features = 1024 hiv_tasks, hiv_datasets, transformers = load_hiv() train_dataset, valid_dataset, test_dataset = hiv_datasets metric = dc.metrics.Metric(dc.metrics.roc_auc_score, np.mean) model = dc.models.MultitaskClassifier( len(hiv_tasks), # 任务数 = 1 n_features, # 输入特征维度 = 1024 layer_sizes=[1000], # 隐藏层神经元数 dropouts=[.25], # 对应隐藏层的 dropout 比率 learning_rate=0.001, batch_size=50) model.fit(train_dataset) train_scores = model.evaluate(train_dataset, [metric], transformers) valid_scores = model.evaluate(valid_dataset, [metric], transformers) print("Train scores", train_scores) print("Validation scores", valid_scores)几个值得注意的工程细节:
MultitaskClassifier是 DeepChem 内置的多任务分类模型(定义于 deepchem/models/multitask.py)。虽然 HIV 只有单任务,但该 API 天然支持扩展为多任务场景,这也是仓库示例将其作为通用范本的原因。- 随机种子固定:
np.random.seed(123)用于确保实验可复现,便于横向比较不同脚本的效果。 - 评估指标为 ROC-AUC:
dc.metrics.Metric(dc.metrics.roc_auc_score, np.mean)对每个任务计算 AUC 后取平均。在 3.5% 正样本的强不平衡设定下,AUC 比准确率更能反映模型真实区分能力。 - 评估时传入
transformers:验证集需经过与训练集相同的平衡变换处理后再打分,evaluate内部会自动完成逆变换还原真实标签,避免变换器导致评估失真。
五、方案二:IRVTransformer + 多任务 IRV 分类器
第二个示例 hiv_irv.py 展示了 DeepChem 中更具特色的IRV(Impact Rank Value,基于 K 近邻投票)表示学习方案。该方案首先用IRVTransformer将 ECFP 指纹变换为 IRV 特征,再交给 IRV 分类器训练:
import numpy as np import deepchem as dc from deepchem.molnet import load_hiv np.random.seed(123) n_features = 512 hiv_tasks, hiv_datasets, transformers = load_hiv() train_dataset, valid_dataset, test_dataset = hiv_datasets metric = dc.metrics.Metric(dc.metrics.roc_auc_score, np.mean) transformer = dc.trans.IRVTransformer(10, len(hiv_tasks), train_dataset) train_dataset = transformer.transform(train_dataset) valid_dataset = transformer.transform(valid_dataset) model = dc.models.TensorflowMultitaskIRVClassifier( len(hiv_tasks), K=10, batch_size=50, learning_rate=0.001) model.fit(train_dataset) train_scores = model.evaluate(train_dataset, [metric], transformers) valid_scores = model.evaluate(valid_dataset, [metric], transformers) print("Train scores", train_scores) print("Validation scores", valid_scores)IRVTransformer 的原理(源码级)
IRVTransformer定义于 deepchem/trans/transformers.py,构造参数为IRVTransformer(K, n_tasks, dataset),其中K是近邻个数、dataset必须传入训练集(它充当变换时的参考库,realize方法会在其中检索近邻样本,见 transformers.py)。
其核心思想是对每个目标样本:
- 计算目标样本与参考库中所有样本的相似度,相似度定义为Jaccard 系数:两样本 ECFP 指纹交集大小 / 并集大小(见
X_transform的注释similarity = (X_target intersect X)/(X_target union X)); - 按相似度从高到低取前
K个参考样本(若最高相似度为 1,说明目标本身就在参考库中,则剔除自身取后续 K 个); - 将K 个相似度值与其对应的参考标签拼接,构成维度为
2*K的新特征。
对n_tasks个任务分别执行上述过程后,最终每个样本得到2*K*n_tasks维 IRV 特征——这正是MultitaskIRVClassifier.n_features = 2 * K * n_tasks的由来(见 deepchem/models/IRV.py)。
IRV 分类器的投票层实现
MultitaskIRVClassifier的核心是IRVLayer(deepchem/models/IRV.py),它把 IRV 特征输入一个可学习的投票层:
- 可训练参数包括投票权重
V、相似度/排名权重W以及偏置b、b2; - 对每个任务,先计算
R = sigmoid(b + W[0]*similarity + W[1]*(rank+1)),再用R加权聚合 K 个近邻的标签投票:z = sum(R * V[labels]) + b2; - 各任务输出拼接后经 sigmoid 激活得到概率,训练时叠加 L2 正则项(由
penalty参数控制,默认 0.0)。
因此 IRV 方案的特点是不需要传统意义上的"深度网络",而是以近邻相似度驱动的可解释投票机制完成分类,天然契合小样本、强不平衡的活性筛选场景。
注意:示例中的
TensorflowMultitaskIRVClassifier在当前版本已标记为deprecated,并重命名为MultitaskIRVClassifier(见 deepchem/models/IRV.py)。新代码建议直接使用dc.models.MultitaskIRVClassifier,其行为与旧名称完全一致。
六、进入 MoleculeNet 基准体系
load_hiv不仅服务于示例脚本,还被集成进 DeepChem 的 MoleculeNet 基准框架。在 deepchem/molnet/run_benchmark.py 中,hiv已注册为可用的基准数据集键,与 tox21、muv、pcba 等数据集并列,可通过统一的run_benchmark入口在相同协议下对比不同模型在该任务上的表现。
这意味着本文介绍的两种建模方式(全连接网络与 IRV 分类器)都可以放进统一的基准流程中,使用固定的 scaffold 切分与平衡变换,产出可横向对比的 ROC-AUC 结果。
七、总结与扩展建议
围绕 examples/hiv 目录,本文覆盖了 HIV 数据集从"数据背景 → 字段解析 → 加载 API → 两种建模方案 → 基准集成"的完整链路。关键要点回顾:
- HIV 任务本质是CI 非活性 vs(CA+CM)活性的二分类,正样本占比仅约 3.5%,属于强不平衡问题;
- 推荐 pipeline:
load_hiv()默认的ECFP + scaffold 切分 + balancing 变换即可直接训练; - 两个示例脚本(hiv_tf_models.py 与 hiv_irv.py)分别演示了深度全连接与 IRV 近邻投票两条技术路线,均以 ROC-AUC 评估;
- IRV 方案的实现细节(相似度定义、K 近邻选取、投票层)可在 deepchem/models/IRV.py 与 deepchem/trans/transformers.py 中逐行核对,适合作为理解"非深度表示学习"的入门范本。
如需自行复现,可直接在仓库根目录执行python examples/hiv/hiv_tf_models.py或python examples/hiv/hiv_irv.py(需安装 TensorFlow 后端)。由于load_hiv的reload默认开启,首次运行后数据集会被缓存,二次运行将显著加快。
【免费下载链接】deepchemDemocratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology项目地址: https://gitcode.com/GitHub_Trending/de/deepchem
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考