tidymodels工作流文件尺寸远超训练数据的问题咨询
tidymodels工作流过大问题的优化方案
问题背景
引入tidymodels工作流时,发现保存的workflow对象尺寸远大于训练数据,即便用butcher处理后,仍达到原数据的24倍,导致部署应用新数据时内存耗尽。按逻辑,预测仅需recipe步骤、模型系数及训练集统计量(如缩放用的均值/标准差),疑惑为何workflow体积会如此庞大。
原因分析
tidymodels的workflow默认会保留大量非必需信息:
- 模型拟合的完整结果(比如glm对象包含的残差、拟合值等与预测无关的数据)
last_fit()会留存数据集分割规则、测试集预测结果等冗余内容- recipe对象可能附带训练集原始数据或中间计算产物
- 框架自带的元数据、参数记录等额外结构
优化方案
1. 用fit()替代last_fit()
last_fit()会保留测试集相关的全部信息,若仅需用于部署的工作流,直接拟合训练数据即可:
# 直接拟合训练集,避免留存测试集冗余数据 my_fit <- my_workflow %>% fit(data = df_train)
2. 精准精简workflow对象
使用butcher时开启verbose模式,明确移除的组件,确保砍掉所有非预测必需的内容:
# 精简并查看移除的组件详情 trimmed_workflow <- my_fit %>% butcher(verbose = TRUE)
针对glm模型,butcher会自动清理残差、拟合值等无用部分;针对recipe,会删除原始训练数据,仅保留预处理所需的统计量(如均值、分位数)。
3. 启用RDS文件压缩
保存时利用write_rds的压缩参数大幅缩小文件体积:
# 用xz最高压缩比保存,也可选择gz/bz2平衡压缩率与读写速度 trimmed_workflow %>% write_rds("my_fit.rds", compress = "xz")
4. 清理recipe冗余步骤
检查recipe中的操作,移除非必需的中间变量或计算:
- 确保
step_mutate仅生成建模所需变量 - 避免保留与预测无关的中间产物
优化后效果验证
修改代码后重新计算尺寸比例:
size_fit_optimized <- my_fit %>% butcher() %>% obj_size() # 查看优化后的尺寸比例 as.numeric(size_fit_optimized / size_data)
优化后的工作流体积通常仅为原数据的数倍,而非几十倍。
内容的提问来源于stack exchange,提问作者Jordo82
相关产品推荐
相关产品推荐

