1. 项目概述当机器学习遇上个性化基因网络在癌症研究的战场上转移预测一直是个“硬骨头”。传统的预测模型往往聚焦于单一癌种用一个“通用”的模型去套所有患者这就像试图用同一把钥匙打开所有不同结构的锁效果自然有限。更关键的是它们常常忽略了每个患者体内那套独一无二、动态变化的基因调控“电路图”——基因调控网络GRN。这导致模型缺乏个性化洞察难以在精准医疗中发挥决定性作用。最近我们团队完成了一项探索性研究尝试用两条腿走路来解决这个问题。一方面我们评估了XGBoost、随机森林等经典机器学习模型在泛癌种转移预测上的表现看看这些相对“轻量级”的工具能否在资源有限的医疗场景下担当起高效初筛的重任。另一方面我们向前迈了一步利用PANDA和LIONESS算法为每个患者样本构建了其专属的、个性化的基因调控网络并首次尝试将这种动态网络结构喂给图神经网络看看能否从网络的拓扑模式中捕捉到那些隐藏在基因表达背后的、与转移相关的更深层规律。简单来说我们想回答两个核心问题第一基于基因表达的机器学习模型其预测能力到底如何是否具备在基层推广的潜力第二如果我们为每个患者都画一张独特的基因调控“地图”图神经网络能从这些地图的“山川河流”拓扑结构中读出关于转移风险的独特信息吗这项工作的意义不仅在于技术方法的比较更在于为未来癌症诊疗提供了一种分层思路用高效、低成本的ML模型进行大规模初筛再对高风险或复杂病例启用更精细的个性化网络分析从而实现医疗资源的优化配置。2. 核心思路与方案设计解析我们的研究设计遵循一个清晰的逻辑从数据到特征从静态模型到动态网络最后进行综合评估。整个流程可以看作一次“人机协同”的侦察任务目标是找出指示癌症转移的分子信号。2.1 数据基石CCLE与DoRothEA任何数据分析的生命线都在于数据质量。我们选择了癌症细胞系百科全书的基因表达数据作为主要战场。CCLE的优势在于其规模和质量可控包含了大量经过注释的癌细胞系涵盖了多种癌症类型非常适合进行泛癌种的方法学评估。每个样本都被标记了“原发性”或“转移性”状态这就是我们要预测的标签。然而基因表达数据是高维且嘈杂的。直接使用上万个基因作为特征无异于大海捞针且极易导致模型过拟合。因此特征选择是关键第一步。我们采用了非参数的Kruskal-Wallis检验而非常用的t检验这是因为基因表达数据常常不服从正态分布。Kruskal检验通过比较不同组别原发 vs. 转移的秩和能更稳健地识别出在表达水平上存在显著差异的基因。我们分别选取了统计显著性排名前100、200、500和1000的基因构成四个特征子集以观察模型性能随特征数量变化的趋势。注意这里有一个重要的实操考量。我们最初的数据集是高度不平衡的原发样本远多于转移样本。如果直接用这样的数据训练模型会倾向于预测多数类导致对转移样本的识别能力极差。因此我们构建了一个平衡数据集使两类样本数量相等。这是处理类别不平衡问题的经典策略能确保模型平等地学习两类特征尽管这可能会在一定程度上牺牲模型在真实世界不平衡分布下的泛化能力但对于方法学的公平比较至关重要。为了构建个性化的基因调控网络我们还需要一份“电路图”的蓝图。这就是从DoRothEA数据库获取的转录因子-靶基因先验互作网络。这份蓝图告诉我们哪些转录因子TF可能调控哪些靶基因。为了聚焦于转移相关过程我们从中筛选了9个已被文献广泛证实与癌症转移密切相关的核心转录因子包括TP53、MYC、STAT3等。它们像是调控网络中的关键“枢纽”控制着细胞侵袭、迁移、上皮-间质转化等转移核心程序。2.2 双轨制分析框架设计我们的核心创新在于设计了一个并行的双轨制分析框架而不是单一模型的黑箱。轨道一基于表达的机器学习基准线。这条轨道旨在回答“用现有成熟技术我们能做多好”的问题。我们选择了三种具有代表性且在不同场景下表现稳健的机器学习模型ElasticNet一种线性模型结合了L1和L2正则化。L1正则化Lasso能产生稀疏解自动进行特征选择从成千上万个基因中筛选出最重要的那些。L2正则化Ridge能防止系数过大提升模型稳定性。它适合处理高维数据且结果具有一定的可解释性。随机森林一种基于Bagging的集成学习算法。它通过构建大量决策树并综合它们的投票结果来做出预测。其优势在于能捕捉复杂的非线性关系和基因间的交互作用对噪声和过拟合有较好的鲁棒性还能提供特征重要性排序。XGBoost一种基于Gradient Boosting的集成学习算法。它以前向分步的方式构建决策树每一棵树都致力于纠正前一棵树的残差。XGBoost在处理稀疏数据、缺失值以及计算效率方面表现优异近年来在各类数据科学竞赛中独占鳌头。选择这三者是为了覆盖从线性到非线性、从简单可解释到复杂高性能的模型光谱确保评估的全面性。轨道二基于个性化网络的图神经网络探索。这条轨道旨在探索“如果我们考虑每个患者独特的调控网络结构能否获得额外信息”。其核心步骤是构建共识网络使用PANDA算法将基因表达数据与TF-靶基因先验网络进行整合。PANDA通过一种类似“消息传递”的迭代算法计算出一个反映所有样本平均调控关系的共识网络。它巧妙地将TF协同性、基因共表达等信息融合得到比单纯共表达网络更可靠的调控强度估计。解构为个性化网络这是关键一步。我们使用LIONESS算法对上述共识网络进行“反卷积”。LIONESS的基本思想很直观比较使用全部样本构建的网络与移除了某个特定样本后构建的网络其间的差异就反映了该样本对整体网络的“贡献”从而推导出该样本特有的调控网络。这样每个患者都拥有了一张独一无二的基因调控“指纹图”。图神经网络建模我们将这些个性化网络输入一个图注意力网络v2模型。图中的节点是基因节点特征包括其在该样本中的标准化表达值、节点度连接数、中介中心性在网络中的枢纽作用以及节点类型是TF、靶基因还是二者皆是。边权重代表PANDA/LIONESS计算出的调控强度。GATv2模型能够学习如何根据节点特征和边权重动态地聚合邻居信息从而捕捉网络局部拓扑模式中可能与转移状态相关的信号。2.3 评估策略与可解释性追求我们不仅关心模型预测得准不准更关心“为什么”以及“是否可靠”。核心评估指标我们主要使用AUROC和马修斯相关系数。AUROC衡量模型在不同阈值下区分两类样本的整体能力是生物医学分类的黄金标准。MCC则综合考虑了真阳性、真阴性、假阳性、假阴性在类别衡的数据集上能给出一个更全面的单一分数其值在-1到1之间0代表随机猜测。可解释性分析为了理解模型决策的依据我们进行了两方面的探索对ML模型我们对输入的特征基因集进行了主成分分析。如果PCA降维后的二维图上原发和转移样本本身就混在一起难以区分那么任何模型要达到高精度都会非常困难。PCA结果为我们理解模型性能的上限提供了直观参考。对GNN模型我们计算了每个个性化网络的一系列图级统计量如聚类系数、边数、三角形数量等并可视化比较了不同转移状态样本的这些统计量分布。如果GNN能学到东西那么它捕捉到的模式应该超越这些简单的全局统计量所能揭示的差异。稳健性检验我们通过改变数据划分的随机种子重复训练和评估最佳模型多次观察AUROC的波动范围。这能检验模型的性能是偶然得来的还是具有可重复的稳定性。3. 实操过程从数据到模型的完整实现理论框架搭建好后真正的挑战在于落地实现。下面我将拆解关键步骤分享其中的实操要点和踩过的坑。3.1 数据预处理与特征工程实战拿到CCLE的表达矩阵和样本元数据后第一步是“对齐”。我们需要确保每个样本的表达谱与其转移状态标签正确对应。这里常用pandas进行合并操作但要特别注意样本ID的格式和唯一性一个字符的差异就可能导致大量样本匹配失败。import pandas as pd import numpy as np # 假设 expression_df 是基因表达矩阵行为样本列为基因 # metadata_df 是样本元数据包含‘sample_id’和‘metastasis_status’列 expression_df pd.read_csv(ccle_expression.csv, index_col0) metadata_df pd.read_csv(ccle_metadata.csv) # 确保索引和列名一致并进行合并 # 首先将表达矩阵的索引样本ID重置为列便于合并 expression_df_reset expression_df.reset_index().rename(columns{index: sample_id}) merged_df pd.merge(expression_df_reset, metadata_df[[sample_id, metastasis_status]], onsample_id, howinner) # 分离特征和标签 X merged_df.drop([sample_id, metastasis_status], axis1).values y (merged_df[metastasis_status] metastatic).astype(int).values # 转换为二分类标签 0/1接下来是处理类别不平衡。我们采用了最简单的下采样策略即随机从多数的原发样本中抽取与转移样本同等数量的样本构成平衡数据集。虽然SMOTE等过采样技术也很流行但在基因表达这种高维数据上生成有意义的合成样本难度较大且容易引入噪声。下采样虽然损失了部分数据但能保证两类样本分布一致对于初步的方法比较更为稳妥。from sklearn.utils import resample # 假设 metastatic_indices 和 primary_indices 是两类样本的索引 primary_downsampled resample(primary_indices, replaceFalse, # 不放回抽样 n_sampleslen(metastatic_indices), random_state42) # 合并下采样后的原发样本和所有转移样本 balanced_indices np.concatenate([primary_downsampled, metastatic_indices]) X_balanced X[balanced_indices] y_balanced y[balanced_indices]特征选择使用scipy实现Kruskal-Wallis检验。这里的关键是理解kruskal函数返回的p值我们需要对其按升序排序并选取排名靠前的基因。from scipy import stats # 分别获取两类样本的表达数据 X_primary X[y 0] X_metastatic X[y 1] p_values [] for gene_idx in range(X.shape[1]): stat, p stats.kruskal(X_primary[:, gene_idx], X_metastatic[:, gene_idx]) p_values.append(p) # 获取p值最小的前N个基因的索引 top_n 1000 top_gene_indices np.argsort(p_values)[:top_n] X_top X_balanced[:, top_gene_indices]3.2 机器学习模型的训练与调优我们使用scikit-learn和xgboost库进行模型训练。一个重要的最佳实践是始终使用交叉验证来调整超参数并在一个独立的测试集上报告最终性能避免数据泄露。from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.ensemble import RandomForestClassifier from sklearn.linear_model import ElasticNet import xgboost as xgb from sklearn.metrics import roc_auc_score, matthews_corrcoef # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split(X_top, y_balanced, test_size0.2, stratifyy_balanced, random_state42) # 以XGBoost为例进行超参数网格搜索 param_grid { max_depth: [3, 5, 7], learning_rate: [0.01, 0.1, 0.2], n_estimators: [100, 200], subsample: [0.8, 1.0], colsample_bytree: [0.8, 1.0] } xgb_clf xgb.XGBClassifier(objectivebinary:logistic, eval_metriclogloss, use_label_encoderFalse) grid_search GridSearchCV(estimatorxgb_clf, param_gridparam_grid, cv5, scoringroc_auc, n_jobs-1) grid_search.fit(X_train, y_train) best_model grid_search.best_estimator_ y_pred_proba best_model.predict_proba(X_test)[:, 1] y_pred best_model.predict(X_test) auc roc_auc_score(y_test, y_pred_proba) mcc matthews_corrcoef(y_test, y_pred) print(fBest XGBoost AUC: {auc:.4f}, MCC: {mcc:.4f})实操心得对于XGBoostmax_depth不宜设置过大通常3-7足矣防止过拟合。learning_rate学习率是一个关键参数较小的值如0.01-0.1配合更多的树n_estimators通常能获得更好的性能但训练时间会增长。subsample和colsample_bytree是随机森林思想的体现能进一步提升模型的泛化能力。在资源有限的情况下可以先用默认参数或一个较小的网格进行快速实验锁定性能最好的特征集如前1000个基因后再对该特征集上的最佳模型进行更精细的调优。3.3 个性化网络构建与GNN实现详解这是整个项目中最具挑战性的部分涉及多个生物信息学工具和深度学习框架的串联。第一步用PANDA构建共识网络。我们使用了pypanda这个Python包。它的输入需要三个矩阵TF-靶基因先验矩阵P、TF-样本表达矩阵E、靶基因-样本表达矩阵M。其中TF和靶基因的表达矩阵需要从总的表达矩阵中根据先验网络提取出来。# 假设已准备好三个numpy数组TF_expression (n_TFs x n_samples), target_expression (n_genes x n_samples), prior_matrix (n_TFs x n_genes) import pypanda as pp # 运行PANDA算法 panda_obj pp.Panda(TF_expression, target_expression, prior_matrix, save_tmpFalse, remove_missingFalse) # 获取最终的调控网络矩阵 (TF x 基因) consensus_network panda_obj.panda_network第二步用LIONESS推导样本特异性网络。pypanda也集成了LIONESS算法。这一步计算量较大因为需要为每个样本重新计算一次移除了该样本后的网络。# 使用LIONESS计算每个样本的网络 lioness_obj pp.Lioness(panda_obj, save_dirlioness_nets, save_fmtnpy) # lioness_obj 会包含所有样本的网络可以通过索引访问 sample_specific_networks lioness_obj.export_lioness_results # 这可能是一个字典或列表第三步构建PyG图数据对象。我们需要将每个样本的网络一个TF x 基因的权重矩阵转换为PyTorch GeometricPyG库能处理的图数据。这里需要定义节点特征和边索引。import torch from torch_geometric.data import Data import networkx as nx def network_to_pyg_data(weight_matrix, tf_names, gene_names, sample_expression_vector): 将权重矩阵转换为PyG Data对象。 weight_matrix: numpy array, shape (n_TFs, n_genes) TF-基因调控权重。 sample_expression_vector: numpy array, shape (n_TFs n_genes,) 该样本所有TF和基因的表达值。 n_tfs len(tf_names) n_genes len(gene_names) all_nodes list(tf_names) list(gene_names) # 1. 构建边索引和边权重 edge_index [] edge_attr [] # 我们只保留权重绝对值大于某个阈值的边以简化图结构例如阈值0.1 threshold 0.1 for i, tf in enumerate(tf_names): for j, gene in enumerate(gene_names): weight weight_matrix[i, j] if abs(weight) threshold: # 添加从TF节点到靶基因节点的有向边 src_idx all_nodes.index(tf) tgt_idx all_nodes.index(gene) edge_index.append([src_idx, tgt_idx]) edge_attr.append([weight]) # 边特征可以是权重 edge_index torch.tensor(edge_index, dtypetorch.long).t().contiguous() edge_attr torch.tensor(edge_attr, dtypetorch.float) # 2. 构建节点特征 node_features [] for node in all_nodes: # 特征1: 节点度 (需要在构建的图中计算这里简化实际需用networkx计算) # 特征2: 中介中心性 (计算量大可后续添加或省略) # 特征3: 标准化后的基因表达值 (已提供) expr_val sample_expression_vector[all_nodes.index(node)] # 特征4: 节点类型 (0: TF, 1: 靶基因, 2: 既是TF又是靶基因) node_type 0 if node in tf_names else 1 if node in tf_names and node in gene_names: # 既是TF又是靶基因自调控或存在于先验网络中 node_type 2 # 这里我们先用表达值和节点类型作为简单特征 node_features.append([expr_val, node_type]) x torch.tensor(node_features, dtypetorch.float) # 3. 图标签 (该样本的转移状态) y torch.tensor([sample_label], dtypetorch.long) data Data(xx, edge_indexedge_index, edge_attredge_attr, yy) return data第四步定义并训练GATv2模型。我们使用PyG中实现的GATv2卷积层。import torch.nn as nn import torch.nn.functional as F from torch_geometric.nn import GATv2Conv, global_mean_pool class GATv2MetastasisPredictor(nn.Module): def __init__(self, in_channels, hidden_channels, out_channels, heads4, dropout0.2): super().__init__() self.conv1 GATv2Conv(in_channels, hidden_channels, headsheads, dropoutdropout, edge_dim1) # 注意conv1的输出维度是 hidden_channels * heads self.conv2 GATv2Conv(hidden_channels * heads, hidden_channels, heads1, dropoutdropout, edge_dim1, concatFalse) self.lin nn.Linear(hidden_channels, out_channels) self.dropout dropout def forward(self, data): x, edge_index, edge_attr, batch data.x, data.edge_index, data.edge_attr, data.batch x F.elu(self.conv1(x, edge_index, edge_attr)) x F.dropout(x, pself.dropout, trainingself.training) x F.elu(self.conv2(x, edge_index, edge_attr)) x global_mean_pool(x, batch) # 图级读出将节点特征聚合为图特征 x self.lin(x) return x # 训练循环简化版 model GATv2MetastasisPredictor(in_channels2, hidden_channels32, out_channels2) optimizer torch.optim.Adam(model.parameters(), lr0.001) criterion nn.CrossEntropyLoss() for epoch in range(200): model.train() optimizer.zero_grad() out model(train_data) # train_data是一个批量的图数据 loss criterion(out, train_data.y) loss.backward() optimizer.step() # ... 验证和测试代码踩坑实录构建图数据是最容易出错的地方。首先边的方向性很重要TF - 靶基因edge_index的顺序不能错。其次节点特征需要归一化特别是基因表达值不同基因量级差异巨大必须进行Z-score标准化。第三图神经网络的训练非常消耗内存尤其是当网络节点多、边稠密时。我们通过设置权重阈值如只保留绝对值大于0.1的边来对图进行稀疏化这是实践中常用的技巧。最后GNN对超参数如隐藏层维度、注意力头数、学习率非常敏感必须使用像Optuna这样的自动化调参工具进行系统搜索。4. 结果深度解读与模型表现剖析经过一系列实验我们得到了丰富的结果其中一些发现与直觉相符另一些则带来了新的启示。4.1 机器学习模型更多特征带来更好表现我们的基准测试清晰地显示在评估的三种机器学习模型中XGBoost在使用前1000个差异基因时取得了最佳性能AUROC: 0.7051, MCC: 0.2914。一个明显的趋势是随着输入基因特征数量的增加从100到1000所有三种模型的AUROC均呈现稳步提升。模型前100基因 (AUROC)前200基因 (AUROC)前500基因 (AUROC)前1000基因 (AUROC)随机森林0.66010.66650.68720.6911XGBoost0.65140.64550.67600.7051ElasticNet0.67760.68980.63720.6809这个结果说明在当前的基因表达数据背景下更多的差异基因信息有助于模型捕捉更全面的转移相关信号。XGBoost作为梯度提升算法其序列化学习和正则化机制使其能够有效利用高维特征中的复杂非线性关系从而脱颖而出。从混淆矩阵来看最佳XGBoost模型对原发和转移样本的识别相对均衡正确识别68个原发65个转移没有出现严重的类别偏向。这表明模型确实学到了对两类样本都有区分能力的特征。4.2 图神经网络性能遭遇瓶颈信号藏在局部相比之下基于个性化网络的GNN模型表现则略显平淡。最佳性能出现在仅使用前100个基因构建的网络时AUROC: 0.6423, MCC: 0.2254增加基因数量并未带来显著提升甚至有所波动。模型 (GNN)前100基因前200基因前500基因前1000基因AUROC0.64230.61960.64600.6367MCC0.22540.16510.19740.2108这个结果初看可能令人失望但结合我们的可解释性分析却揭示了更深层的原因。首先从PCA分析来看即使使用前1000个差异基因原发性样本和转移性样本在降维后的空间中也存在大量重叠缺乏清晰的边界。这说明数据本身的内在可分离性就是有限的。XGBoost能达到0.7以上的AUROC恰恰证明了其捕捉非线性微弱信号的能力超越了线性降维方法PCA。其次从图级统计量分析来看我们比较了原发和转移样本个性化网络的一系列全局拓扑属性如平均聚类系数、网络密度、三角形数量等。结果显示两组样本在这些全局统计量上的分布高度重叠。这意味着从“整体形状”上看转移样本的调控网络并没有发生翻天覆地的巨变。那么GNN学到的是什么我们认为GNN可能捕捉到的是局部拓扑模式的细微差异。例如某个关键转录因子与其周围靶基因的连接强度分布、网络中特定模体的出现频率等这些细微变化在全局统计量中被平均掉了但GNN的注意力机制能够对其进行加权和识别。这解释了为什么GNN性能有提升相较于随机猜测但提升幅度有限——信号太微弱、太局部化了。4.3 敏感性分析模型稳健性过关我们对最佳ML模型XGBoost-top1000和最佳GNN模型GATv2-top100进了多次不同随机种子下的重复实验。XGBoost的AUROC在0.671到0.720之间波动GNN的AUROC在0.603到0.680之间波动。这种程度的波动在机器学习实验中是正常且可接受的表明两种方法对数据划分都不是极端敏感其结果具有可重复性。这为我们结论的可靠性提供了支撑。5. 讨论、局限与未来方向5.1 本研究的价值与启示这项研究为我们提供了几个关键洞见成本效益的权衡基于基因表达的经典机器学习模型尤其是XGBoost在有限的、精心筛选的基因集上就能达到中等预测性能AUROC ~0.71。这意味着在资源有限的环境中无需进行全基因组测序仅针对几百个关键基因进行检测就有可能开发出用于转移风险初筛的低成本工具。这种“小而精”的策略具有很高的现实可行性。个性化网络的可行性我们成功实现了从静态共识网络到样本特异性动态网络的构建并将其应用于GNN。这证明了个性化基因调控网络作为分析单元在计算上是可行的。尽管在当前数据上信号不强但这为未来整合更多维度的数据如突变、甲基化来丰富网络和节点特征打下了方法论基础。双轨策略的框架意义我们建立了一个统一的评估框架既能用ML模型设立性能基准、评估临床转化潜力又能用GNN探索更复杂的、网络层面的生物学机制。这种分层思路——先用高效模型筛查再用复杂模型深挖——对于将AI转化为实际的医疗决策支持系统具有指导意义。5.2 当前面临的局限与挑战当然这项探索性工作也存在明显的局限性这也是未来改进的起点特征选择的优化我们仅依据p值筛选基因忽略了效应量如log2折叠变化。这可能导致一些p值显著但表达差异微乎其微的基因被选入而一些变化巨大但方差也大的基因被排除。未来应结合p值和效应量如adj.p 0.05 |log2FC| 1进行更严格的筛选。GNN输入网络的“噪声”我们使用了整个差异基因集构建的大网络。这个网络可能包含了大量与转移无关的基因互作稀释了核心信号。一个更合理的策略是围绕那9个关键的转移相关转录因子构建局部子网络Subgraph作为GNN的输入。这能迫使模型聚焦于生物学意义更明确的调控模块。节点特征的单一性当前GNN的节点特征仅包含标准化表达值和简单的拓扑属性。这远远不够。未来应整合多组学数据例如将基因的突变状态、拷贝数变异、甲基化水平作为额外的节点特征。甚至可以将患者的临床信息年龄、分期作为全局图特征或特定节点属性融入模型。数据层面的挑战我们使用的是细胞系数据CCLE而非真实的患者组织样本。细胞系虽然均一性好但缺乏肿瘤微环境等体内复杂因素。此外我们为了方法比较使用了平衡数据集但真实世界的数据是高度不平衡的。下一步需要在真实的、不平衡的临床队列中验证和调整模型。5.3 未来可行的深化路径基于以上讨论我认为后续工作可以从以下几个方向深入开展构建生物学驱动的子网络不再使用全差异基因网络而是分别构建以TP53、MYC、STAT3等核心转录因子为中心的调控子网。然后可以训练多个专门的GNN模型或者设计一个多图输入的GNN架构来同时学习这些关键模块的信息。迈向多组学图神经网络探索更先进的GNN架构如异构图神经网络能够处理不同类型的节点基因、miRNA、蛋白和边调控、互作、共表达。将基因组、转录组、表观基因组数据整合进同一个图模型中是逼近真实生物系统的关键。开发可解释性工具对于GNN模型不能止步于预测。需要利用图注意力权重、节点重要性评分或子图识别技术如GNNExplainer来解读究竟是网络的哪些部分、哪些基因对预测转移贡献最大。这将直接产生可验证的生物学假设。在临床队列中进行外部验证最终任何预测模型的价值都必须经过独立临床数据集的检验。与医院合作获取带有明确转移状态和生存预后的患者RNA-seq数据是验证模型泛化能力和临床实用性的必由之路。这项研究就像一次“探路”它告诉我们用AI预测癌症转移既有一条相对成熟、性价比高的“普通公路”经典ML也有一条充满挑战但前景广阔的“越野赛道”个性化GNN。如何根据不同的应用场景大规模筛查 vs. 精准分型和资源条件选择合适的“交通工具”并不断优化它将是研究者、临床医生和工程师需要共同面对的长久课题。我的体会是在生物医学AI领域对数据本质和生物学问题的深刻理解往往比追求最复杂的模型更为重要。先问“信号在哪里”再决定“用什么工具去捕捉”这条原则永远不会过时。