Codar
下载

机器学习建模与 SHAP 可解释性分析

机器学习建模是从多个特征中学习预测规则,用来做疾病分类、亚型识别、药物活性或连续指标的预测。生物医学数据常见形态是样本少、特征多:几十到几百个样本,对应上千个基因、代谢物或影像特征,因此建模的难点不在算法,而在于防止过拟合和数据泄漏、得到可信的性能估计。SHAP(SHapley Additive exPlanations)基于博弈论中的 Shapley 值,把每个样本的预测值拆分到各个特征上,既能看全局哪些特征最重要,也能看单个样本为什么被判为高风险。它解释的是模型的行为,不等于生物学因果。

什么时候用

  • 用组学、临床或影像特征构建二分类或多分类预测模型
  • 比较逻辑回归、随机森林、XGBoost 等算法的性能
  • 特征间可能存在非线性关系或交互作用
  • 需要说明模型主要依赖哪些特征及其作用方向
  • 解释单个样本的预测结果,用于病例讨论或结果展示
  • 从候选特征中筛选对预测贡献最大的少数特征

不适合的情况

  • 样本只有十几个却有上千特征,模型几乎必然过拟合
  • 把 SHAP 重要性当作因果证据或药物靶点的直接依据
  • 带删失的生存结局,应使用 Cox 类预后模型或生存森林

需要准备的数据

特征矩阵
行为样本、列为特征,数值型为主;分类变量需编码,记录缺失比例,缺失过多的特征先评估是否保留
结局标签
分类标签或连续结局,写明定义来源;记录各类别样本数,判断是否不平衡
分组与来源信息
患者编号、中心、批次;同一患者多个样本时必须按患者划分数据,避免同人样本跨训练和测试集
外部验证集
独立队列或不同中心的数据,特征名称、单位和预处理需与训练集一致

分析步骤

  1. 1

    划分数据

    先留出测试集或外部验证集,之后所有探索都只用训练集。按结局分层抽样保持类别比例;同一患者多个样本时用 GroupKFold 等按组划分。测试集在最终评估前不参与任何决策。

  2. 2

    构建预处理流程

    缺失值填补、标准化、特征筛选都放进训练流程内部,只用训练折拟合参数,再应用于验证折。scikit-learn 的 Pipeline 可以保证这一点,避免在全数据上先筛特征造成泄漏。

  3. 3

    建立基线模型

    先用带正则化的逻辑回归作为基线,再尝试随机森林、XGBoost、LightGBM 等。若复杂模型在交叉验证中并不明显优于基线,优先选择更简单、更易解释的模型。

  4. 4

    调参与交叉验证

    在训练集内用交叉验证调超参数。若还要用交叉验证报告性能,应使用嵌套交叉验证:内层调参,外层评估。外层各折性能波动很大,说明样本量不足或模型不稳定。

  5. 5

    评估性能

    分类任务报告 ROC AUC、PR AUC、灵敏度、特异度和校准曲线,回归任务报告 RMSE、R²。所有指标给出交叉验证均值与标准差,并在测试集上报告一次最终结果。

  6. 6

    计算 SHAP 值

    树模型用 shap 包的 TreeExplainer,速度快且结果精确;其他模型可用 KernelExplainer 或针对模型的解释器,但计算慢、需要背景样本。通常在测试集或外层验证折上计算,解释的是模型在新样本上的行为。

  7. 7

    解读与稳健性检查

    先看蜂群图确定全局重要特征和作用方向,再用依赖图看非线性和交互,用瀑布图解释典型样本。在不同交叉验证折上重复计算,排名靠前的特征应基本一致。

关键参数与决策

算法选择

样本少、特征多时,带 L1 或弹性网惩罚的逻辑回归往往足够且稳定;表格数据中存在非线性和交互时,随机森林和梯度提升树通常表现更好。深度学习一般需要更大样本,不适合几百例的表格数据。

树模型关键超参数

随机森林主要调树的数量、每次分裂候选特征数和叶节点最小样本数;XGBoost 主要调学习率、树深度、树数量和子采样比例。小样本时树深度宜浅,并用早停防止过拟合。

类别不平衡

可用 class_weight 或 XGBoost 的 scale_pos_weight 提高少数类权重,也可只在训练折内过采样。划分数据前过采样会让合成样本泄漏到验证集。评估时补充 PR AUC 和平衡准确率。

SHAP 背景数据与输出尺度

SHAP 值相对于基准值(背景样本的平均预测)计算。XGBoost 二分类默认解释 log-odds 尺度,数值可加但不是概率;需要概率尺度解释时要显式设置并说明。

特征相关性

高度相关的特征会分摊 SHAP 值,单看排名可能低估其中每一个。可先按相关性把特征聚组,或报告组层面的重要性,并在解读时说明哪些特征可相互替代。

