
简介本资源是一套面向计算机及相关专业本科生的课程设计与期末大作业实战项目聚焦于生物信息学交叉场景——利用知识图谱与推荐系统联合建模预测药物-靶点相互作用。项目代码完整、结构清晰涵盖数据预处理如hetionet.py、yamanishi_08.py、知识图谱构建BioKG.py、多种推荐模型实现deepdti.py、kge_rf.py、kge_nfm.py及统一训练入口train_all.py并附详细操作指南与环境配置说明Pipfile、requirements.txt、README.md。压缩包共40个文件含9个核心Python脚本、1个说明文档、1个许可证、2个隐藏系统文件.DS_Store及18个占位文件.gitkeep整体仅56KB轻量易部署。已有94人学习下载适合课程实践、项目复现与算法拓展——读者可直接运行全流程理解图谱嵌入与协同过滤在药物发现中的落地逻辑并基于现有模块快速替换模型或接入新数据源。1. 项目概述当知识图谱遇上药物发现最近几年在生物信息学和计算药物发现领域一个结合了知识图谱和推荐系统的技术路线正在悄然兴起并展现出巨大的潜力。这个项目的核心就是利用Python构建一个能够预测药物与靶点之间潜在交互关系的系统。听起来有点抽象简单来说药物研发中一个核心问题是找到能精准作用于特定疾病靶点通常是蛋白质的化合物。传统实验方法耗时耗力而计算预测方法可以快速筛选海量化合物大幅提升早期研发效率。这个项目将知识图谱和推荐系统这两个看似不相关的技术巧妙地融合在了一起。知识图谱负责组织和关联海量的生物医学实体如药物、靶点、疾病、通路及其复杂关系形成一个结构化的“知识大脑”。而推荐系统借鉴了电商平台“猜你喜欢”的逻辑从这个“大脑”中学习药物和靶点的特征以及它们之间已知的交互模式从而预测那些尚未被实验验证的、潜在的“药物-靶点”配对。对于从事生物信息学、计算化学、AI制药或者对Python数据科学在生命科学应用感兴趣的朋友来说这是一个绝佳的练手项目。它不仅涵盖了图数据处理、机器学习模型构建等通用技能更直接切入了一个高价值的垂直应用场景。接下来我将拆解整个项目的设计思路、关键技术选型并附上可直接运行的代码指南和避坑心得。2. 核心思路与技术选型解析2.1 为什么是“知识图谱 推荐系统”在药物靶点交互预测任务中我们面临的数据通常是稀疏且高维的。已知的药物-靶点交互只占所有可能组合的极小一部分这就像一个巨大的、绝大部分是空白的矩阵。传统的机器学习方法如支持向量机、随机森林直接处理这种数据效果有限因为它们难以有效利用药物和靶点背后丰富的关联信息。知识图谱的价值在于整合。我们可以从公共数据库如DrugBank、ChEMBL、UniProt中抽取药物、靶点、副作用、疾病、生物通路等信息构建一个异质信息网络。在这个网络中一个药物节点不仅通过“靶向”关系连接到靶点还可能通过“治疗”关系连接到疾病通过“参与”关系连接到通路。这些多跳的关联路径蕴含了丰富的语义信息能帮助我们更好地表征药物和靶点的特征。推荐系统则提供了完美的建模框架。我们可以将药物视为“用户”靶点视为“物品”已知的药物-靶点交互视为“用户-物品”的评分或点击行为。这样问题就转化为了一个经典的推荐问题基于已有的交互记录和丰富的辅助信息来自知识图谱预测一个“用户”药物可能会对哪些“物品”靶点感兴趣产生相互作用。这种结合方式的优势显而易见它既利用了知识图谱的结构化语义信息来增强特征表示又借鉴了推荐系统在解决稀疏矩阵预测问题上的成熟算法框架。2.2 技术栈选型与考量一个完整的项目离不开稳定、高效的工具链。以下是经过多个项目验证后的选型方案及其背后的理由图数据库Neo4j理由Neo4j是原生图数据库的标杆其Cypher查询语言非常直观特别适合表达知识图谱中的路径查询和关系遍历。对于构建和探索中等规模的生物医学知识图谱来说它比基于关系型数据库的解决方案更自然、性能更好。社区版对于学习和原型开发完全够用。替代方案如果需要处理超大规模图谱或深度集成到Python机器学习流水线中可以考虑NetworkX纯Python库适合内存计算或DGL/PyG图神经网络框架内置的图数据结构。但Neo4j在数据持久化和复杂查询方面仍有优势。Python 数据处理与分析Pandas, NumPy理由这是Python数据科学生态的基础。Pandas用于表格数据的清洗、整合和特征工程其DataFrame结构与我们从数据库导出或从文件读取的数据格式天然契合。NumPy提供高效的数值计算基础。机器学习与深度学习Scikit-learn, PyTorch (或 TensorFlow), DGL/PyGScikit-learn用于实现传统的推荐算法如矩阵分解或作为基线模型以及进行数据预处理标准化、划分数据集和评估。PyTorch/TensorFlow当我们需要使用深度学习模型特别是图神经网络时这两个框架是首选。PyTorch因其动态图和清晰的API在研究中更受欢迎。DGL (Deep Graph Library) 或 PyG (PyTorch Geometric)这是构建图神经网络模型的核心。它们封装了常见的图卷积层、采样器和训练流程能极大降低开发复杂度。两者皆可本项目示例将使用PyG因其与PyTorch集成更紧密。知识图谱构建与访问py2neo, neo4j Python Driver理由py2neo是一个高级别的OGM对象-图映射库可以用Python类的方式来操作Neo4j中的节点和关系编写代码更符合Pythonic风格。而官方的neo4j驱动则提供更底层的控制。通常使用py2neo进行快速开发更为便捷。可视化与评估Matplotlib, Seaborn理由用于绘制模型训练损失曲线、评估指标如ROC-AUC曲线、PR曲线以及知识图谱的子图可视化帮助直观理解模型性能和数据结构。注意环境配置是第一步也是容易踩坑的地方。强烈建议使用conda或venv创建独立的Python虚拟环境然后使用pip安装上述包。特别注意torch和torch-geometricPyG的版本需要严格匹配你的CUDA版本如果使用GPU和Python版本。最好参照PyG官方文档的安装指令而不是直接pip install。3. 知识图谱构建从原始数据到关联网络3.1 数据源获取与预处理构建知识图谱的第一步是获取高质量的数据。对于药物靶点预测以下几个公开数据库是黄金标准DrugBank包含大量药物的详细信息包括化学结构、靶点、适应症、副作用等。我们需要其drug_target_interactions数据。ChEMBL一个大型的生物活性数据库包含药物样分子及其对生物靶点的活性数据。是获取药物-靶点交互对的重要来源。UniProt蛋白质序列和功能信息数据库。我们需要获取靶点蛋白的序列、功能注释等信息。CTD (Comparative Toxicogenomics Database)或DisGeNET提供疾病与基因/靶点之间的关联信息。实操步骤下载数据访问上述数据库官网下载所需的数据文件通常是TSV或CSV格式。例如从DrugBank下载drug_target_interactions.csv从ChEMBL通过其API或数据文件获取活性数据。数据清洗统一标识符这是最关键的一步。不同数据库使用不同的ID系统如DrugBank ID, ChEMBL ID, UniProt ID, PubChem CID。需要使用映射文件或在线服务如biothings客户端将药物和靶点的ID统一到我们知识图谱采用的ID体系例如药物用DrugBank ID靶点用UniProt ID。处理缺失值与异常值删除关键字段如药物ID、靶点ID缺失的记录。对于活性数据如Ki, IC50需要处理不同单位并过滤掉可信度低的记录。关系定义明确我们要构建哪些类型的关系。例如Drug-[:TARGETS]-Protein,Drug-[:TREATS]-Disease,Protein-[:ASSOCIATED_WITH]-Disease,Protein-[:PART_OF]-Pathway。构建节点和关系表将清洗后的数据整理成两个核心的CSV文件nodes.csv: 包含所有实体的ID、类型Drug, Protein, Disease, Pathway和属性如药物名称、蛋白序列、疾病名称。relationships.csv: 包含关系的起始节点ID、关系类型、终止节点ID以及可能的属性如相互作用的活性值、证据来源。3.2 使用Neo4j构建与填充图谱有了结构化的数据文件我们就可以将其导入Neo4j。使用Cypher的LOAD CSV指令适用于初始构建// 首先创建约束确保ID唯一并加速查询 CREATE CONSTRAINT ON (d:Drug) ASSERT d.drugbank_id IS UNIQUE; CREATE CONSTRAINT ON (p:Protein) ASSERT p.uniprot_id IS UNIQUE; CREATE CONSTRAINT ON (dis:Disease) ASSERT dis.disease_id IS UNIQUE; // 导入药物节点 LOAD CSV WITH HEADERS FROM file:///nodes_drug.csv AS row CREATE (:Drug {drugbank_id: row.drugbank_id, name: row.name, smiles: row.smiles}); // 导入蛋白质节点 LOAD CSV WITH HEADERS FROM file:///nodes_protein.csv AS row CREATE (:Protein {uniprot_id: row.uniprot_id, name: row.name, sequence: row.sequence}); // 导入药物-靶点关系 LOAD CSV WITH HEADERS FROM file:///rels_drug_target.csv AS row MATCH (d:Drug {drugbank_id: row.drugbank_id}) MATCH (p:Protein {uniprot_id: row.uniprot_id}) CREATE (d)-[:TARGETS {activity: row.activity, source: row.source}]-(p);使用Python (py2neo) 进行动态操作适用于增量更新或复杂逻辑from py2neo import Graph, Node, Relationship # 连接Neo4j数据库 graph Graph(bolt://localhost:7687, auth(neo4j, your_password)) # 创建节点 def create_drug_node(drug_id, name): drug Node(Drug, drugbank_iddrug_id, namename) graph.create(drug) return drug # 创建关系 def create_targets_relationship(drug_node, protein_node, activity): rel Relationship(drug_node, TARGETS, protein_node, activityactivity) graph.create(rel) # 示例批量导入需结合pandas读取数据 import pandas as pd df_interactions pd.read_csv(drug_target_interactions.csv) for _, row in df_interactions.iterrows(): # 这里假设节点已存在实际中需要先检查或创建 drug graph.nodes.match(Drug, drugbank_idrow[drug_id]).first() protein graph.nodes.match(Protein, uniprot_idrow[protein_id]).first() if drug and protein: create_targets_relationship(drug, protein, row[activity])实操心得在首次构建大规模图谱时LOAD CSV的性能远优于通过驱动逐条插入。建议先通过LOAD CSV完成主体数据导入再使用Python驱动进行小规模的、需要复杂业务逻辑的更新操作。另外务必为高频查询的属性如ID创建索引这能带来数量级的查询性能提升。4. 图特征提取与推荐问题建模4.1 从知识图谱中提取节点特征知识图谱本身是丰富的但机器学习模型需要数值型的特征向量。我们需要为每个药物节点和靶点节点提取特征。1. 基于元路径的特征传统方法元路径是定义在异质图上的一种连接模式如Drug-TARGETS-Protein-TARGETS-Drug表示“共享相同靶点的两种药物”。我们可以统计每个节点对之间满足特定元路径的实例数量形成一个巨大的特征矩阵。这种方法能捕获高阶的语义关联但特征维度可能爆炸且需要人工设计有意义的元路径。2. 基于图嵌入的特征现代方法使用图嵌入算法如Node2Vec, TransE, RotatE将图中的每个节点映射到一个低维、稠密的向量空间中使得图中相似的节点结构相似或语义相似在向量空间中也接近。# 使用Node2Vec示例 (需要先安装 node2vec 包) from node2vec import Node2Vec import networkx as nx # 首先从Neo4j中抽取一个子图或全图转换为NetworkX格式这里简化表示 # 假设我们有一个包含药物和靶点的二部图列表 edges G nx.Graph() G.add_edges_from(edges) # edges [(Drug_A, Protein_X), ...] # 生成随机游走序列 node2vec Node2Vec(G, dimensions128, walk_length30, num_walks200, workers4) # 训练嵌入模型 model node2vec.fit(window10, min_count1, batch_words4) # 获取药物‘DB001’的嵌入向量 drug_embedding model.wv[DB001]这种方法自动化程度高能捕获复杂的网络结构生成的向量可以直接作为机器学习模型的输入特征。3. 基于属性信息的特征药物可以从SMILES字符串计算分子描述符使用RDKit库如分子量、脂水分配系数(logP)、氢键供体/受体数等。这些是药物的固有化学特征。靶点可以从蛋白质序列计算氨基酸组成、理化性质或使用预训练的蛋白质语言模型如ESM来获取序列的语义嵌入。4.2 构建推荐系统任务的数据集我们将预测任务形式化为一个二分类问题对于任意一个药物-靶点对预测它们是否会发生相互作用1或不发生0。正样本来自知识图谱中已知的TARGETS关系。负样本这是关键。我们不能简单地将所有未知对都视为负样本因为其中可能存在尚未发现的真实交互。通常采用以下策略随机负采样在所有未知的药物-靶点对中随机抽取一部分作为负样本。确保数量与正样本大致平衡。基于度的负采样更科学的方法是倾向于选择那些在图中都不太“活跃”连接度低的药物和靶点组成的对作为负样本因为高度节点之间未知的连接更有可能是真正的负例。构建特征矩阵X和标签y对于每个药物-靶点对(d_i, p_j)其特征向量x_ij可以是拼接特征concat( drug_embedding_i, protein_embedding_j )交互特征在拼接的基础上额外加入药物和靶点特征的逐元素乘积、差值等以显式地建模交互作用。 标签y_ij为1已知交互或0负样本。import pandas as pd import numpy as np from sklearn.model_selection import train_test_split # 假设我们有 DataFrames: drug_features, protein_features # 和列表: positive_pairs [(drug_id, protein_id)], negative_pairs [(drug_id, protein_id)] def create_dataset(positive_pairs, negative_pairs, drug_feat_dict, protein_feat_dict): X, y [], [] for d_id, p_id in positive_pairs: # 拼接特征 feat np.concatenate([drug_feat_dict[d_id], protein_feat_dict[p_id]]) X.append(feat) y.append(1) for d_id, p_id in negative_pairs: feat np.concatenate([drug_feat_dict[d_id], protein_feat_dict[p_id]]) X.append(feat) y.append(0) return np.array(X), np.array(y) X, y create_dataset(positive_pairs, negative_pairs, drug_embeddings, protein_embeddings) # 划分训练集、验证集、测试集 X_train, X_temp, y_train, y_temp train_test_split(X, y, test_size0.3, random_state42) X_val, X_test, y_val, y_test train_test_split(X_temp, y_temp, test_size0.5, random_state42)5. 模型构建从经典矩阵分解到图神经网络5.1 基线模型逻辑回归与矩阵分解在尝试复杂模型前建立基线模型至关重要。逻辑回归 (Logistic Regression):直接将拼接后的特征向量输入逻辑回归模型。这是一个简单的线性模型用于检验特征本身是否具有区分能力。from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_auc_score, average_precision_score lr_model LogisticRegression(max_iter1000, class_weightbalanced) lr_model.fit(X_train, y_train) y_pred_proba_lr lr_model.predict_proba(X_test)[:, 1] auroc_lr roc_auc_score(y_test, y_pred_proba_lr) auprc_lr average_precision_score(y_test, y_pred_proba_lr) print(fLR - AUROC: {auroc_lr:.4f}, AUPRC: {auprc_lr:.4f})矩阵分解 (Matrix Factorization, MF):这是协同过滤的经典方法。我们将药物-靶点交互矩阵R(m个药物 x n个靶点) 分解为两个低维矩阵的乘积R ≈ P * Q^T。其中P是药物隐因子矩阵Q是靶点隐因子矩阵。我们可以使用surprise库或implicit库适用于隐式反馈快速实现。# 使用implicit库示例 (适用于隐式交互即0/1数据) import implicit from scipy.sparse import csr_matrix # 构建交互矩阵 interaction_matrix csr_matrix((m, n)) # m药物n靶点 # ... 填充矩阵已知交互的位置为1 # 训练ALS模型 model implicit.als.AlternatingLeastSquares(factors64, iterations20, regularization0.01) model.fit(interaction_matrix) # 获取药物和靶点的隐因子 drug_factors model.user_factors target_factors model.item_factors # 预测药物i对靶点j的交互分数 score np.dot(drug_factors[i], target_factors[j])矩阵分解的优势在于它直接学习药物和靶点的低维表示但缺点是无法融入知识图谱中丰富的边信息和节点属性。5.2 进阶模型图神经网络 (GNN) 推荐模型这是当前的主流方法。我们直接在构建的知识图谱上运行GNN让节点通过消息传递聚合邻居信息学习得到融合了图结构上下文的节点表示。然后利用药物和靶点的表示进行预测。模型架构 (以PyG实现为例)我们通常采用一种称为“链路预测”的架构。首先用GNN编码器为所有节点生成嵌入然后对于给定的药物-靶点对通过一个解码器如点积、神经网络基于两者的嵌入预测交互概率。import torch import torch.nn.functional as F from torch_geometric.nn import GCNConv, SAGEConv, GATConv from torch_geometric.data import Data # 1. 构建PyG Data对象 # edge_index: 图的边列表形状为[2, num_edges] # x: 节点的初始特征可以是one-hot也可以是预计算的属性特征 # edge_type: (可选) 如果有多类关系需要提供关系类型 data Data(xnode_features, edge_indexedge_index, edge_typeedge_type) # 2. 定义GNN编码器 class GNNEncoder(torch.nn.Module): def __init__(self, in_channels, hidden_channels, out_channels, num_relationsNone): super().__init__() # 如果是异构图可能需要RGCN等模型。这里以同构图GCN为例。 self.conv1 GCNConv(in_channels, hidden_channels) self.conv2 GCNConv(hidden_channels, out_channels) self.dropout torch.nn.Dropout(0.5) def forward(self, x, edge_index): x self.conv1(x, edge_index) x F.relu(x) x self.dropout(x) x self.conv2(x, edge_index) return x # 返回所有节点的最终嵌入 # 3. 定义解码器预测头 class Decoder(torch.nn.Module): def __init__(self, in_channels): super().__init__() # 一个简单的双线性解码器 self.bilinear torch.nn.Bilinear(in_channels, in_channels, 1) # 或者使用MLP # self.mlp torch.nn.Sequential( # torch.nn.Linear(2*in_channels, 256), # torch.nn.ReLU(), # torch.nn.Dropout(0.3), # torch.nn.Linear(256, 1) # ) def forward(self, z_drug, z_target): # 双线性交互 score self.bilinear(z_drug, z_target).squeeze() # 或者使用MLP: score self.mlp(torch.cat([z_drug, z_target], dim-1)).squeeze() return torch.sigmoid(score) # 输出概率 # 4. 组合成完整模型 class DrugTargetGNN(torch.nn.Module): def __init__(self, encoder, decoder): super().__init__() self.encoder encoder self.decoder decoder def forward(self, x, edge_index, drug_idx, target_idx): z self.encoder(x, edge_index) # 编码所有节点 z_drug z[drug_idx] # 取出药物节点嵌入 z_target z[target_idx] # 取出靶点节点嵌入 return self.decoder(z_drug, z_target) # 5. 训练循环 model DrugTargetGNN(encoder, decoder) optimizer torch.optim.Adam(model.parameters(), lr0.001) criterion torch.nn.BCELoss() for epoch in range(200): model.train() optimizer.zero_grad() # 获取一个batch的药物-靶点对及其标签 pred model(data.x, data.edge_index, train_drug_idx, train_target_idx) loss criterion(pred, train_labels.float()) loss.backward() optimizer.step() # ... 在验证集上评估 ...注意事项GNN训练中负采样策略非常关键。由于图中正边很少我们需要在每个epoch动态地为每个正边采样若干负边。这可以通过在训练循环中随机选择不存在连接的药物-靶点对来实现。此外对于大规模图需要使用邻居采样NeighborSampling等技术PyG的NeighborLoader可以方便地实现。6. 模型评估、优化与部署思考6.1 评估指标与交叉验证药物靶点预测本质是一个极度不平衡的二分类问题负样本远多于正样本因此不能只看准确率。核心评估指标AUROC (Area Under the ROC Curve)反映模型在不同阈值下区分正负样本的整体能力对类别不平衡相对不敏感是首要指标。AUPRC (Area Under the Precision-Recall Curve)在不平衡数据集中比AUROC更具信息量因为它更关注正样本我们感兴趣的交互的查全率和查准率。Top-k Hit Rate对于给定的药物预测其最可能交互的k个靶点看真实靶点是否在其中。这模拟了实际研发中“为药物推荐前k个候选靶点”的场景。交叉验证策略不能进行简单的随机划分因为同一个药物或靶点出现在训练集和测试集会导致数据泄露。应采用按药物划分将所有药物分成k折确保测试集中的药物在训练集中完全未出现。这评估模型对新药物的泛化能力。按靶点划分同理评估对新靶点的预测能力。按药物-靶点对划分严格同时确保测试集中的药物和靶点都未在训练集中同时出现但可以单独出现过。6.2 模型优化与集成特征融合不要只依赖图嵌入。尝试将GNN学习到的表示与药物/靶点的属性特征分子描述符、蛋白序列特征进行融合例如在解码器输入前进行拼接。注意力机制在GNN层使用GAT图注意力网络让节点在聚合邻居信息时关注更重要的邻居。在解码器部分也可以引入注意力来加权不同特征维度。多任务学习如果知识图谱中还有其他关系如药物-疾病、靶点-通路可以设计多任务学习框架让模型同时预测多种关系共享底层表示可能提升主任务的性能。模型集成将逻辑回归、矩阵分解、GNN等不同模型的预测结果进行加权平均或堆叠Stacking往往能获得更稳定、更优的性能。6.3 从实验到潜在应用一个训练好的模型可以用于新药靶点预测输入一个全新的药物分子需先计算其特征并映射到图谱中或作为孤立节点加入模型可以输出其与所有已知靶点的潜在交互概率排序列表。老药新用输入一个已上市药物预测其可能作用于的新靶点为药物重定位提供计算依据。靶点成药性分析输入一个新靶点预测哪些已有化合物或药物库中的分子可能与之作用。部署考量 对于研究环境可以将训练好的模型保存为pytorch或ONNX格式并封装一个简单的Flask或FastAPI服务提供预测接口。对于需要实时从知识图谱中查询信息的场景可以将模型与Neo4j数据库服务结合构建一个端到端的预测流水线。7. 常见问题与排查技巧实录在实际操作这个项目时你几乎一定会遇到下面这些问题。这里记录了我的排查思路和解决方案。问题1Neo4j导入数据速度极慢。排查检查是否使用了逐条插入的CREATE语句在循环中执行。解决批量操作使用LOAD CSV进行初始导入。使用UNWIND在Cypher中将多组参数组成列表用UNWIND展开后批量执行。创建索引在导入前就为节点标签和关键属性创建索引和约束这能极大提升MATCH速度。调整配置在neo4j.conf中适当增加dbms.memory.heap.initial_size和dbms.memory.heap.max_size并确保dbms.memory.pagecache.size足够大。问题2图神经网络训练时内存溢出OOM。排查图数据太大无法全部加载到GPU内存。解决邻居采样使用PyG的NeighborLoader进行小批量训练每个批次只加载目标节点及其若干跳内的邻居子图。简化模型减少GNN层数通常2-3层足够和隐藏层维度。使用CPU训练如果GPU内存不足可以尝试在CPU上训练虽然慢但可能可行。图压缩考虑是否可以先使用图嵌入方法如Node2Vec离线生成节点特征然后使用这些特征进行简单的MLP训练避开直接处理大图。问题3模型性能不佳AUROC一直徘徊在0.5左右随机猜测水平。排查数据泄露检查数据划分方式确保没有信息从训练集泄露到测试集。负样本质量问题随机采样的负样本中可能包含大量未知的正样本假负例污染了训练集。尝试使用更严格的负采样策略如只采样那些在图中距离很远的节点对。特征无效检查提取的图嵌入或属性特征是否具有区分度。可以单独用逻辑回归测试一下特征的效果。模型复杂度不足或过拟合检查训练和验证集的损失曲线。如果训练损失不下降可能是模型太简单或学习率不对。如果训练损失下降但验证损失上升是过拟合需要增加Dropout、正则化或减少模型参数。解决从最简单的逻辑回归模型开始确保流程和评估无误。然后逐步增加模型复杂度并仔细监控每一步的性能变化。问题4如何为全新的、不在知识图谱中的药物或靶点进行预测分析这是冷启动问题。GNN无法直接为未见过的节点生成嵌入。解决思路利用属性特征如果新节点有丰富的属性特征如药物的SMILES、靶点的序列可以训练一个单独的编码器如MLP将这些属性映射到与GNN嵌入对齐的同一空间。然后使用这个编码器为新节点生成“伪嵌入”再输入解码器进行预测。归纳式学习使用GraphSAGE等归纳式图神经网络它们学习的是聚合邻居特征的函数而不是为每个节点学习固定嵌入因此理论上可以泛化到新节点。这个项目从数据准备到模型部署链条较长每一步都需要耐心调试。最大的收获往往不是在最终指标上提升几个百分点而是在解决一个个具体问题的过程中对知识图谱、推荐系统、图神经网络以及生物医学数据本身的理解不断加深。建议从一个小的、干净的子数据集开始快速跑通整个流程再逐步扩展数据和模型复杂度。本文还有配套的精品资源点击获取