使用leaps包regsubsets做前向逐步选择时因子变量拆分问题如何解决
解决regsubsets因子变量按整体参与特征选择的方案
首先明确:leaps包的regsubsets函数默认会对分类因子做哑变量编码,将每个因子水平拆为独立的二元特征单独筛选,原生不支持直接将因子作为整体纳入/排除的逻辑,你观察到的拆分是函数默认行为,和ungroup操作无关。要实现因子级别的整体选择,可以按以下方案操作:
方案1:改用支持因子整体选择的专门包
优先换用更适配因子级特征选择的工具,避免手动修改逻辑:
- 使用
bestglm包:该包封装了leaps的底层计算逻辑,原生支持分类任务(包括逻辑回归)的因子整体选择,只要输入的数据集保持因子类型,开启对应参数后函数会自动将所有因子的所有水平绑定为一个整体,选择时会同时纳入/排除同一个因子的所有哑变量。
示例代码片段:library(bestglm) # 构造输入数据框:要求最后一列是目标变量 input_df <- your_df[, c(setdiff(colnames(your_df), "Revenue"), "Revenue")] # 执行因子整体的前向逐步选择,family指定二分类逻辑回归 res <- bestglm(Xy = input_df, family = binomial, method = "forward", factor.full = TRUE) # 查看最优特征集结果 res$BestModel - 若一定要保留leaps依赖,可配合
regsubsets的force.in参数实现:先提取所有因子变量对应的哑变量列索引,建立因子和对应哑变量的映射关系,遍历因子组合时如果要纳入某因子,就把该因子对应的所有哑变量索引都加入force.in列表,最终按AIC/BIC筛选最优集合即可。
方案2:手动封装regsubsets的筛选逻辑
如果不想更换依赖,可以手动加过滤规则实现约束:
- 预处理数据集,统计每个因子对应的哑变量列名/索引,建立因子与对应哑变量的映射表
- 运行默认的
regsubsets得到所有候选特征集的运行结果 - 过滤结果:仅保留满足「同一个因子的所有哑变量要么全部入选、要么全部不入选」的特征集
- 对过滤后的有效特征集计算AIC、BIC等评估指标,选择最优组合
补充说明
你之前观察到的「Region因子未拆分、其他因子拆分」的差异,是因为Region的因子水平数为2,默认哑变量编码后仅生成1个哑变量,看起来和原变量行为一致,本质还是被拆分处理了,和ungroup操作没有关联。
内容的提问来源于stack exchange,提问作者LJS
相关产品推荐
相关产品推荐

