基于RMSE与AutoFSelector的RFE特征选择迭代处理技术咨询
问题描述
我想要模拟caret的RFE流程并选择能产生最低RMSE的特征,目前使用AutoFSelector与嵌套重采样,运行代码如下:
ARMSS<-read.csv("Index ARMSS Proteomics Final.csv", row.names=1) set.seed(123, "L'Ecuyer") task = as_task_regr(ARMSS, target = "Index.ARMSS") learner = lrn("regr.ranger", importance = "impurity") set_threads(learner, n = 8) resampling_inner = rsmp("cv", folds = 7) measure = msr("regr.rmse") terminator = trm("none") at = AutoFSelector$new( learner = learner, resampling = resampling_inner, measure = measure, terminator = terminator, fselect = fs("rfe", n_features = 1, feature_fraction = 0.5, recursive = FALSE), store_models = TRUE) resampling_outer = rsmp("repeated_cv", folds = 10, repeats = 10) rr = resample(task, at, resampling_outer, store_models = TRUE)
现咨询两个问题:
- 是否应使用
extract_inner_fselect_archives()命令识别各迭代中RMSE最小的特征集,修改n_features参数后重新运行代码? - 如何调和不同迭代间特征数量及所选特征的差异?
解答
关于是否调整n_features并重新运行
- 完全可以用
extract_inner_fselect_archives()提取所有内部交叉验证的特征选择存档,这能直观看到每个内部迭代中不同特征数量对应的RMSE表现。 - 不需要急于修改
n_features后重新跑完整的嵌套重采样流程。你可以先从存档里统计所有内部迭代中RMSE最低的特征数量的分布:比如统计有多少比例的迭代在k个特征时取得最优RMSE,取这个最常见的k值作为后续固定n_features的参考;或者直接基于现有存档结果,对每个外部折,用对应内部迭代选出的最优特征集来完成评估,无需重新运行。 - 如果你的目标是探索全局最优特征数量,建议把RFE的
n_features设为一个范围(比如从1到总特征数的50%),同时配合合适的终止器(比如trm("evals", n_evals = 20)),让AutoFSelector自动探索不同特征数量的性能,而不是固定死n_features=1。
调和不同迭代间的特征差异
- 统计特征出现频率:汇总所有内部迭代的最优特征集,统计每个特征被选中的次数,优先保留高频入选的特征。比如可以计算每个特征的入选率,设定一个阈值(如入选率>70%)来筛选稳定的核心特征。
- 生成聚合特征集:如果不同迭代的特征差异较大,可以先取所有迭代选出特征的并集,再做一次二次特征筛选(比如基于模型重要性的递归消除或阈值筛选),得到一个兼顾稳定性和预测性能的特征集。
- 调整RFE核心参数:你当前设置
recursive=FALSE,这并非标准的递归特征消除逻辑(标准RFE是每次移除一定比例特征后重新训练,递归迭代)。将recursive改为TRUE,让RFE逐步递归筛选,能得到更稳定的特征排序,减少迭代间的差异;另外调小feature_fraction(比如设为0.2),每次移除更少的特征,也能让筛选过程更稳健。 - 评估并提升稳定性:可以计算不同迭代特征集的Jaccard相似系数,评估特征选择的稳定性。如果相似度过低,说明数据噪声较大或模型稳定性不足,建议先做数据预处理(如标准化、去除低方差特征),或换用更稳定的特征选择方法(如基于模型重要性的逐步筛选)。
内容的提问来源于stack exchange,提问作者awaldman
相关产品推荐
相关产品推荐

