✨ 欢迎关注Python机器学习AI ✨
本节介绍:基于递归特征筛选的XGBoost、RSF、COX、GBSA与SSVM生存分析模型性能提升,数据采用模拟数据无任何现实意义 ,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整 数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式。文末提供高效的AI工具~!点赞、推荐参与文末包邮赠书~!
✨ 论文信息 ✨
阅读该文章前,请先阅读前文——期刊复现:COX、XGB、RSF、GBSA与SSVM模型在生存分析中的应用与SHAP解释,在使用所有34个候选变量进行训练并未进行特征消除或提取的情况下,最优模型为XGBoost。随后,对该模型进行SHAP解释,深入分析各个特征对预测结果的影响
接着,进行递归特征消除,得到新的10个特征的特征子集,并重新建立模型得到新的模型评估结果
最终在测试集上,Cox比例风险模型(CPH)和梯度提升生存分析(GBSA)模型的C指数最高,均为0.800,相对于使用全部特征有一定的性能提升
✨ 基础代码 ✨
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']
)
from lifelines.utils import concordance_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)
利用XGBoost的Cox生存模型(survival:cox)对数据集进行生存分析建模,通过训练集拟合模型后,用于后续的特征贡献排名获取(在文献中只提到递归,对于特征贡献获取并没有具体提到是通过XGBoost排名,还是根据前面对XGBoost模型所作的SHAP排名,这里利用的是XGBoost排名)
# 获取特征重要性并排序
feature_importances = bst.get_score(importance_type='weight') # 获取每个特征的权重
sorted_importances = sorted(feature_importances.items(), key=lambda x: x[1], reverse=True)
# 将特征重要性和特征名称整理成 DataFrame
importance_df = pd.DataFrame(sorted_importances, columns=['feature', 'importance'])
# 对特征进行排名
importance_df['importance'] = importance_df['importance'] / importance_df['importance'].sum() # 归一化
importance_df['rank'] = importance_df['importance'].rank(ascending=False)
importance_df
提取在完整数据集上XGBoost模型中各特征的重要性,对其进行归一化和排名,以找出对生存预测影响最大的特征,并接下来接下来的递归特征选择
from sklearn.model_selection import KFold
# 存储每次交叉验证的 C-index、新添加的特征名和贡献度
cv_scores = []
selected_features = [] # 用于存储每次添加的特征名
contributions = [] # 用于存储每次添加的特征贡献度
# 进行递归特征添加,检查模型的 C-index
sorted_features = importance_df['feature'].tolist()
kf = KFold(n_splits=10, shuffle=True, random_state=10) # 定义 10 折交叉验证
for i in range(1, len(sorted_features) + 1):
X_subset = X_train[sorted_features[:i]] # 逐步选择特征
fold_c_indices = [] # 用于存储每个折叠的 C-index
for train_index, val_index in kf.split(X_subset):
X_train_fold, X_val_fold = X_subset.iloc[train_index], X_subset.iloc[val_index]
y_train_fold, y_val_fold = y_train.iloc[train_index], y_train.iloc[val_index]
....
# 计算当前特征集的平均 C-index
mean_c_index = np.mean(fold_c_indices)
cv_scores.append(mean_c_index) # 保存平均 C-index
# 保存当前添加的特征
selected_features.append(sorted_features[i - 1]) # 只保存当前添加的特征
# 获取当前特征的贡献度
feature_contribution = bst_rfe.get_score(importance_type='weight').get(sorted_features[i - 1], 0)
contributions.append(feature_contribution) # 保存贡献度
# 创建 DataFrame 存储每个特征集的 C-index、新添加的特征名和贡献度
feature_selection = pd.DataFrame({
'feature_num': range(1, len(cv_scores) + 1),
'cv_result': cv_scores,
'selected_features': selected_features, # 存储每次添加的特征名
'contribution': contributions # 存储每次添加的特征贡献度
})
feature_selection
通过递归特征添加(RFE)和10折交叉验证 评估每次添加新特征后模型的C-index,并记录每次添加的特征及其贡献度
为什么每折的平均C-index被用作最终的评价指标,是因为在机器学习中,交叉验证用于评估模型的性能。通过将数据集划分为K个折,模型在每个折上训练和验证,可以更全面地评估模型在不同数据子集上的表现,每折的C-index反映了模型在该折数据上的性能。最终的平均C-index可以提供一个更可靠、更稳健的模型性能评估,避免因某一折数据的偶然性或噪音导致的评估偏差
可以看到,5个特征时,C-index达到最高值(0.6289),表明选取较少的特征可能会提高模型的预测性能,所以接下来的模型构建是针对这个五个特征的特征子集进行
from sklearn.model_selection import train_test_split
# 划分特征和目标变量
X = df[top_5_features]
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']
)
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 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)
# 构建 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)
from sksurv.ensemble import GradientBoostingSurvivalAnalysis
from sklearn.metrics import make_scorer
gbsa = GradientBoostingSurvivalAnalysis(random_state=random_state)
gbsa.fit(X_train, y_train_surv)
train_c_index_GBSA = gbsa.score(X_train, y_train_surv)
test_c_index_GBSA = gbsa.score(X_test, y_test_surv)
from sksurv.svm import FastKernelSurvivalSVM
# 创建 FastKernelSurvivalSVM 模型
fksvm = FastKernelSurvivalSVM(random_state=random_state)
# 使用训练数据进行拟合
fksvm.fit(X_train, y_train_surv)
# 计算并打印训练集和测试集的 C-index
train_c_index_FKSSVM = fksvm.score(X_train, y_train_surv)
test_c_index_FKSSVM = fksvm.score(X_test, y_test_surv)
实现多个生存分析模型的训练和评估,包括Cox、RSF、XGBoost、GBSA和SSVM,当然这里没有进行调参,默认参数下的模型
data = {
'模型-递归特征': ['CoxPH', 'RSF', 'XGB', 'GBSA', 'SSVM'],
'训练集 C-index': [
c_index_train_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
显示递归特征选择后不同生存分析模型(CoxPH、RSF、XGB、GBSA 和 SSVM)在训练集和测试集上的C-index评分,表明RSF和GBSA在训练和测试集上的表现最好,而SSVM在所有模型中表现较差
这是针对所有特征进行模型构建的结果,对比这两组结果可以发现,递归特征筛选显著提升了模型的性能,尤其是在测试集上的表现。在没有进行特征筛选的情况下,尽管RSF和GBSA模型在训练集上表现较好,但XGB和CoxPH的表现则有所提升,尤其是在测试集上使用RFE后,它们的C-index值得到了显著提高。同时,SSVM模型在两种情况下都表现较差。特征选择帮助减少了模型的过拟合,尤其是在使用全部34个特征时,模型在训练集上的C-index较高,但在测试集上的表现差异较大,尤其是XGB和SSVM,这表明过多的特征可能导致过拟合,而通过递归特征筛选后,模型能更好地在测试集上泛化,提升了稳定性。优化后的特征数量使得模型能够更精准地捕捉到关键的生存信息,并显著提升了模型的泛化能力,特别是在RSF和GBSA模型中,经过特征筛选后表现更加稳定且具有更强的泛化能力
当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息
✨ 该文章案例 ✨
在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。
同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。
✨ 书籍推荐 ✨
无论你是零编程基础的科研新手,还是想提升机器学习技能的医学科研工作者,这本书都能带你从入门到进阶,掌握Python数据分析+医学AI应用的全流程技能
✨ 介绍 ✨
本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,下方提供淘宝店铺二维码获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。
更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。
✨ 群友反馈 ✨
✨ 淘宝店铺 ✨
请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容 ,希望能为您的学习之路提供帮助!
✨ AI工具推荐 ✨
✨ 赠书活动 ✨
支持知识分享,畅享学习乐趣!特别感谢清华大学出版社 对本次赠书活动的鼎力支持!即日起,只需点赞、推荐、转发 此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送清华出版社提供的《Al Agent智能体与MCP开发实践基于Qwen3大模型》这本精彩书籍📚!
💡 赶快参与,一键三连,说不定你就是那位幸运读者哦!
往期推荐
期刊配图:模型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倍交叉验证
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考
