背景
在机器学习模型构建的过程中,特征选择是一项至关重要的步骤。它不仅能够减少模型的复杂度,还能提升模型的预测性能和稳定性,接下来将介绍一种强大的特征选择方法——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()
数据集来源于一个名为“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)
结果显示,BorutaShap 特征选择过程中,确认了 5 个重要特征(如 BMI、左心房直径、房颤类型等),40 个特征被认为不重要(如脑梗死、心肌病、糖尿病等),并且还剩下 1 个待定特征(‘F’)
可视化特征选择结果
# 绘制特征选择的结果
Feature_Selector.plot(which_features='all')
用于绘制 BorutaShap 特征选择的结果,which_features='all' 表示显示所有特征,还可以选择 which_features='accepted' 仅展示被选中的重要特征,或 which_features='tentative' 仅展示待定特征
图是 BorutaShap 特征选择过程中展示的特征重要性结果,纵轴是 Z-score,横轴是各个特征。我们可以通过不同颜色的箱线图来理解特征的重要性:
- 绿色代表对模型预测结果有显著贡献的特征,这些特征被认为是重要的
- 红色代表不重要的特征,表示这些特征对模型预测没有显著贡献
- 黄色表示待定特征(即特征的重要性不确定),它们可能会影响模型性能,但需要进一步验证,Z-score 值越高的特征,其对模型的贡献越大,越有可能被选为重要特征
- 图中还包含了影子特征(图中右侧的蓝色盒子),这些是通过随机打乱后的特征,用于与实际特征对比,判断实际特征是否比随机特征更具重要性
通过这个图,可以直观地看到每个特征在模型中的贡献,并根据颜色区分哪些特征是被保留的,哪些是被剔除的
获取筛选后的特征子集
# 返回具有所选特征的原始数据的子集
subset = Feature_Selector . Subset ()
subset
从训练据中返回经过 BorutaShap 特征选择后保留的特征子集,进行后续建模使用
总结
BorutaShap提供了一个高效且易用的特征选择方法,特别是在处理复杂的数据集时尤为出色,它的优势不仅仅在于提升模型性能,更在于帮助理解特征对模型预测的影响,如果在模型训练中遇到了特征冗余或模型解释性不足的问题,BorutaShap将是一个非常值得尝试的工具,读者 可以根据自己的数据集和模型需求,灵活地使用它来提高特征选择的效率和模型的性能
往期推荐
基于相关性与标准差的多模型评价指标可视化比较 —— 泰勒图应用解析
微信号|deep_ML
欢迎添加作者微信进入Python、ChatGPT群
进群请备注Python或AI进入相关群
无需科学上网、同步官网所有功能、使用无限制
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考