K折交叉验证结合RFE与随机森林:特征选择全过程可视化
背景
在机器学习和数据建模中,特征选择是一个至关重要的步骤,如何从成百上千的特征中选择对模型最有效的少数特征,直接影响到模型的准确性、泛化能力以及解释性,本文的灵感来源于一项研究(见下图),该研究利用随机森林(Random Forest)和递归特征消除(RFE)结合交叉验证(CV)来选择最优特征组合,并通过一系列实验展示了如何逐步优化模型性能
在上图的三个小节中,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()
数据集来源于一个名为“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()
这里使用递归特征消除(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()
图形展示了递归特征消除结合交叉验证(RFECV)在特征选择过程中的表现,横轴表示被选择的特征数量,纵轴表示交叉验证的准确率(accuracy)
- 灰色线条和点:每个灰色点表示一次交叉验证的准确率,每条灰色线表示一折交叉验证的变化趋势,可以看出,随着特征数量的增加,模型的准确率先逐渐提高,达到一个最佳点后,开始波动且趋于平稳
- 黑色粗线:表示五次交叉验证中每次的平均准确率,它表明随着特征数量的增加,模型的表现总体上呈现出先上升后趋于平稳的趋势
- 红色虚线:标出了最优特征数量(18个),即在18个特征时交叉验证的平均准确率达到了最大值
从图中可以看出,选择18个特征时,模型的交叉验证准确率达到了峰值,意味着这是一个最佳特征子集,进一步增加特征没有带来显著的准确率提升,反而可能增加模型的复杂度或导致轻微的过拟合,因此,18个特征是最优的选择
在模型优化和特征选择过程中,目标函数的选择至关重要,不同的目标函数会影响模型的优化方向以及最终的评估结果,比如,分类问题中常用的目标函数包括准确率(accuracy)、ROC AUC、F1-score等,如果数据集存在类别不均衡问题,单纯依赖准确率可能会误导模型的性能评估,因为模型可能通过偏向多数类获得较高的准确率,这时,选择ROC AUC或F1-score作为目标函数,能够更好地衡量模型在区分不同类别时的表现。因此,在特征选择和模型评估过程中,目标函数的合理选择能够有效提升模型的泛化能力,避免因不合适的评估标准导致模型过拟合或效果不理想