如何在tidymodels(R)中用CRAN包实现可推断的特征选择
在tidymodels中用CRAN包实现可推断的逻辑回归特征选择
因为正则化模型无法直接提供参数置信区间,你可以通过先筛选特征,再拟合普通逻辑回归的方式满足需求,以下是几种基于CRAN包的可行方案:
方案1:用recipes包的逐步特征选择(基于AIC/BIC)
recipes是tidymodels核心CRAN包,内置了基于信息准则的逐步选择工具,筛选后拟合普通逻辑回归即可进行推断。
步骤示例:
- 加载所需包
library(tidymodels) tidymodels_prefer()
- 数据准备(以内置
attrition数据集为例)
data(attrition, package = "modeldata") set.seed(123) attr_split <- initial_split(attrition, strata = Attrition) attr_train <- training(attr_split) attr_test <- testing(attr_split)
- 创建包含逐步选择的预处理配方
这里用向后逐步选择,基于AIC筛选与Attrition相关的特征:
attr_rec <- recipe(Attrition ~ ., data = attr_train) %>% step_dummy(all_nominal_predictors(), -all_outcomes()) %>% step_naomit(all_predictors()) %>% step_backward( Attrition ~ ., direction = "backward", trace = FALSE, metric = "AIC", model = logistic_reg() %>% set_engine("glm") )
- 定义支持推断的普通逻辑回归模型
logit_spec <- logistic_reg() %>% set_engine("glm") %>% set_mode("classification")
- 创建工作流并拟合
logit_wf <- workflow() %>% add_recipe(attr_rec) %>% add_model(logit_spec) logit_fit <- fit(logit_wf, data = attr_train)
- 获取参数置信区间
tidy(logit_fit, conf.int = TRUE)
方案2:整合MASS包的stepAIC(经典逐步选择)
MASS是CRAN经典统计包,其stepAIC函数支持基于AIC的逐步选择,可通过tidymodels接口整合使用。
步骤示例:
- 加载MASS包
library(MASS)
- 拟合全模型并执行逐步选择
# 先拟合全量特征的逻辑回归 full_fit <- fit(logit_spec, Attrition ~ ., data = attr_train) # 用stepAIC进行双向逐步选择 step_fit <- stepAIC(full_fit$fit, direction = "both", trace = FALSE)
- 输出带置信区间的参数结果
tidy(step_fit, conf.int = TRUE)
方案3:基于特征重要性的筛选(结合vip包)
vip是CRAN包,可提取模型特征重要性,筛选高重要性特征后重新拟合普通逻辑回归。
步骤示例:
- 加载vip包
library(vip)
- 拟合全模型并提取特征重要性
full_logit_fit <- fit(logit_spec, Attrition ~ ., data = attr_train) # 查看特征重要性排序 imp_scores <- vi(full_logit_fit) %>% arrange(desc(Importance))
- 筛选特征并重新拟合
比如选择重要性前10的特征:
top_features <- imp_scores$Variable[1:10] # 创建仅包含高重要性特征的配方 top_rec <- recipe(Attrition ~ ., data = attr_train) %>% step_dummy(all_nominal_predictors(), -all_outcomes()) %>% step_naomit(all_predictors()) %>% step_select(all_of(top_features), Attrition) # 重新拟合模型并获取置信区间 top_logit_fit <- workflow() %>% add_recipe(top_rec) %>% add_model(logit_spec) %>% fit(data = attr_train) tidy(top_logit_fit, conf.int = TRUE)
注意事项
- 所有方案最终都拟合了未正则化的逻辑回归模型,因此可正常计算参数置信区间并进行统计推断。
- 逐步选择存在过拟合风险,建议结合交叉验证(如
fit_resamples())验证模型泛化性能。
内容的提问来源于stack exchange,提问作者Aegis
相关产品推荐
相关产品推荐