常见错误

  • 在全部样本上先做差异分析筛特征再交叉验证:测试折的信息已进入特征选择,AUC 会被大幅高估,换队列后迅速下降。
  • 用调参所用的交叉验证分数直接报告性能:超参数已针对这些折优化,结果偏乐观,应使用嵌套交叉验证或独立测试集。
  • 同一患者的多个样本或多次随访被随机分到训练和测试集:模型记住个体特征,测试性能虚高,应按患者分组划分。
  • 只报告准确率:阳性仅占 10% 时,全部预测为阴性也有 90% 准确率,应报告 AUC、PR AUC、灵敏度和特异度。
  • 用随机森林默认的不纯度重要性排序特征:它偏向取值多的连续变量和高基数分类变量,应改用置换重要性或 SHAP。
  • 把 SHAP 正值解读为该基因促进疾病:SHAP 反映模型如何使用该特征,可能来自混杂或批次,需要独立实验或因果方法验证。

结果怎么看

SHAP 蜂群图

每行一个特征,按平均绝对 SHAP 值排序;每个点是一个样本,横轴为对预测的贡献,颜色表示特征值高低。红点集中在右侧说明该特征值高时推高预测。若批次、中心等变量排在前列,说明模型学到了技术差异。

SHAP 依赖图

横轴为特征取值,纵轴为该特征的 SHAP 值,可看出阈值效应、饱和或 U 形关系。同一取值处纵向散开较大,提示存在交互,可按另一特征着色观察。

瀑布图

解释单个样本:从基准值出发,各特征依次把预测推高或拉低,最终到达模型输出。适合展示典型正确和错误样本;错误样本的主导特征常提示数据问题或模型盲区。

模型性能对比表

列出各算法在交叉验证中的 AUC 均值与标准差及测试集结果。复杂模型提升小于各折标准差时,差异不可靠;训练集 AUC 接近 1 而验证集明显更低,说明过拟合。

校准曲线

比较预测概率与实际阳性比例。树模型和经过类别加权的模型常出现概率偏移,若需要输出风险概率,应在验证数据上做 Platt 或保序回归校准后再评估。

和相近方法怎么选

随机森林与 XGBoost

随机森林对超参数不敏感,默认设置通常就能得到稳定结果;XGBoost 等梯度提升方法上限更高,但需要调学习率、树深度并配合早停。样本少、调参资源有限时先用随机森林,数据较多时再尝试梯度提升。

机器学习与逻辑回归

逻辑回归给出每个变量的系数和置信区间,便于写成公式和列线图;树模型能自动捕捉非线性和交互。在变量不多的表格临床数据上,两者性能常常相近,应同时建模并在同一验证集比较。

SHAP 与置换重要性

置换重要性打乱某特征后看性能下降多少,只给全局排名;SHAP 同时给出全局排名、作用方向和单样本解释。两者对相关特征都有分摊或低估问题,排名一致的特征结论更可靠。

SHAP 与 LIME

LIME 在单个样本附近拟合简单的局部模型,结果受采样和邻域设定影响,重复运行可能不同;SHAP 满足可加性,各特征贡献之和等于预测值减基准值,树模型上可精确计算,一致性更好。

常见问题

SHAP 图怎么看?

蜂群图中特征按重要性从上到下排列,点的横向位置表示该样本中这个特征把预测推高还是拉低,颜色表示特征值高低。若某特征红点都在右侧、蓝点在左侧,说明特征值越高预测越偏向阳性。点分布越宽,该特征影响越大。

样本量少能做机器学习吗?

可以做,但要更谨慎:优先用带正则化的简单模型,限制特征数量,用重复的分层交叉验证或嵌套交叉验证评估,并报告各折性能波动。几十例样本得到的 AUC 置信区间很宽,结论最好在独立队列中验证。

SHAP 值和特征重要性有什么区别?

传统特征重要性只给每个特征一个全局分数,不说明方向;SHAP 为每个样本的每个特征给出一个带正负号的贡献值,平均绝对值可作为全局重要性,同时还能看作用方向、非线性关系和单个样本的解释。

交叉验证 AUC 很高,外部验证却很低是为什么?

常见原因有三类:预处理或特征筛选时发生数据泄漏;训练集和外部队列在平台、批次、人群构成上差异大;样本量小导致性能估计不稳定。先检查流程是否泄漏,再比较两个队列的特征分布并考虑批次校正。

随机森林和 XGBoost 选哪个?

没有固定答案,取决于数据量和调参投入。随机森林默认参数下通常表现稳定,适合先建立参照;XGBoost 调参得当时上限可能更高。建议两者都在同一交叉验证框架下比较,同时保留逻辑回归作为基线。

在 Codar 里怎么做

在 Codar 里上传特征矩阵和结局标签并说明预测目标。Codar 确认方案后进行机器学习训练与评估:划分数据,在交叉验证中训练并调参逻辑回归、随机森林、XGBoost 等模型,报告 AUC、灵敏度、特异度和校准;再做 SHAP 分析,输出蜂群图、依赖图和瀑布图。交付模型对比表、报告和可复现脚本。仅供科研,不替代临床诊断。

可以这样提问
我有 220 例患者的 35 个血清代谢物和临床变量,结局是是否复发,帮我比较随机森林和 XGBoost,并用 SHAP 解释主要特征
了解通用科研与数据服务插件