✨ 欢迎关注Python机器学习AI ✨
本节介绍: 预测患者诊断与预后的生存梯度提升机(GBDT-Survival)方法,数据采用模拟数据无任何现实意义,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 详细数据和代码将在稍后上传至交流群,付费成员可在交流群中获取下载。需要的朋友可关注公众文末提供的购买方式。 购买前请咨询,避免不必要的问题。
✨ 代码实现 ✨
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")
# 读取训练和测试数据
X_train = pd.read_excel('X_train_selected.xlsx') # 读取训练数据的特征
y_train = pd.read_excel('ytrain.xlsx', index_col=0) # 读取训练数据的标签,第一列作为索引
X_test = pd.read_excel('X_test_selected.xlsx') # 读取测试数据的特征
y_test = pd.read_excel('ytest.xlsx', index_col=0) # 读取测试数据的标签,第一列作为索引
读取训练和测试数据集,包括特征和标签,准备进行后续的机器学习建模
# 从训练和测试数据中提取 "Sample" 列并将其删除
X_train_sample = X_train["Sample"] # 提取训练数据中的 Sample 列
X_train = X_train.drop(["Sample"], axis=1) # 删除训练数据中的 Sample 列
y_train = y_train.drop(["Sample"], axis=1) # 删除训练标签中的 Sample 列
X_test_sample = X_test["Sample"] # 提取测试数据中的 Sample 列
X_test = X_test.drop(["Sample"], axis=1) # 删除测试数据中的 Sample 列
y_test = y_test.drop(["Sample"], axis=1) # 删除测试标签中的 Sample 列
# 将标签转换为 NumPy 数组
y_train = np.array(y_train)
y_test = np.array(y_test)
# 输出训练和测试数据中生存和死亡的数量
print("Train/Test info:")
print("Train, survival-death:", np.unique(y_train[:, 1], return_counts=True)) # 输出训练数据中生存和死亡的数量
print("Test, survival-death:", np.unique(y_test[:, 1], return_counts=True)) # 输出测试数据中生存和死亡的数量
从训练和测试数据中提取并删除“Sample”的列(样本索引),然后将标签数据转换为NumPy数组,最后输出了训练和测试数据中生存(1)和死亡(0)的样本数量,训练数据中有97个生存样本(1)和24个死亡样本(0),测试数据中有50个生存样本(1)和10个死亡样本(0)
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
# 处理训练标签数据
y_train = pd.DataFrame(y_train) # 将训练标签转换为 DataFrame
y_train.columns = ["ST", "State"] # 为 DataFrame 指定列名
# 显式将 "State" 列的类型转换为 int,再转换为 bool 类型
y_train.loc[:, "State"] = y_train.loc[:, "State"].astype(int).astype(bool) # 将 "State" 列的数据类型转换为布尔值(True 表示生存,False 表示死亡)
# 创建一个结构化的 NumPy 数组,用于存储生存数据
train_data = np.zeros(len(y_train), dtype={'names': ('cens', 'time'), 'formats': ('?', '<f8')}) # 创建一个空的结构化数组,包含两列:'cens'(生存状态)和 'time'(生存时间)
train_data['cens'] = y_train.loc[:, "State"] # 将 "State" 列数据存储到 "cens" 字段中,表示生存状态
train_data['time'] = y_train.loc[:, "ST"] # 将 "ST" 列数据存储到 "time" 字段中,表示生存时间
y_train = train_data # 将结构化数组赋值给 y_train
# 处理测试标签数据
y_test = pd.DataFrame(y_test) # 将测试标签转换为 DataFrame
y_test.columns = ["ST", "State"] # 为 DataFrame 指定列名
# 显式将 "State" 列的类型转换为 int,再转换为 bool 类型
y_test.loc[:, "State"] = y_test.loc[:, "State"].astype(int).astype(bool) # 将 "State" 列的数据类型转换为布尔值(True 表示生存,False 表示死亡)
# 创建一个结构化的 NumPy 数组,用于存储生存数据
test_data = np.zeros(len(y_test), dtype={'names': ('cens', 'time'), 'formats': ('?', '<f8')}) # 创建一个空的结构化数组,包含两列:'cens'(生存状态)和 'time'(生存时间)
test_data['cens'] = y_test.loc[:, "State"] # 将 "State" 列数据存储到 "cens" 字段中,表示生存状态
test_data['time'] = y_test.loc[:, "ST"] # 将 "ST" 列数据存储到 "time" 字段中,表示生存时间
y_test = test_data # 将结构化数组赋值给 y_test
y_test # 返回处理后的测试标签数据
将训练和测试数据中的标签转换为结构化的NumPy数组,包含生存时间和生存状态(生存或死亡),并将标签数据格式化为适合生存分析的形式, 生存状态(布尔值)。False 表示患者死亡(状态为 0),True 表示患者存活(状态为 1),生存时间(浮动类型)。表示患者的生存时间(单位通常是天数或月数)。例如,32. 表示患者生存了 32 天
from sksurv.ensemble import GradientBoostingSurvivalAnalysis
##### settings #####
random_state = 20 # 控制随机性,确保结果可复现
n_estimators = 1000 # 树的数量
learning_rate = 0.1 # 学习率
max_depth = 3 # 树的最大深度
min_samples_split = 10 # 内部节点划分所需的最小样本数
min_samples_leaf = 15 # 叶节点所需的最小样本数
max_features = "sqrt" # 在寻找最佳划分时考虑的特征数量
# 使用生存梯度提升机拟合一个模型,并指定损失函数为"coxph"(Cox比例风险模型)
gbdt = GradientBoostingSurvivalAnalysis(n_estimators=n_estimators, # 树的数量
learning_rate=learning_rate, # 学习率
max_depth=max_depth, # 最大树深度
min_samples_split=min_samples_split, # 最小样本数
min_samples_leaf=min_samples_leaf, # 最小叶子节点样本数
max_features=max_features, # 每次分裂时考虑的最大特征数
random_state=random_state, # 随机种子,确保结果可复现
loss="coxph") # 指定使用Cox比例风险模型作为损失函数
# 训练模型
gbdt.fit(X_train, y_train) # 使用训练数据(Xtrain 和 ytrain)训练生存梯度提升机模型
使用生存梯度提升机(GBDT)模型,通过Cox比例风险模型作为损失函数,在训练数据上进行拟合,以预测生存分析任务中的患者生存情况
c_index = gbdt.score(X_test, y_test)
f"{c_index:.5f}"
计算生存梯度提升机(GBDT)模型在测试数据集上的C-index(一致性指数),即模型的预测准确性
C-index的值介于0和1之间,越接近1表示模型的预测越准确,越接近0.5则表示模型表现与随机猜测相似。具体到结果“0.74741”,说明模型的预测准确度较好
这里显示的测试集前5个样本的累积风险函数图,通过生存梯度提升机(GBDT)模型预测不同样本在不同时间点的累积风险, 曲线的斜率代表了风险增长的速度。通过这些曲线,可以比较不同样本的风险演变,了解哪些样本在较短时间内风险上升较快,哪些样本的风险上升较慢。
- 蓝色曲线(157P):
这条曲线显示了该样本的累积风险随着时间迅速上升,表明该样本的风险在较短时间内急剧增加,可能意味着该样本较早出现事件的概率更高
- 橙色曲线(124P):
相比于蓝色曲线,橙色曲线的累积风险增加较慢,表明该样本的风险上升更加平稳,事件发生的概率较为缓慢
- 绿色曲线(52P):
绿色曲线的累积风险上升最为缓慢,表示该样本的风险增长非常平稳,风险的累积速度较低。
- 红色曲线(295P):
红色曲线的累积风险上升速度稍快于绿色曲线,但仍然较为平缓,说明该样本的风险上升没有蓝色曲线那么迅速。
- 紫色曲线(219P):
这条曲线显示了类似红色曲线的累积风险,表明其风险增长的趋势较为稳定,和橙色曲线(124P)高度重叠
当然也可以针对该样本进行生存曲线图绘制,显示不同样本在不同时间点的生存概率,反映了随着时间推移各样本的生存情况
与累积风险函数图的区别在于:
- 生存曲线图表示的是每个样本在不同时间点的生存概率(从1到0的下降)
- 累积风险函数图表示的是每个样本在不同时间点的累积风险(风险随时间的增加而上升)
生存曲线着重展示生存的可能性,而累积风险图则关注风险的累积
# 使用训练好的 GBDT 模型 (gbdt_model) 来预测测试数据的风险分数
# `gbdt_model.predict(X_test)` 生成测试集 (X_test) 的风险分数
test_risk_scores = pd.Series(gbdt.predict(X_test))
# 提取测试数据中 "cens" 和 "time" 列,并转换数据类型
test_event_status = y_test["cens"].astype('int') # 事件是否发生
test_survival_time = y_test['time'].astype('float') # 生存时间
# 创建一个 DataFrame 来存储测试集的风险分数、生存时间、事件状态和样本编号
test_data = pd.DataFrame({
"risk_score": test_risk_scores,
"survival_time": test_survival_time,
"event_status": test_event_status,
"sample_id": X_test_sample
})
test_data.head()
使用训练好的 GBDT 模型预测测试数据的风险分数,并创建一个包含风险分数、生存时间、事件状态和样本编号的数据框,风险分数较高表示较高的死亡风险,较低的分数则表示较低的死亡风险,通过其反映每个样本的死亡风险
该生存梯度提升机(GBDT-Survival)模型的ROC曲线显示了其在测试数据上的表现,采用风险分数而非预测概率来进行评估。AUC值为0.750,表明模型在区分生存与死亡事件方面具有较好的能力,属于良好的区分性能。95%置信区间为0.571到0.902,这表明模型的AUC值在该区间内的概率为95%,进一步验证了模型的稳定性与可靠性。ROC曲线显示,随着风险分数的提高,模型在预测患者生存状态时逐步增强了预测能力,整体表现较为优秀。
✨ 该文章案例 ✨
在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。
同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。
✨ 购买介绍 ✨
本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,或添加作者微信deep_ML联系,购买作者的公众号合集。截至目前为止,合集已包含200多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用,包括但不限于ChatGPT、Deepseek、Claude等。
更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 购买前请咨询,避免不必要的问题。
✨ 群友反馈 ✨
✨ 淘宝店铺 ✨
请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容,或者添加作者微信deep_ML联系 避免淘宝客服漏掉信息 ,希望能为您的学习之路提供帮助!
往期推荐
Frontiers in Oncology:利用生存机器学习RSF模型预测患者预后模拟实现
期刊配图:通过SHAP组图解读模型探索不同类型特征和分组对模型的影响
机器学习在临床数据分析中的应用:从数据预处理到Web应用实现的完整流程教学
Psychiatry Research基于SHAP可解释性的机器学习模型构建与评估:混淆矩阵、ROC曲线、DCA与校准曲线分析
nature communications:基于Light GBM与随机森林结合的多模型特征选择方法
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考