RFECV 是递归特征消除(RFE)与交叉验证相结合的特征选择算法,以下是对它的具体介绍:
基本原理
RFECV 首先使用递归特征消除的方法,每次迭代中,基于当前特征集训练基模型,计算各特征的重要性,剔除最不重要的特征,直至达到设定的最小特征数。然后,在每次迭代过程中,对不同特征子集进行交叉验证,评估其模型性能,最终选择平均性能最优的特征子集对应的特征数量作为最终结果。
参数说明
- estimator :需选择一个有 fit 方法且可通过 coef_ 或 feature_importances_ 属性提供特征重要性信息的监督学习估计器,如支持向量机、逻辑回归、决策树或随机森林等。
- step :控制每次迭代中移除的特征数量。若大于等于 1,则表示每次移除的特征整数个数;若在 (0.0, 1.0) 区间内,则代表每次移除的特征占总特征比例,且该比例会被向下取整,最后一次迭代可能会少移除一些特征以达到最小特征数要求,默认为 1。
- min_features_to_select :设定至少要保留的特征数量,默认为 1,此数量的特征总会被参与评估,即使原始特征数与该值之差无法被 step 整除。
- cv :确定交叉验证的划分策略。可为 None,此时采用默认的 5 折交叉验证;也可以是整数,指定折数;或是 CV 分割器、可迭代产生训练测试集索引的 object,默认为 None。
- scoring :指定用于评估模型性能的指标,如准确率、均方误差等。若为 None,则使用 estimator 的默认评分函数。
- verbose :控制输出的冗余度,0 意味着不输出训练过程,1 则表示输出一些信息,默认为 0。
- n_jobs :设置交叉验证并行执行时的 CPU 核心数,若为 None 则不使用并行,默认为 None。
- importance_getter :决定如何获取特征重要性,一般取默认值 “auto” 即可。
优势
- 提高模型性能 :通过去除冗余特征,减少过拟合风险,使模型在新数据上表现更佳,提高泛化能力。
- 降低计算成本 :减少特征数量可缩短模型训练时间,节省计算资源。
- 增强可解释性 :选出的特征更精简,有助于理解模型决策依据。
应用场景
- 生物医学领域 :如大连医科大学研究中,利用 RFECV 结合随机森林、SVM 等模型的特征重要性,确定白细胞、NLR、D - 二聚体等 7 个关键变量作为诊断工具的特征子集,帮助构建更有效的疾病诊断模型。
- 遥感领域 :在红树林冠层高度反演研究中,采用 5 折交叉验证的 RFECV,从 238 个特征中优选 119 个关键变量,避免过拟合,提升模型计算效率。
Python 实现示例
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import RFECV
# 创建数据集
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建随机森林分类器
estimator = RandomForestClassifier(random_state=42)
# 创建 RFECV 对象,设置交叉验证折数为 5
selector = RFECV(estimator, step=1, cv=5)
# 训练 RFECV 对象
selector.fit(X_train, y_train)
# 输出所选特征及其数量
selected_features = selector.support_
print(f"Selected features: {selected_features}")
print(f"Optimal number of features: {selector.n_features_}")
# 使用所选特征重新训练模型并评估性能
estimator.fit(X_train[:, selected_features], y_train)
print(f"Model accuracy: {estimator.score(X_test[:, selected_features], y_test)}")
以上内容是对 RFECV 算法的详细介绍了,你可以根据实际情况进行选择和使用。