期刊复现:基于递归特征筛选的XGBoost、RSF、COX、GBSA与SSVM生存分析模型性能提升

机器学习算法数据库

picture.image

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

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

✨ 论文信息 ✨

picture.image

picture.image

阅读该文章前,请先阅读前文——期刊复现:COX、XGB、RSF、GBSA与SSVM模型在生存分析中的应用与SHAP解释,在使用所有34个候选变量进行训练并未进行特征消除或提取的情况下,最优模型为XGBoost。随后,对该模型进行SHAP解释,深入分析各个特征对预测结果的影响

picture.image

接着,进行递归特征消除,得到新的10个特征的特征子集,并重新建立模型得到新的模型评估结果

picture.image

最终在测试集上,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

picture.image

提取在完整数据集上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

picture.image

通过递归特征添加(RFE)和10折交叉验证 评估每次添加新特征后模型的C-index,并记录每次添加的特征及其贡献度

为什么每折的平均C-index被用作最终的评价指标,是因为在机器学习中,交叉验证用于评估模型的性能。通过将数据集划分为K个折,模型在每个折上训练和验证,可以更全面地评估模型在不同数据子集上的表现,每折的C-index反映了模型在该折数据上的性能。最终的平均C-index可以提供一个更可靠、更稳健的模型性能评估,避免因某一折数据的偶然性或噪音导致的评估偏差

picture.image

可以看到,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

picture.image

显示递归特征选择后不同生存分析模型(CoxPH、RSF、XGB、GBSA 和 SSVM)在训练集和测试集上的C-index评分,表明RSF和GBSA在训练和测试集上的表现最好,而SSVM在所有模型中表现较差

picture.image

这是针对所有特征进行模型构建的结果,对比这两组结果可以发现,递归特征筛选显著提升了模型的性能,尤其是在测试集上的表现。在没有进行特征筛选的情况下,尽管RSF和GBSA模型在训练集上表现较好,但XGB和CoxPH的表现则有所提升,尤其是在测试集上使用RFE后,它们的C-index值得到了显著提高。同时,SSVM模型在两种情况下都表现较差。特征选择帮助减少了模型的过拟合,尤其是在使用全部34个特征时,模型在训练集上的C-index较高,但在测试集上的表现差异较大,尤其是XGB和SSVM,这表明过多的特征可能导致过拟合,而通过递归特征筛选后,模型能更好地在测试集上泛化,提升了稳定性。优化后的特征数量使得模型能够更精准地捕捉到关键的生存信息,并显著提升了模型的泛化能力,特别是在RSF和GBSA模型中,经过特征筛选后表现更加稳定且具有更强的泛化能力

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

picture.image

✨ 该文章案例 ✨

picture.image

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

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

✨ 书籍推荐 ✨

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

✨ 介绍 ✨

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

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

✨ 群友反馈 ✨

picture.image

✨ 淘宝店铺 ✨

picture.image

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

✨ AI工具推荐 ✨

picture.image

✨ 赠书活动 ✨

picture.image

支持知识分享,畅享学习乐趣!特别感谢清华大学出版社 对本次赠书活动的鼎力支持!即日起,只需点赞、推荐、转发 此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送清华出版社提供的《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倍交叉验证

picture.image

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

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动 XR 技术的探索与实践
火山引擎开发者社区技术大讲堂第二期邀请到了火山引擎 XR 技术负责人和火山引擎创作 CV 技术负责人,为大家分享字节跳动积累的前沿视觉技术及内外部的应用实践,揭秘现代炫酷的视觉效果背后的技术实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论