虽然设置了”na.action”为”na.roughfix”,但仍然出现缺失值错误

我想使用caret创建一个随机森林模型。由于训练集中存在缺失值,我在寻找可能的解决方案时发现了来自”randomForest”包的”na.roughfix”选项。如果加载了randomForest库,这个选项可以作为caret中的train函数的”na.action”参数的参数。在train函数中,我使用了5折交叉验证,并调整以获得最佳ROC值。我这样做是为了确保与其他模型的可比性。我为随机森林选择的方法是”ranger”。

但现在发生了一些奇怪的事情:当我触发train函数时,计算开始了,但例如出现了以下错误消息:

模型拟合在第5折失败:mtry= 7, splitrule=gini, min.node.size= 5 错误:列中存在缺失数据:…

“…”代表出现缺失值的列。此外,无论是哪一折或mtry的值,这个错误消息总是会出现。

我很清楚这些列中存在缺失值…这就是我使用na.roughfix的原因。我也删除了NZVs,但这也没有帮助。

我非常希望能得到一个解释甚至是解决方案!

很多问候

编辑.: 我现在发现,如果我想在train函数中选择”na.action”参数,它不会自动出现,这通常是会出现的。似乎它不知怎么丢失了…也许这就是caret不使用na.roughfix的原因…

编辑2: 我猜这是问题的一部分。train函数的行为总是根据之前的参数而有所不同。在我的train函数中,我使用了来自recipe包的recipe来删除NZVs。一旦我删除了recipe,na.action参数再次可用。然而,现在preProcess参数消失了,这意味着我无法再删除NZVs。这真是一团糟 :-/ 是否有可能同时应用na.action和preProcess参数,或者对我缺失值-NZV问题有其他解决方案?

编辑3: 如用户missuse所希望的,我尝试为您提供一个代码示例。不幸的是,我无法提供数据,因为我的数据相对敏感 – 谢谢您的理解。

首先,我创建了一个”蓝图”,并将其传递给train函数。在这里,我删除了近零方差变量。

blueprint <- recipe(target ~ ., data = train_data) %>%step_nzv(all_predictors())

在下一步中,我定义了trainControl

train_control <- trainControl(method = "cv",                    number = 5,                    classProbs = TRUE,                    summaryFunction = twoClassSummary,                    verboseIter = TRUE)

和一个网格:

hyper_grid <- expand.grid(mtry=c(1:(ncol(train_data)-1)),                      splitrule = c("gini", "extratrees"),                      min.node.size = c(1, 3, 5, 7, 10))

最后,我将所有内容整合到train函数中:

tuned_rf <- train(blueprint,data = train_data,method = "ranger",metric = "ROC",trControl = train_control,tuneGrid = hyper_grid,na.action = na.roughfix)

在这里,na.action参数不会被R建议,意味着它不可用。这会导致开头问题中的错误消息。然而,如果我删除蓝图并这样写模型:

tuned_rf <- train(target ~ .,data = train_data,method = "ranger",metric = "ROC",trControl = train_control,tuneGrid = hyper_grid,na.action = na.roughfix)

na.action是可用的,na.roughfix可以被使用。然而,现在缺少预处理。如果我想添加”preProcess =”参数来删除NZVs,R不会建议它,意味着它不再可用。因此,我必须用训练数据X和响应变量y替换公式和数据。现在,preProcess再次可用…但na.action消失了,因此我无法使用na.roughfix。

tuned_rf <- train(X,Y,method = "ranger",metric = "ROC",trControl = train_control,tuneGrid = hyper_grid,preProcess = "nzv")

当然,我可以首先识别NZVs并手动删除它们 – 但如果我想应用进一步的步骤,整个过程就会变得复杂。

我希望我的问题现在更容易理解…


回答:

?randomForest::na.roughfix的帮助文档中得知,它仅执行中位数/众数填补,您可以使用recipe时用step_impute_medianstep_impute_mode替换它

您的蓝图将如下所示:

library(recipes)blueprint <- recipe(target ~ ., data = train_data) %>%  step_nzv(all_predictors()) %>%  step_impute_median(all_numeric()) %>%  step_impute_mode(all_nominal())

或许也可以尝试

blueprint <- recipe(target ~ ., data = train_data) %>%  step_impute_median(all_numeric()) %>%  step_impute_mode(all_nominal()) %>%  step_nzv(all_predictors()) 

取决于step_nzv如何处理缺失值。

我还会检查使用其他填补函数的性能,如

step_impute_bag
step_impute_knn

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注