caret使用ranger构建随机森林时设置na.roughfix仍报缺失值错误如何解决
问题根本原因
caret的三种数据传入模式的预处理逻辑是互斥的:
- 传入recipe时,所有预处理逻辑由recipe接管,train函数的
na.action、preProcess参数都会被忽略 - 传入公式时,仅
na.action参数生效,preProcess参数不可用 - 传入X/Y矩阵时,仅
preProcess参数生效,na.action参数被忽略
你需要的na.roughfix逻辑是数值变量用中位数填充、分类变量用众数填充,可以通过两种方案实现两个预处理步骤共存,无需手动处理数据。
方案1:全部预处理逻辑放到recipe中(推荐)
直接在recipe里补充缺失值填充步骤,和原na.roughfix效果完全一致,同时保留NZV移除逻辑:
# 无需修改原有trainControl、调参网格代码,仅修改recipe blueprint <- recipe(target ~ ., data = train_data) %>% # 复刻na.roughfix填充逻辑:数值列用中位数、分类列用众数填充缺失值 step_impute_median(all_numeric_predictors()) %>% step_impute_mode(all_nominal_predictors()) %>% # 原有近零方差变量移除步骤 step_nzv(all_predictors()) # train调用时删除na.action参数即可 tuned_rf <- train( blueprint, data = train_data, method = "ranger", metric = "ROC", trControl = train_control, tuneGrid = hyper_grid )
方案2:使用X/Y传入,预处理逻辑全部放到preProcess中
preProcess可同时指定缺失值填充和NZV过滤,无需修改其他逻辑:
# 提取特征矩阵和响应变量 X <- train_data[, !names(train_data) %in% "target"] Y <- train_data$target tuned_rf <- train( X, Y, method = "ranger", metric = "ROC", trControl = train_control, tuneGrid = hyper_grid, # 同时执行缺失值填充、NZV过滤,填充逻辑和na.roughfix完全一致 preProcess = c("medianImpute", "modeImpute", "nzv") )
内容的提问来源于stack exchange,提问作者RKF
相关产品推荐
相关产品推荐

