K折交叉验证结合RFE与随机森林:特征选择全过程可视化

机器学习NoSQL数据库云安全

picture.image

背景

在机器学习和数据建模中,特征选择是一个至关重要的步骤,如何从成百上千的特征中选择对模型最有效的少数特征,直接影响到模型的准确性、泛化能力以及解释性,本文的灵感来源于一项研究(见下图),该研究利用随机森林(Random Forest)和递归特征消除(RFE)结合交叉验证(CV)来选择最优特征组合,并通过一系列实验展示了如何逐步优化模型性能

picture.image

在上图的三个小节中,A、D、G分别展示了随着特征数量减少,交叉验证误差的变化。可以看到,每条折线代表了交叉验证的过程,模型通过反复训练和测试来找到使误差最小的特征子集,这种方法能有效避免过拟合问题,接下来作者将尝试这样的一个特征赛选过程

随机森林与特征选择

随机森林是集成学习的一种,通过构建多棵决策树来完成分类或回归任务,它的优势在于能够自动评估特征的重要性,但为了进一步提高模型性能,可以使用递归特征消除(RFE)方法,逐步去除不重要的特征,保留对模型影响最大的特征

递归特征消除与交叉验证

RFE的原理是基于一个基础模型,不断移除最不重要的特征,直到获得最佳特征子集,结合交叉验证,RFE可以保证在不同数据划分下都能找到最佳的特征组合,进一步提升模型的稳健性,详细的解释参考往期文章——特征选择(嵌入法)—— 递归特征消除 RFE、 RFE-CV

本文将基于一个多特征二分类数据集,使用RFE结合随机森林进行特征选择,并可视化展示每折结果及最优特征数组合

代码实现

导入必要的库和数据


          
import pandas as pd
          
import numpy as np
          
import matplotlib.pyplot as plt
          
from sklearn.model_selection import train_test_split
          
plt.rcParams['font.family'] = 'Times New Roman'
          
plt.rcParams['axes.unicode_minus'] = False
          

          
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筛选出对目标变量预测最有用的特征

递归特征消除与交叉验证:选择最优特征组合


          
from sklearn.ensemble import RandomForestClassifier
          
from sklearn.feature_selection import RFECV
          
from sklearn.model_selection import StratifiedKFold
          
# 初始化随机森林分类器
          
clf = RandomForestClassifier(random_state=42)
          

          
# 定义StratifiedKFold用于交叉验证
          
cv = StratifiedKFold(n_splits=5)
          

          
# 递归特征消除和交叉验证
          
rfecv = RFECV(estimator=clf, step=1, cv=cv, scoring='accuracy')
          
rfecv.fit(X_train, y_train)
          

          
# 打印最佳特征数量
          
print(f"Optimal number of features: {rfecv.n_features_}")
          

          
# 获取交叉验证每一折的分数
          
cv_results = rfecv.cv_results_
          

          
# 取出5次交叉验证的单独分数
          
fold_scores = [cv_results[f'split{i}_test_score'] for i in range(5)]
          
mean_scores = cv_results['mean_test_score']  # 计算平均得分
          
# 输出选择的特征列
          
selected_features = X_train.columns[rfecv.support_]
          
print(f"Selected features: {list(selected_features)}")
          
df_selected = df[selected_features]
          
df_selected.head()
      

picture.image

这里使用递归特征消除(RFECV)结合随机森林分类器对特征进行筛选,找出了对模型准确性影响最大的18个特征。通过5折交叉验证评估每个特征子集的性能,最终选择了使模型表现最佳的特征组合,这些特征包括“年龄”、“BMI”、“左房直径”等生理和手术相关的指标,表明它们在预测结果(如心房颤动类型)时最具影响力,结果表格展示了优化后的特征数据集,列出了筛选出的特征及其对应的样本数据,方便后续的模型训练和分析,这一步骤不仅提升了模型的精度,还减少了不必要的特征,增强了模型的可解释性和计算效率

