期刊复现:COX、XGB、RSF、GBSA与SSVM模型在生存分析中的应用与SHAP解释

机器学习算法数据库

picture.image

✨ 欢迎关注Python机器学习AI ✨

本节介绍: COX、XGB、RSF、GBSA与SSVM模型在生存分析中的应用与SHAP解释 ,数据采用模拟数据无任何现实意义 ,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整 数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式。文末提供高效的AI工具~!点赞、推荐参与文末包邮赠书~!

✨ 论文信息 ✨

picture.image

picture.image

文献中数据被分为训练集(70%)和测试集(30%),训练集用于训练多个机器学习模型,包括Cox比例风险模型(CoxPH)、随机生存森林(RSF)、极端梯度提升(XGB)、梯度提升生存分析(GBSA)和生存支持向量机(SSVM)。其中,Cox比例风险模型是一种常见的线性生存分析模型,基于风险比与协变量之间的线性关系。随机生存森林则通过集成多个决策树,处理生存数据中的非线性关系,并能应对缺失数据。极端梯度提升(XGB)本身并非生存模型,但通过修改目标函数(例如设置为'survival:cox'),使其能够用于生存数据建模。梯度提升生存分析(GBSA)则是在传统梯度提升框架上改进,适应生存分析的需求,能够处理复杂的时间到事件数据。生存支持向量机(SSVM)则是对支持向量机的扩展,专门针对生存时间数据进行建模。以上模型分别代表了传统的生存分析方法和现代的生存机器学习方法,能够有效地进行生存数据建模和预测

目标是通过这些算法计算患者临床缓解(CR)的可能性,并优化模型的性能,在训练完模型后,接下来的步骤是特征选择(识别重要变量)

picture.image

在使用所有34个候选变量进行训练并未进行特征消除或提取的情况下,最优模型为XGBoost。随后,对该模型进行SHAP解释,深入分析各个特征对预测结果的影响。接着,进行递归特征消除,并重新建立模型得到新的模型评估结果。在测试集上,Cox比例风险模型(CPH)和梯度提升生存分析(GBSA)模型的C指数最高,均为0.800。尽管GBSA模型表现稳健,但与SHAP方法相比,其在可解释性和计算复杂性上存在一定挑战。在临床环境中,模型的可解释性和实际应用性与预测性能同样重要。因此,文献最终选择了CPH模型作为风险分层和进一步分析的最佳模型

实际上,GBSA模型是可以计算SHAP值的,只是相较于树模型XGBoost,计算过程更为复杂。然而,与Cox模型相比,GBSA无疑是更为复杂的模型。当然,在这篇复现公众号文章中,只复现了特征消除前的模型解释,后续部分将在下一章节进行详细复现

✨ 基础代码 ✨

  
import pandas as pd  
import numpy as np  
import matplotlib.pyplot as plt  
plt.rcParams['font.family'] = 'Times New Roman'  
plt.rcParams['axes.unicode_minus'] = False  
import warnings  
# 忽略所有警告  
warnings.filterwarnings("ignore")  
df = pd.read_excel('2025-10-15公众号Python机器学习AI.xlsx')  
from sklearn.model_selection import train_test_split  
# 划分特征和目标变量  
X = df.drop(['OS', 'OS_State'], axis=1)    
y = df[['OS', 'OS_State']]    
# 划分训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(  
    X,    
    y,   
    test_size=0.3,   
    random_state=42,   
    stratify=df['OS_State']   
)

从Excel文件中读取数据,划分特征和目标变量,并将数据分为训练集和测试集,测试集占30%,同时保证了目标变量'OS_State'的比例一致性

  
from lifelines import CoxPHFitter  
# 将训练数据(包括特征和生存时间)合并为一个DataFrame  
train_survival_data = X_train.copy()  
train_survival_data['OS'] = y_train['OS']  
train_survival_data['OS_State'] = y_train['OS_State'] == 1  # 反转事件  
  
# 使用 CoxPHFitter 拟合数据  
cph = CoxPHFitter()  
cph.fit(train_survival_data, duration_col='OS', event_col='OS_State')  
from lifelines.utils import concordance_index  
# 计算模型的一致性(C-index)  
c_index_train_cox = cph.concordance_index_  
print(f"Training Set C-index: {c_index_train_cox}")  
# 使用模型对测试集进行预测  
predicted_hazard = cph.predict_partial_hazard(X_test)

