✨ 欢迎关注Python机器学习AI ✨
本节介绍:DSM与DCM模型构建及多时间点SHAP深度可解释性分析 ,数据采用模拟数据无任何现实意义 ,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整 数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式。文末提供高效的AI工具~!
✨ 论文信息 ✨
Deep Survival Machines (DSM) 模型
完全参数化建模:DSM采用完全参数化的方式估计生存时间分布,不依赖于传统模型(如Cox比例风险模型)对风险比例恒定的强假设,使得模型更具灵活性
无需假设比例风险恒定:传统的Cox模型要求底层生存分布满足比例风险假设,而DSM不需要这一假设,能够更真实地反映复杂的生存时间风险变化
联合学习深度非线性特征表示: DSM通过神经网络学习输入特征的深度非线性表示,提升了对复杂数据结构的建模能力,使得生存风险估计更加准确
适应不同删失水平的数据:模型在多种具有不同删失比例的真实数据集上经过验证,显示对删失数据的鲁棒性较强
支持竞争风险场景:DSM能够同时处理多个竞争风险事件的生存时间估计,这在很多实际问题中非常重要,比如医疗中的多种风险事件
Deep Cox Mixtures (DCM) 模型,通过采用多个Cox回归模型的混合,结合高效的期望最大化算法和深度神经网络,能够有效处理删失数据和异质性风险,利用非参数方法灵活建模基线风险函数,并在多个真实数据集上验证了其优于传统及现代生存分析方法的判别能力和校准效果,尤其在少数群体中表现出更好的公平性和性能提升,这两个模型和前面的——深度生存学习:Cox PH与Deep Cox PH模型构建及多时间点SHAP深度可解释性分析来自同一个生存机器学习库,可以直接调用及其方便快捷
✨ 基础代码 ✨
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")
features = pd.read_excel("2025-12-23公众号Python机器学习AI-features.xlsx")
outcomes = pd.read_excel("2025-12-23公众号Python机器学习AI-outcomes.xlsx")
from sklearn.model_selection import train_test_split
# 识别分类特征(cat_feats)和连续特征(num_feats)
cat_feats = ['sex', 'dzgroup', 'dzclass', 'income', 'race', 'ca'] # 分类特征列表
num_feats = ['age', 'num.co', 'meanbp', 'wblc', 'hrt', 'resp', # 连续特征列表
'temp', 'pafi', 'alb', 'bili', 'crea', 'sod', 'ph',
'glucose', 'bun', 'urine', 'adlp', 'adls']
# 将SUPPORT数据集拆分为训练集、验证集和测试集
# 第一次拆分:80%训练+验证,20%测试
X_train_val, X_test, y_train_val, y_test = train_test_split(features, outcomes, test_size=0.2, random_state=1)
# 第二次拆分:从训练+验证集中划分出25%作为验证集,剩余75%作为训练集
X_train, X_val, y_train, y_val = train_test_split(X_train_val, y_train_val, test_size=0.25, random_state=1)
from auton_survival.preprocessing import Preprocessor
# 初始化预处理器
# 对分类特征采用忽略策略(不填充),对数值特征采用均值填充
preprocessor = Preprocessor(cat_feat_strat='ignore', num_feat_strat='mean')
# 拟合预处理器(包括填充和标准化)到训练数据,并进行one-hot编码
transformer = preprocessor.fit(X_train, cat_feats=cat_feats, num_feats=num_feats,
one_hot=True, fill_value=-1)
# 对训练集、验证集和测试集进行相同的预处理转换
X_train = transformer.transform(X_train)
X_val = transformer.transform(X_val)
X_test = transformer.transform(X_test)
将数据集按比例拆分为训练集、验证集和测试集,并对分类特征采用忽略策略、数值特征用均值填充后进行标准化和one-hot编码的预处理,对于这部分数据处理详细的说明参考——深度生存学习:Cox PH与Deep Cox PH模型构建及多时间点SHAP深度可解释性分析
from auton_survival.estimators import SurvivalModel
from auton_survival.metrics import survival_regression_metric
from sklearn.model_selection import ParameterGrid
# 定义用于调参的参数网格
param_grid = {
'layers' : [[100], [100, 100], [200]], # 神经网络隐藏层结构
'distribution' : ['Weibull', 'LogNormal'], # 生存时间分布假设
'max_features' : ['sqrt', 'log2'] # 最大特征数选择策略
}
# 生成所有参数组合
params = ParameterGrid(param_grid)
# 定义用于调参和评估的时间点,取训练集中事件发生时间的分位数
times = np.quantile(y_train['time'][y_train['event'] == 1], np.linspace(0.1, 1, 4)).tolist()
# 进行超参数调优
models = []
for param in params:
# 初始化模型,传入当前参数组合
model = SurvivalModel('dsm', random_seed=0, layers=param['layers'], distribution=param['distribution'], max_features=param['max_features'])
# 训练模型
model.fit(X_train, y_train)
# 预测验证集的生存概率
predictions_val = model.predict_survival(X_val, times)
# 计算验证集上的积分Brier分数(IBS)作为评价指标
metric_val = survival_regression_metric('ibs', y_val, predictions_val, times, y_train)
# 保存评价指标和对应模型
models.append([metric_val, model])
# 找到验证集上评价指标最小的模型(IBS越小越好)
metric_vals = [i[0] for i in models]
first_min_idx = metric_vals.index(min(metric_vals))
model = models[first_min_idx][1] # 选择最优模型
通过遍历不同神经网络结构、生存时间分布和特征选择策略的组合,训练基于Deep Survival Machines(DSM)的生存模型,并在验证集上计算积分Brier分数,从而选择出表现最优的超参数配置和对应模型
从训练集中所有实际发生事件(即事件状态为1)的生存时间数据中,计算多个分位点对应的时间值,这些时间值作为模型进行生存概率预测和评估时的重要时间节点。通过选取从10%到100%区间内的几个等间隔分位数(这里是4个点),确定了代表不同风险阶段的时间点,以便模型能在这些关键时间点上预测个体的生存概率并计算评价指标如积分Brier分数。灵活运用时,可以根据数据特点和研究需求调整分位数的数量和分布范围,或结合领域专业知识选取对临床或实际应用更有意义的时间节点,从而使模型的预测和评估更加精确且具有针对性,增强模型的实用价值和解释能力
两个柱状图分别展示模型在不同时间点的预测误差Brier Score,越低越好和区分能力Concordance Index,越高越好,表明模型在早期时间点表现最佳,随着时间推移预测准确性和区分能力逐渐下降
# 定义用于调参的参数网格
param_grid = {
'k': [2, 3], # 模型超参数 k 的取值列表
'learning_rate': [1e-3, 1e-4], # 学习率取值列表
'layers': [[100], [100, 100]] # 神经网络隐藏层结构列表
}
# 生成所有参数组合
params = ParameterGrid(param_grid)
# 定义用于调参和评估的时间点,取训练集中事件发生时间的分位数
times = np.quantile(y_train['time'][y_train['event'] == 1], np.linspace(0.1, 1, 4)).tolist()
# 进行超参数调优
models = []
for param in params:
# 初始化模型,传入当前参数组合,使用 'dcm' 模型,设置随机种子为7
model = SurvivalModel('dcm', random_seed=7, k=param['k'], learning_rate=param['learning_rate'], layers=param['layers'])
# 训练模型
model.fit(X_train, y_train)
# 预测验证集的生存概率
predictions_val = model.predict_survival(X_val, times)
# 计算验证集上的积分Brier分数(IBS)作为评价指标
metric_val = survival_regression_metric('ibs', y_val, predictions_val, times, y_train)
# 保存评价指标和对应模型
models.append([metric_val, model])
# 找到验证集上评价指标最小的模型(IBS越小越好)
metric_vals = [i[0] for i in models]
first_min_idx = metric_vals.index(min(metric_vals))
model = models[first_min_idx][1] # 选择最优模型
通过遍历不同超参数组合,训练基于Deep Cox Mixtures(DCM)的生存模型,并在验证集上利用积分Brier分数(IBS)评估预测性能,最终选择表现最优的模型
from auton_survival.experiments import SurvivalRegressionCV
# 取训练集中事件发生时间的分位数作为时间点,分成5个等分
times = np.quantile(y_train['time'][y_train['event'] == 1], np.linspace(0.1, 1, 5)).tolist()
# 定义超参数搜索空间
param_grid = {
'k': [2, 3], # 模型超参数 k 的取值列表
'learning_rate': [1e-3, 1e-4], # 学习率取值列表
'layers': [[100], [100, 100]] # 神经网络隐藏层结构列表
}
# 创建交叉验证实验对象,设置 num_folds=5 表示5折交叉验证
experiment = SurvivalRegressionCV(
model='dcm', # dcm 模型
num_folds=5, # 5折交叉验证
hyperparam_grid=param_grid, # 超参数空间
random_seed=0
)
# 训练并调参,metric 选择积分 Brier 分数 'ibs'
best_model = experiment.fit(X_train, y_train, times, metric='ibs')
使用5折交叉验证在训练集上对Deep Cox Mixtures(DCM)模型进行超参数搜索和训练,并基于积分Brier分数(IBS)选择最优模型;相比之前单次划分训练集和验证集的调参方法,交叉验证通过多次不同划分的训练与验证,能更稳定全面地评估模型性能,通常得到更鲁棒和泛化能力更强的模型,从而使得最终模型在不同时间点上的预测误差和区分度表现更为可靠和一致,可以发现在评价指标上经过k折训练的模型在不同的时间节点上更稳定
这里基于模型的predict_survival函数对不同时间点的风险值进行SHAP解释(展示排名前5特征),解释对象是样本在各时间点的生存概率,并通过从训练和测试集中各选取距离时间点最近的代表性样本共50个作为背景和解释数据,提升计算效率,和往期文章的计算对象稍有区别——深度生存学习:Cox PH与Deep Cox PH模型构建及多时间点SHAP深度可解释性分析,具体可以从代码层面理解
SHAP值图展示在不同时间点,模型各特征对生存概率的影响及其方向,随着时间推移,影响生存概率的关键特征和其作用强度发生了动态变化
当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息
图片
在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。
同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。
✨ 介绍 ✨
本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,下方提供淘宝店铺二维码获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。
更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。
✨ 群友反馈 ✨
✨ 淘宝店铺 ✨
请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容 ,希望能为您的学习之路提供帮助!
✨ AI工具推荐 ✨
https://chatgpt-cn.pro/
往期推荐
期刊配图:模型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倍交叉验证
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考
