基于SHAP值的 BorutaShap 算法在特征选择中的应用与优化

机器学习关系型数据库数据安全

picture.image

背景

在机器学习模型构建的过程中,特征选择是一项至关重要的步骤。它不仅能够减少模型的复杂度,还能提升模型的预测性能和稳定性,接下来将介绍一种强大的特征选择方法——BorutaShap,并结合XGBoost分类器展示其具体应用

什么是BorutaShap?

BorutaShap是基于Boruta和SHAP结合的特征选择算法,它不仅通过借助SHAP值来评估特征的重要性,还可以准确保留对目标变量有贡献的特征,从而增强模型的解读性和预测能力

  • Boruta:通过随机打乱特征(称为影子特征),来判断原始特征是否比这些随机特征有用
  • SHAP:为每个特征计算其对模型预测结果的边际贡献,帮助解释每个特征对最终预测的重要性

代码实现

导入必要的库和数据


          
import pandas as pd
          
import numpy as np
          
import matplotlib.pyplot as plt
          
from sklearn.model_selection import train_test_split
          
df = pd.read_csv("Chabuhou.csv ")
          
# 划分特征和目标变量
          
X = df.drop(['Electrical_cardioversion'], axis=1)
          
y = df['Electrical_cardioversion']
          
# 划分训练集和测试集
          
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, 
          
                                                    random_state=42,stratify=df['Electrical_cardioversion'])
          
df.head()
      

picture.image

数据集来源于一个名为“Chabuhou.csv”的文件,目标变量为电击复律(Electrical_cardioversion),将使用BorutaShap筛选出对目标变量预测最有用的特征

初始化BorutaShap与XGBoost


          
from xgboost import XGBClassifier
          
# 初始化XGBoost模型
          
xgb = XGBClassifier(random_state=42)
          
# 使用BorutaShap进行特征选择
          
Feature_Selector = BorutaShap(model=xgb, importance_measure='shap', classification=True)
      

这里使用了 BorutaShap 结合 XGBoost 分类器进行特征选择,若应用于回归任务,只需将 XGBClassifier 更换为 XGBRegressor 并将 classification=True 改为 classification=False,此外,BorutaShap 还支持使用其他模型如 RandomForest、LightGBM、CatBoost 等,只需替换相应的模型并保持相同的特征选择流程即可

进行特征选择


          
# 训练特征选择器
          
Feature_Selector.fit(X=X_train, y=y_train, n_trials=100, sample=False, 
          
                     train_or_test='test', normalize=True, verbose=True)
      

picture.image

结果显示,BorutaShap 特征选择过程中,确认了 5 个重要特征(如 BMI、左心房直径、房颤类型等),40 个特征被认为不重要(如脑梗死、心肌病、糖尿病等),并且还剩下 1 个待定特征(‘F’)

可视化特征选择结果


          
# 绘制特征选择的结果
          
Feature_Selector.plot(which_features='all')
      

picture.image

用于绘制 BorutaShap 特征选择的结果,which_features='all' 表示显示所有特征,还可以选择 which_features='accepted' 仅展示被选中的重要特征,或 which_features='tentative' 仅展示待定特征

图是 BorutaShap 特征选择过程中展示的特征重要性结果,纵轴是 Z-score,横轴是各个特征。我们可以通过不同颜色的箱线图来理解特征的重要性:

  • 绿色代表对模型预测结果有显著贡献的特征,这些特征被认为是重要的
  • 红色代表不重要的特征,表示这些特征对模型预测没有显著贡献
  • 黄色表示待定特征(即特征的重要性不确定),它们可能会影响模型性能,但需要进一步验证,Z-score 值越高的特征,其对模型的贡献越大,越有可能被选为重要特征
  • 图中还包含了影子特征(图中右侧的蓝色盒子),这些是通过随机打乱后的特征,用于与实际特征对比,判断实际特征是否比随机特征更具重要性

通过这个图,可以直观地看到每个特征在模型中的贡献,并根据颜色区分哪些特征是被保留的,哪些是被剔除的

获取筛选后的特征子集


          
# 返回具有所选特征的原始数据的子集
          
subset = Feature_Selector . Subset ()
          
subset 
      

picture.image

从训练据中返回经过 BorutaShap 特征选择后保留的特征子集,进行后续建模使用

总结

BorutaShap提供了一个高效且易用的特征选择方法,特别是在处理复杂的数据集时尤为出色,它的优势不仅仅在于提升模型性能,更在于帮助理解特征对模型预测的影响,如果在模型训练中遇到了特征冗余或模型解释性不足的问题,BorutaShap将是一个非常值得尝试的工具,读者 可以根据自己的数据集和模型需求,灵活地使用它来提高特征选择的效率和模型的性能

往期推荐

SCI图表复现:整合数据分布与相关系数的高级可视化策略

复现顶刊Streamlit部署预测模型APP

树模型系列:如何通过XGBoost提取特征贡献度

SHAP进阶解析:机器学习、深度学习模型解释保姆级教程

特征选择:Lasso和Boruta算法的结合应用

从基础到进阶:优化SHAP力图,让样本解读更直观

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

多模型中的特征贡献度比较与可视化图解

基于相关性与标准差的多模型评价指标可视化比较 —— 泰勒图应用解析

picture.image

picture.image

picture.image

微信号|deep_ML

欢迎添加作者微信进入Python、ChatGPT群

进群请备注Python或AI进入相关群

无需科学上网、同步官网所有功能、使用无限制

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

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
CV 技术在视频创作中的应用
本次演讲将介绍在拍摄、编辑等场景,我们如何利用 AI 技术赋能创作者;以及基于这些场景,字节跳动积累的领先技术能力。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论