交叉验证中的特征选择与模型准确性评估图


          
plt.figure(figsize=(12, 8), dpi=1200)
          
plt.title('Recursive Feature Elimination with Cross-Validation (RFCV)', fontsize=16, fontweight='bold', pad=20)
          
plt.xlabel('Number of features selected', fontsize=14, labelpad=15)
          
plt.ylabel('Cross-validation score (accuracy)', fontsize=14, labelpad=15)
          
# 设置背景颜色
          
plt.gca().set_facecolor('#f7f7f7')
          
# 绘制每一条灰色线,表示5次交叉验证
          
for i in range(5):
          
    plt.plot(range(1, len(fold_scores[i]) + 1), fold_scores[i], marker='o', color='gray', linestyle='-', 
          
             linewidth=0.8, alpha=0.6)
          
# 绘制淡黑色线,表示平均交叉验证得分
          
plt.plot(range(1, len(mean_scores) + 1), mean_scores, marker='o', color='#696969', linestyle='-', 
          
         linewidth=3, label='Mean CV Accuracy')
          
# 绘制最佳特征数的垂直线
          
plt.axvline(x=rfecv.n_features_, color='#E76F51', linestyle='--', linewidth=2, label=f'Optimal = {rfecv.n_features_}')
          
plt.legend(fontsize=12, loc='best', frameon=True, shadow=True, facecolor='white', framealpha=0.9)
          
plt.grid(True, which='both', linestyle='--', linewidth=0.5, alpha=0.7)
          
plt.xticks(fontsize=12)
          
plt.yticks(fontsize=12)
          
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)
          
plt.savefig('分类.pdf', format='pdf', bbox_inches='tight')
          
plt.show()
      

picture.image

图形展示了递归特征消除结合交叉验证(RFECV)在特征选择过程中的表现,横轴表示被选择的特征数量,纵轴表示交叉验证的准确率(accuracy)

  • 灰色线条和点: 每个灰色点表示一次交叉验证的准确率,每条灰色线表示一折交叉验证的变化趋势, 可以看出,随着特征数量的增加,模型的准确率先逐渐提高,达到一个最佳点后,开始波动且趋于平稳
  • 黑色粗线:表示五次交叉验证中每次的平均准确率,它表明随着特征数量的增加,模型的表现总体上呈现出先上升后趋于平稳的趋势
  • 红色虚线:标出了最优特征数量(18个),即在18个特征时交叉验证的平均准确率达到了最大值

从图中可以看出,选择18个特征时,模型的交叉验证准确率达到了峰值,意味着这是一个最佳特征子集,进一步增加特征没有带来显著的准确率提升,反而可能增加模型的复杂度或导致轻微的过拟合,因此,18个特征是最优的选择

在模型优化和特征选择过程中,目标函数的选择至关重要,不同的目标函数会影响模型的优化方向以及最终的评估结果,比如,分类问题中常用的目标函数包括 准确率(accuracy)ROC AUCF1-score 等,如果数据集存在类别不均衡问题,单纯依赖准确率可能会误导模型的性能评估,因为模型可能通过偏向多数类获得较高的准确率,这时,选择 ROC AUCF1-score 作为目标函数,能够更好地衡量模型在区分不同类别时的表现。因此,在特征选择和模型评估过程中,目标函数的合理选择能够有效提升模型的泛化能力,避免因不合适的评估标准导致模型过拟合或效果不理想

往期推荐

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

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

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

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

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

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

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

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

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

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

picture.image

picture.image

picture.image

微信号|deep_ML

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

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

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

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

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
大规模高性能计算集群优化实践
随着机器学习的发展,数据量和训练模型都有越来越大的趋势,这对基础设施有了更高的要求,包括硬件、网络架构等。本次分享主要介绍火山引擎支撑大规模高性能计算集群的架构和优化实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论