如何修改已训练保存的R语言随机森林模型适配缺失无关字段的新数据预测
结论
不需要重新训练模型,根据你训练时是否把这两个标识类字段纳入特征集对应处理即可,全程耗时不会超过1分钟。
场景1:训练时未将filename、user ID这类标识列纳入特征
这种情况模型本身就没有依赖这两个字段,你预测时只需要保证输入新数据包含所有训练时实际用到的特征即可,缺的这两个标识列完全不影响预测,直接调用predict()就行。如果报错,大概率是你训练时不小心把无关列带进了特征矩阵,参考下面的场景2处理。
场景2:训练时误将标识列纳入了特征矩阵
这种情况有两种零重训成本的解决方案,都不会触发模型重训:
- 方案1:直接给新数据补这两个缺失列,随便填值即可
因为filename、user ID属于无预测价值的标识类字段,随机森林训练过程中几乎不会选择这类高基数无业务意义的字段作为树分裂节点,你随便给这两列填固定值、甚至填NA都不会改变预测结果。示例代码:# 加载本地保存的模型 rf_model <- readRDS("your_random_forest_model.rds") # 给新数据补缺失的标识列,赋值任意合法值即可 new_data$filename <- "dummy_file" new_data$`user ID` <- NA # 正常执行预测 pred_res <- predict(rf_model, newdata = new_data) - 方案2:直接修改模型对象,移除对这两个字段的依赖
如果你不想在新数据里补无意义的列,可以直接修改RDS加载出来的模型对象,删掉和这两个字段相关的校验规则即可,不同训练包的修改位置略有区别:- 用
randomForest包训练的模型:# 定义要移除的无用字段 drop_vars <- c("filename", "user ID") # 从模型记录的特征名列表中删除目标字段 rf_model$xNames <- setdiff(rf_model$xNames, drop_vars) # 更新模型的公式terms属性,排除目标字段 rf_model$terms <- delete.response(terms(reformulate(rf_model$xNames))) - 用
ranger包训练的模型:drop_vars <- c("filename", "user ID") # 从模型记录的独立变量名列表中删除目标字段 rf_model$forest$independent.variable.names <- setdiff( rf_model$forest$independent.variable.names, drop_vars )
- 用
注意事项
只有当你确认这两个标识列确实没有参与任何决策树的分裂规则时,上述操作才不会改变模型预测结果。你可以先查看模型的变量重要性结果,如果这两个字段的重要性为0,就可以放心操作;如果这两个字段意外被选作分裂节点(一般是训练时数据处理出错才会出现),修改后预测结果会有偏差,要是对精度要求高就需要重训,但这类标识字段正常情况下不会被模型选用,基本不会出问题。
内容的提问来源于stack exchange,提问作者Lotus Wei
相关产品推荐
相关产品推荐

