如何用tidymodels结合交叉验证比较不同特征的线性回归模型?
用tidymodels交叉验证比较不同特征的线性回归模型
核心思路
同类型模型(均为线性回归)但特征不同的比较,核心是给每个特征组合定义独立的建模工作流,然后在完全相同的交叉验证折上分别拟合评估,最后基于交叉验证的RMSE结果做公平对比。
具体步骤与代码示例
1. 加载依赖包
library(tidymodels) library(tidyverse)
2. 生成交叉验证折
先基于你的数据集创建交叉验证划分,确保三个模型共用同一套样本拆分,消除样本差异对结果的影响:
# 假设你的数据集名为df,包含目标变量y、自变量a和b cv_folds <- vfold_cv(df, v = 10, repeats = 3) # 10折交叉验证重复3次,可按需调整
3. 定义各模型的工作流
每个特征组合对应一个独立工作流,绑定线性回归模型和对应公式:
# 模型A:仅用特征a wf_a <- workflow() %>% add_model(linear_reg() %>% set_engine("lm")) %>% add_formula(y ~ a) # 模型B:仅用特征b wf_b <- workflow() %>% add_model(linear_reg() %>% set_engine("lm")) %>% add_formula(y ~ b) # 模型AB:同时用a和b wf_ab <- workflow() %>% add_model(linear_reg() %>% set_engine("lm")) %>% add_formula(y ~ a + b)
4. 运行交叉验证拟合
用fit_resamples在交叉验证折上拟合每个工作流,指定评估指标为RMSE:
# 指定仅评估RMSE(可按需添加mae等其他指标) metric_spec <- metric_set(rmse) # 分别拟合三个模型的交叉验证 results_a <- fit_resamples(wf_a, resamples = cv_folds, metrics = metric_spec) results_b <- fit_resamples(wf_b, resamples = cv_folds, metrics = metric_spec) results_ab <- fit_resamples(wf_ab, resamples = cv_folds, metrics = metric_spec)
5. 汇总并对比结果
收集所有模型的交叉验证指标,通过数值或可视化方式比较性能:
# 合并三个模型的结果 all_results <- bind_rows( collect_metrics(results_a) %>% mutate(model = "model_A"), collect_metrics(results_b) %>% mutate(model = "model_B"), collect_metrics(results_ab) %>% mutate(model = "model_AB") ) # 查看RMSE的均值、标准误等统计量 all_results %>% select(model, .metric, mean, std_err, n) # 可视化RMSE对比(带95%置信区间) all_results %>% filter(.metric == "rmse") %>% ggplot(aes(x = model, y = mean, ymin = mean - 1.96*std_err, ymax = mean + 1.96*std_err)) + geom_pointrange(color = "#2E86AB") + labs(title = "交叉验证RMSE对比", y = "平均RMSE(95%置信区间)", x = "模型") + theme_minimal()
补充说明
- 若需判断模型间性能差异是否显著,可针对各折的RMSE结果做配对t检验,或使用
tidyposterior包做贝叶斯后验对比。 - 若数据集存在类别变量或需要标准化,可在工作流中添加预处理步骤(如
add_recipe),确保三个模型的预处理逻辑一致。
内容的提问来源于stack exchange,提问作者filebb
相关产品推荐
相关产品推荐