使用Cox比例风险模型(CoxPHFitter)拟合训练数据,并计算训练集上的C指数(C-index)来评估模型的一致性,随后使用该模型对测试集进行预测

  
import xgboost as xgb  
  
# 构建 XGBoost DMatrix 数据格式  
dtrain = xgb.DMatrix(X_train, label=y_train['OS'].values, missing=np.nan)  
dtest = xgb.DMatrix(X_test)  
  
# 设置 XGBoost 参数,支持生存分析  
params = {  
    'objective': 'survival:cox',  # Cox比例风险模型  
    'eval_metric': 'rmse',  # 使用均方根误差 (RMSE) 作为评估指标  
    'eta': 0.05,  # 增加学习率  
    'max_depth': 8,  # 增加树的深度  
    'n_estimators': 500,  # 增加树的数量  
    'min_child_weight': 1,  # 减少最小样本权重  
    'subsample': 0.8,  # 训练数据的随机子样本比例  
    'colsample_bytree': 0.8,  # 每棵树使用的特征比例  
    'gamma': 0  # 尝试更小的gamma值,减少分裂的保守性  
}  
  
bst = xgb.train(params, dtrain)  
  
  
# 预测训练集和测试集的风险分数  
train_preds = bst.predict(dtrain)  
test_preds = bst.predict(dtest)  
  
# 计算训练集的 C-index  
train_c_index = concordance_index(y_train['OS'], -train_preds, y_train['OS_State'])  
  
# 计算测试集的 C-index  
test_c_index = concordance_index(y_test['OS'], -test_preds, y_test['OS_State'])

使用XGBoost训练生存分析模型,特别通过设置'objective': 'survival:cox'参数,将XGBoost调整为Cox比例风险模型,随后计算训练集和测试集的C指数(C-index)来评估模型的预测性能,对于objective这个参数的设置参考官方文档

  
https://federated-xgboost.readthedocs.io/en/latest/parameter.html#learning-task-parameters

对于计算一致性指数的计算参考官方文档,和接下来的RSF等模型计算不是使用的同一个函数

  
https://lifelines.readthedocs.io/en/latest/lifelines.utils.html#lifelines.utils.concordance\_index
  
from sksurv.ensemble import RandomSurvivalForest  
from sklearn.metrics import make_scorer  
random_state = 1314  
# 创建 RandomSurvivalForest 模型,使用默认参数  
rsf = RandomSurvivalForest(random_state=random_state)  
  
# 直接训练模型,不进行网格搜索  
rsf.fit(X_train, y_train_surv)  
  
# 计算并打印训练集和测试集的 C-index  
train_c_index_RSF = rsf.score(X_train, y_train_surv)  
test_c_index_RSF = rsf.score(X_test, y_test_surv)

使用随机生存森林(RandomSurvivalForest)模型训练生存数据,其中y_train_surv和y_test_surv是结构化数组,包含了生存时间和事件状态的数据,同样的可以构建剩下的模型GBSA和SSVM,完整代码文末提供获取方式

  
data = {  
    '模型': ['CoxPH', 'RSF', 'XGB', 'GBSA', 'FKSSVM'],  
    '训练集 C-index': [  
        c_index_test_cox,  # Cox模型 训练集 C-index  
        train_c_index_RSF,  # RSF模型 训练集 C-index  
        train_c_index,  #  训练集 C-index  
        train_c_index_GBSA,  # GBSA模型 训练集 C-index  
        train_c_index_FKSSVM  # FKSSVM模型 训练集 C-index  
    ],  
    '测试集 C-index': [  
        c_index_test_cox,  # Cox模型 测试集 C-index  
        test_c_index_RSF,  # RSF模型 测试集 C-index  
        test_c_index,  #  测试集 C-index  
        test_c_index_GBSA,  # GBSA模型 测试集 C-index  
        test_c_index_FKSSVM  # FKSSVM模型 测试集 C-index  
    ]  
}  
  
df_c_index = pd.DataFrame(data)  
df_c_index

picture.image

