期刊配图:变量重要性排序与顺序正向选择的特征筛选可视化

机器学习大数据数据库

picture.image

背景

picture.image

picture.image

picture.image

在大数据与人工智能驱动下,机器学习(ML)方法已成为提升疾病风险预测模型性能的有力工具。 相比传统统计方法,ML具有处理高维数据和复杂特征关系的显著优势。 然而,在实际应用中,特征选择仍是构建高效预测模型的关键步骤。 本篇文章将基于模拟数据集,复现文献中图A关于特征选择过程的可视化图表,并重点展示模型性能如何通过特征选择优化

文献中通过轻量级梯度提升机(LightGBM, LGBM)分类器确定每个变量的重要性,按照变量重要性排序后,结合逐步特征添加策略完成特征选择。本次复现为简化操作,将默认数据集不存在多重共线性,从而跳过层次聚类步骤。最终,将绘制类似文献中累积AUC(受试者工作特征曲线下的面积)随特征数量变化的曲线,以直观展示关键特征对模型性能的贡献

代码实现

数据读取整理


          
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
          
from sklearn.model_selection import train_test_split
          
df = pd.read_excel('2025-1-4公众号Python机器学习AI.xlsx')
          
# 划分特征和目标变量
          
X = df.drop(['y'], axis=1)
          
y = df['y']
          
# 划分训练集和测试集
          
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, 
          
                                                    random_state=42, stratify=df['y'])
      

读取模拟数据集,将特征 (X) 和目标变量 (y) 分开后,利用 train_test_split 将数据划分为训练集和测试集(70%训练集,30%测试集),强调该数据为模拟数据,并非文献中的真实数据

LGBM分类器确定每个变量的重要性


          
import lightgbm as lgb
          

          
# 创建LGBM分类器
          
lgbm_clf = lgb.LGBMClassifier(random_state=42, verbose=-1)
          
# 训练模型
          
lgbm_clf.fit(X_train, y_train)
          

          
# 获取特征重要性
          
feature_importances = lgbm_clf.feature_importances_
          

          
# 构建特征重要性排名
          
feature_importance_df = pd.DataFrame({
          
    'Feature': X.columns,
          
    'Importance': feature_importances
          
}).sort_values(by='Importance', ascending=False)
          

          

          
# 只取前30个重要特征
          
top_n = 30
          
top_features = feature_importance_df.head(top_n)
          

          
plt.figure(figsize=(12, 8))  
          
plt.barh(top_features['Feature'], top_features['Importance'], color='skyblue')
          
plt.xlabel('Importance', fontsize=14)  
          
plt.ylabel('Feature', fontsize=14)  
          
plt.title(f'Top {top_n} Feature Importance', fontsize=16)  
          
plt.xticks(fontsize=12)  
          
plt.yticks(fontsize=12)  
          
plt.gca().invert_yaxis()  
          
plt.savefig("1.png", format='png', bbox_inches='tight')
          
plt.show()
      

picture.image

使用LightGBM分类器训练模型后,根据特征重要性对前30个特征进行可视化排名,并生成柱状图;需要注意,LightGBM返回的特征重要性有多种计算方式(如分裂次数、信息增益等),此处默认使用分裂次数

逐步特征添加与模型性能评估:基于ROC AUC的特征选择流程


          
from sklearn.metrics import roc_auc_score
          

          
# 初始化存储结果的DataFrame
          
selection_results = pd.DataFrame(columns=['Feature', 'Importance', 'ROC'])
          

          
# 初始化用于训练的特征列表
          
selected_features = []
          

          
# 依次添加特征
          
for i in range(len(top_features)):
          
    # 当前特征
          
    current_feature = top_features.iloc[i]['Feature']
          
    selected_features.append(current_feature)
          

          
    # 训练模型(仅使用当前选定的特征)
          
    X_train_subset = X_train[selected_features]
          
    X_test_subset = X_test[selected_features]
          

          
    # 创建并训练LGB模型
          
    lgbm_clf = lgb.LGBMClassifier(random_state=42, verbose=-1)
          
    lgbm_clf.fit(X_train_subset, y_train)
          

          
    # 预测并计算ROC AUC分数
          
    y_pred_proba = lgbm_clf.predict_proba(X_test_subset)[:, 1]  # 概率分数
          
    roc_score = roc_auc_score(y_test, y_pred_proba)
          

          
    # 保存结果 
          
    selection_results.loc[len(selection_results)] = [
          
        current_feature,
          
        top_features.iloc[i]['Importance'],
          
        roc_score
          
    ]
          

          
selection_results
      

picture.image

通过逐步添加按特征重要性排序的特征,训练多个LightGBM分类器并评估其性能。每次将一个新特征加入用于训练的特征集合,重新训练模型,计算测试集上的ROC AUC分数,并将当前特征名、重要性值及对应的ROC AUC分数存储到 selection_results 数据框中,从而直观展示每个特征对模型性能的增量贡献


          
# 将 Importance 列百分比化并归一化
          
selection_results['Importance'] = (
          
    selection_results['Importance'] / selection_results['Importance'].sum()
          
)
          
selection_results
      

picture.image

将特征的重要性(Importance)归一化为百分比(总和为1),这样做是为了固定特征重要性范围,方便可视化,同时由于原始重要性基于分裂次数,归一化不会改变其排名顺序

特征贡献与AUC性能关系

picture.image

通过柱状图和折线图可视化特征的重要性和累积AUC表现,并高亮展示前8个关键特征对模型性能的贡献

在文献的特征选择可视化中,细心的读者可能会注意到折线图存在红色阴影部分。然而,文献中并未详细说明该阴影的具体含义或计算方式。基于常见的解释,暂且认为这个红色阴影代表的是ROC-AUC的置信区间。为了进一步优化分析,接下来引入K折交叉验证来计算模型性能的置信区间,并对图表进行改进,以更直观和准确地展示特征选择对模型性能的影响

K折交叉验证的置信区间可视化

picture.image

使用K折交叉验证对每个新增特征集合进行模型性能评估,计算其平均ROC AUC值,并基于每折的结果计算95%置信区间,最终通过可视化展现特征贡献度与模型性能的关系。K折交叉验证通过多次将数据划分为训练集和验证集,可以更稳健地评估模型性能,减少因数据划分随机性带来的偏差。引入置信区间后,可视化中不仅展示了每个特征集合对应的平均ROC AUC分数,还通过阴影部分反映了模型性能的稳定性和不确定性,使分析更加直观和可信,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系

往期推荐

期刊配图:SHAP可视化改进依赖图+拟合线+边缘密度+分组对比

期刊配图:基于t-sne降维与模型预测概率的分类效果可视化

期刊配图:多种机器学习算法结合SHAP特征贡献在递归特征选择中的运用

置信区间+误差条:机器学习分类评价指标精美呈现

SCI图表:基于相关性和标准差的多模型评价——泰勒图解析

期刊文章配图:基于分组折线图的多机器学习模型表现评估对比

复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性

SCI图表复现:优化SHAP特征贡献图展示更多模型细节

复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展

复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化

SCI图表复现:特征相关性气泡热图展示

一图胜千言:回归预测模型训练集与测试集的进阶可视化

期刊文章配图:基于雷达图的多机器学习模型表现评估对比

期刊文章配图:斯皮尔曼相关系数热图反应非线性变量相关性

picture.image

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

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论