You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言Vetiver API部署模型时step_dummy相关报错排查

解决Vetiver部署时step_dummy的列存在性与格式报错问题

问题根源

本地训练预测正常但部署后报错,核心是Vetiver API的输入schema与工作流预处理逻辑不匹配:

  • 设置keep_original_cols=FALSE时,预处理流程会移除原始分类列,但Vetiver默认根据训练数据生成的schema仍会要求该列存在,导致预测时触发"原始列不存在"的错误。
  • 设置keep_original_cols=TRUE时,预处理保留了原始分类列,但生产环境输入的分类列类型(通常是字符串)与训练时的因子类型不匹配,触发格式错误。

解决方案

1. 统一输入数据类型与预处理逻辑

在预处理配方中显式添加字符串转因子的步骤,确保生产环境的字符串输入能被正确转换为训练时的因子水平,同时配合自定义Vetiver输入schema,避免列存在性冲突。

2. 代码修正示例

library(tidymodels)
library(vetiver)
library(pins)

# 训练数据集
train_data <- tibble(
  x1 = factor(c("a", "b", "a", "c")),
  x2 = rnorm(4),
  y = rnorm(4)
)

# 调整预处理配方:显式处理字符串转因子,指定训练时的因子水平
rec <- recipe(y ~ x1 + x2, data = train_data) %>%
  step_string2factor(x1, levels = levels(train_data$x1)) %>% # 强制匹配训练数据的因子水平
  step_dummy(x1, keep_original_cols = FALSE) # 移除原始分类列,避免冗余

# 构建并训练工作流
model <- linear_reg() %>% set_engine("lm")
wf <- workflow() %>% add_recipe(rec) %>% add_model(model)
wf_fit <- fit(wf, data = train_data)

# 自定义Vetiver输入schema:基于原始输入列(字符型x1 + 数值型x2)生成
# 确保API接收的输入列与训练时的输入列一致,类型匹配API常见的字符串输入
input_schema <- train_data %>% 
  select(-y) %>% 
  mutate(x1 = as.character(x1))

v <- vetiver_model(wf_fit, "my_regression_model", input_data = input_schema)

# 启动API服务
pr <- vetiver_pr_predict(v)

3. 生产环境输入验证

发送符合schema的JSON请求,示例输入:

{"x1": "a", "x2": 0.72}

本地测试验证:

test_input <- tibble(x1 = "b", x2 = -0.3)
predict(wf_fit, test_input) # 应正常返回预测结果

额外注意事项

  • 如果必须保留原始分类列(keep_original_cols=TRUE),需确保生产输入的分类列被转换为与训练数据一致的因子类型,可在API输入预处理中添加类型转换逻辑。
  • 部署前务必用vetiver_prepare_dispatch(v, test_input)测试输入数据是否能被正确处理,提前排查schema不匹配问题。

内容的提问来源于stack exchange,提问作者Imitation

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:25:27