最终显示五个模型及其在训练集和测试集上的C指数结果的数据框,用于展示不同生存分析模型的性能比较,在这个模拟数据集测试集上表现最优异的模型为RSF,但是为了和文献一致接下来展示对XGBoost模型的SHAP解释,对于RSF模型的SHAP解释放在下一章节实现讲解

  
import shap  
explainer = shap.TreeExplainer(bst)  
shap_values = explainer.shap_values(dtest)  
plt.figure(figsize=(10, 5))  
# 设置 max_display=20 限制显示前20个特征  
shap.summary_plot(  
    shap_values,   
    X_test,   
    plot_type="bar",   
    max_display=20,     
    show=False  
)  
  
plt.tight_layout()  
plt.savefig("SHAP-XGBoost-1.pdf", format='pdf',bbox_inches='tight', dpi=1200)  
plt.show()

picture.image

使用SHAP解释器对XGBoost模型进行特征重要性分析,并生成一个条形图,展示测试集上前20个最重要特征的SHAP值,生存XGBoost模型和XGBoost模型的分类、回归形式是同样的计算方法

  
plt.figure()  
shap.summary_plot(  
    shap_values,  
    X_test,  
    feature_names=X_test.columns,  
    plot_type="dot",  
    max_display=20,     
    show=False  
)  
  
plt.savefig("SHAP-XGBoost-2.pdf", format='pdf',bbox_inches='tight', dpi=1200)  
plt.show()

picture.image

使用SHAP解释器生成一个点图,展示测试集上前20个最重要特征的SHAP值

picture.image

这里可视化特征排名前四特征Uracil_pos-156、Trimethyllysine_pos-152、Thymine_pos-150、S-Adenosyl-methionine_pos-139的依赖图。每个图展示特征值与SHAP值之间的关系,帮助解释连续变量对预测模型输出的具体影响。在文献中,SHAP依赖图被用来可视化特征如何影响预测结果,这里着重展示模拟数据前四个特征的依赖关系图

当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息

picture.image

✨ 该文章案例 ✨

picture.image

在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。

同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。

✨ 书籍推荐 ✨

无论你是零编程基础的科研新手,还是想提升机器学习技能的医学科研工作者,这本书都能带你从入门到进阶,掌握Python数据分析+医学AI应用的全流程技能

✨ 介绍 ✨

本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,下方提供淘宝店铺二维码获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。

更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。

✨ 群友反馈 ✨

picture.image

✨ 淘宝店铺 ✨

picture.image

请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容 ,希望能为您的学习之路提供帮助!

✨ AI工具推荐 ✨

picture.image

✨ 赠书活动 ✨

picture.image

支持知识分享,畅享学习乐趣!特别感谢清华大学出版社 对本次赠书活动的鼎力支持!即日起,只需点赞、推荐、转发 此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送清华出版社提供的《构建私有化大模型应用系统 部署、推理与知识库搭建》这本精彩书籍📚!

💡 赶快参与,一键三连,说不定你就是那位幸运读者哦!

往期推荐

期刊配图:模型SHAP解释特征类别柱状图、饼图与蜂巢图的组合展示

期刊复现:基于自动机器学习的预测模型构建及其残差和部分依赖分析

期刊复现:SVM、RF、BDT、DT、Logit五大模型堆叠31种组合情况最优模型的SHAP解释

期刊复现:单变量特征降维与共线性分析结合RFE集成排名进行特征筛选下的组合拳流程

期刊复现:SVM、RF、BDT、DT、Logit五大模型堆叠31种组合情况优化与最优模型选择可视化

期刊复现:基于相关系数与AUC值优化特征选择剔除冗余特征精简模型(附代码)

期刊复现:如何正确使用LASSO进行二分类特征选择?避开常见误区,掌握实用技巧

期刊复现:融合聚类与多分类转二分类的亚型可解释SHAP机器学习模型构建

期刊复现:基于LightGBM、XGBoost与RF的Lasso回归堆叠模型在连续和分类特征上的模型解释

期刊复现:基于LightGBM、XGBoost与RF的堆叠模型贝叶斯优化调参与Lasso回归元模型,结合10倍交叉验证

picture.image

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
火山引擎大规模机器学习平台架构设计与应用实践
围绕数据加速、模型分布式训练框架建设、大规模异构集群调度、模型开发过程标准化等AI工程化实践,全面分享如何以开发者的极致体验为核心,进行机器学习平台的设计与实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论