机器学习建模与 SHAP 可解释性分析
机器学习建模是从多个特征中学习预测规则,用来做疾病分类、亚型识别、药物活性或连续指标的预测。生物医学数据常见形态是样本少、特征多:几十到几百个样本,对应上千个基因、代谢物或影像特征,因此建模的难点不在算法,而在于防止过拟合和数据泄漏、得到可信的性能估计。SHAP(SHapley Additive exPlanations)基于博弈论中的 Shapley 值,把每个样本的预测值拆分到各个特征上,既能看全局哪些特征最重要,也能看单个样本为什么被判为高风险。它解释的是模型的行为,不等于生物学因果。
什么时候用
- 用组学、临床或影像特征构建二分类或多分类预测模型
- 比较逻辑回归、随机森林、XGBoost 等算法的性能
- 特征间可能存在非线性关系或交互作用
- 需要说明模型主要依赖哪些特征及其作用方向
- 解释单个样本的预测结果,用于病例讨论或结果展示
- 从候选特征中筛选对预测贡献最大的少数特征
不适合的情况
- 样本只有十几个却有上千特征,模型几乎必然过拟合
- 把 SHAP 重要性当作因果证据或药物靶点的直接依据
- 带删失的生存结局,应使用 Cox 类预后模型或生存森林
需要准备的数据
- 特征矩阵
- 行为样本、列为特征,数值型为主;分类变量需编码,记录缺失比例,缺失过多的特征先评估是否保留
- 结局标签
- 分类标签或连续结局,写明定义来源;记录各类别样本数,判断是否不平衡
- 分组与来源信息
- 患者编号、中心、批次;同一患者多个样本时必须按患者划分数据,避免同人样本跨训练和测试集
- 外部验证集
- 独立队列或不同中心的数据,特征名称、单位和预处理需与训练集一致
分析步骤
- 1
划分数据
先留出测试集或外部验证集,之后所有探索都只用训练集。按结局分层抽样保持类别比例;同一患者多个样本时用 GroupKFold 等按组划分。测试集在最终评估前不参与任何决策。
- 2
构建预处理流程
缺失值填补、标准化、特征筛选都放进训练流程内部,只用训练折拟合参数,再应用于验证折。scikit-learn 的 Pipeline 可以保证这一点,避免在全数据上先筛特征造成泄漏。
- 3
建立基线模型
先用带正则化的逻辑回归作为基线,再尝试随机森林、XGBoost、LightGBM 等。若复杂模型在交叉验证中并不明显优于基线,优先选择更简单、更易解释的模型。
- 4
调参与交叉验证
在训练集内用交叉验证调超参数。若还要用交叉验证报告性能,应使用嵌套交叉验证:内层调参,外层评估。外层各折性能波动很大,说明样本量不足或模型不稳定。
- 5
评估性能
分类任务报告 ROC AUC、PR AUC、灵敏度、特异度和校准曲线,回归任务报告 RMSE、R²。所有指标给出交叉验证均值与标准差,并在测试集上报告一次最终结果。
- 6
计算 SHAP 值
树模型用 shap 包的 TreeExplainer,速度快且结果精确;其他模型可用 KernelExplainer 或针对模型的解释器,但计算慢、需要背景样本。通常在测试集或外层验证折上计算,解释的是模型在新样本上的行为。
- 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 解释主要特征