背景
在大数据与人工智能驱动下,机器学习(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()
使用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
通过逐步添加按特征重要性排序的特征,训练多个LightGBM分类器并评估其性能。每次将一个新特征加入用于训练的特征集合,重新训练模型,计算测试集上的ROC AUC分数,并将当前特征名、重要性值及对应的ROC AUC分数存储到 selection_results 数据框中,从而直观展示每个特征对模型性能的增量贡献
# 将 Importance 列百分比化并归一化
selection_results['Importance'] = (
selection_results['Importance'] / selection_results['Importance'].sum()
)
selection_results
将特征的重要性(Importance)归一化为百分比(总和为1),这样做是为了固定特征重要性范围,方便可视化,同时由于原始重要性基于分裂次数,归一化不会改变其排名顺序
特征贡献与AUC性能关系
通过柱状图和折线图可视化特征的重要性和累积AUC表现,并高亮展示前8个关键特征对模型性能的贡献
在文献的特征选择可视化中,细心的读者可能会注意到折线图存在红色阴影部分。然而,文献中并未详细说明该阴影的具体含义或计算方式。基于常见的解释,暂且认为这个红色阴影代表的是ROC-AUC的置信区间。为了进一步优化分析,接下来引入K折交叉验证来计算模型性能的置信区间,并对图表进行改进,以更直观和准确地展示特征选择对模型性能的影响
K折交叉验证的置信区间可视化
使用K折交叉验证对每个新增特征集合进行模型性能评估,计算其平均ROC AUC值,并基于每折的结果计算95%置信区间,最终通过可视化展现特征贡献度与模型性能的关系。K折交叉验证通过多次将数据划分为训练集和验证集,可以更稳健地评估模型性能,减少因数据划分随机性带来的偏差。引入置信区间后,可视化中不仅展示了每个特征集合对应的平均ROC AUC分数,还通过阴影部分反映了模型性能的稳定性和不确定性,使分析更加直观和可信,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系
往期推荐
期刊配图:SHAP可视化改进依赖图+拟合线+边缘密度+分组对比
期刊配图:多种机器学习算法结合SHAP特征贡献在递归特征选择中的运用
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考