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

使用R Tidymodels随机森林分类时预测目标变量报错求助

问题分析与解决方案

问题根源

  1. 未知因子水平:留存样本df_holdout中部分分类变量(如var_02、var_30)存在训练集未见过的水平,这些水平被强制转为NA,触发后续报错。
  2. 虚拟变量不匹配:训练集生成的虚拟变量(如var_02_X4)因留存样本缺失对应因子水平而未被生成,但训练好的模型期望这些列存在,导致"Missing data"错误。

解决步骤

1. 调整Recipe,提前处理分类变量异常

修改你的建模Recipe,加入因子水平处理步骤,确保新数据与训练集的变量结构完全匹配:

df_recipe <- recipe(target ~., data = df_train) %>% 
  step_zv(all_predictors()) %>%
  step_normalize(all_numeric()) %>% 
  step_corr(threshold = 0.7) %>% 
  # 将训练集未见过的新因子水平统一转为"unknown"
  step_unknown(all_nominal_predictors(), new_level = "unknown") %>%
  # 生成虚拟变量,确保训练集所有因子水平对应的列都被保留,新数据缺失的水平填0
  step_dummy(all_nominal_predictors(), -all_outcomes(), keep_original_cols = FALSE)

2. 重新训练模型

用修改后的Recipe重新执行完整的训练流程(从workflow_set到last_fit),得到更新后的wf_final_model。

3. 执行留存样本预测

此时再运行预测代码,新因子水平会被标准化处理,训练集所有虚拟变量也会在留存样本中自动生成(缺失水平对应列填0):

predict(wf_final_model, df_holdout)

可选优化:合并低频因子水平

如果训练集中存在占比极低的因子水平,可提前合并为"other",减少虚拟变量数量同时避免潜在问题:

df_recipe <- recipe(target ~., data = df_train) %>% 
  step_zv(all_predictors()) %>%
  step_normalize(all_numeric()) %>% 
  step_corr(threshold = 0.7) %>% 
  # 合并占比<1%的低频水平为"other"
  step_other(all_nominal_predictors(), threshold = 0.01, other_level = "other") %>%
  step_unknown(all_nominal_predictors(), new_level = "unknown") %>%
  step_dummy(all_nominal_predictors(), -all_outcomes(), keep_original_cols = FALSE)

关键注意事项

  • step_unknown必须放在step_dummy之前,确保新水平被统一处理后再生成虚拟变量。
  • 重新训练时要保证全流程使用修改后的Recipe,否则模型仍会存在变量不匹配问题。

内容的提问来源于stack exchange,提问作者Ксения

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:33:21