tidymodels工作流add_recipe()调用失效报错缺失'text'变量的问题
报错核心成因
- 问题出在独立预处理流程与workflow绑定recipe的逻辑完全错位
- 当前操作链路存在本质冲突:你先单独把自定义文本recipe跑完
prep()流程,把原始数据集里的text文本列通过全流程变换转成了词项特征矩阵,再把这份已经删除text列的预处理矩阵,连同仍要求输入包含原始text列的同一份recipe对象,一起塞进workflow准备拟合 - Workflow在拟合启动的第一步,会校验绑定的recipe所需的全部输入变量是否存在于待拟合数据集中。因为传入的数据集是已经完成文本变换、不存在
text列的成品特征矩阵,自然会抛出“缺少配方要求的text变量”的错误
为何三类独立流程可正常运行
- 所有不绑定recipe的流程,本身不存在“校验recipe所需原始输入变量”的环节:
- 搭配
add_formula(type~.)的工作流全程未挂载recipe,只会在传入数据集的现有列中匹配公式对应的变量,根本不会主动查找text列 - 不依赖workflow直接对朴素贝叶斯模型调
fit()时,会直接把公式和预处理好的矩阵传给klaR引擎,引擎不会做额外的输入变量合规性检查 - 搭配
add_variables()指定变量的工作流同样未挂载recipe,只会从传入数据集中匹配你指定的结果变量、预测变量,完全不涉及原始文本列的检查
- 搭配
- 这类错位问题只会在workflow的前置校验环节抛出,不会传递到底层模型引擎中,因此靠
rlang::last_error()很难定位到是独立预处理流程与workflow的输入预期不匹配
正确的recipe接入方式
- 通过
add_recipe()接入workflow时,传入未做任何训练的原始recipe定义对象,不要把提前prep()好、已经接触过原始训练数据的recipe实例直接绑定到workflow中 - 调用workflow的
fit()方法时,直接传入保留了原始text列、原始type列的原始训练集,让workflow自动按顺序完成recipe训练、特征变换、模型拟合的全链路流程 - 如果需要单独调试文本预处理的每一步效果,记得把独立调试环节用到的
prep()、bake()流程,和绑定在workflow里的recipe完全拆分,不要复用同一个recipe对象导致输入逻辑混乱
内容的提问来源于stack exchange,提问作者Alix TC
相关产品推荐
相关产品推荐

