r - 尽管 "na.action"设置为 "na.roughfix",但缺少值错误

标签 r machine-learning random-forest missing-data r-caret

我想创建一个带有插入符的随机森林模型。由于训练集中缺少值,我正在寻找可能的解决方案,并发现了“randomForest”包中的选项“na.roughfix”。如果加载了 randomForest 库,则此选项可以用作插入符号的训练函数中的参数“na.action”的参数。在训练函数中,我使用 5 倍 CV 并调整以获得最佳 ROC 值。我这样做是为了确保其他模型之间的可比性。我为随机森林选择的方法是“ranger”。

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

Fold5 的模型拟合失败:mtry= 7、splitrule=gini、min.node.size= 5 错误:列中缺少数据:...

“...”代表出现缺失值的列。此外,无论对于哪个折叠或 mtry 的值,都会出现此错误消息。

我很清楚这些列中缺少值......这就是我使用 na.roughfix 的原因。我还删除了 NZV,但这也没有帮助。

我会非常高兴得到解释甚至解决方案!

许多问候

编辑:我现在已经看到,如果我想在训练函数中选择“na.action”参数,它不会像通常那样自动出现。似乎它以某种方式丢失了...也许这就是为什么插入符不使用 na.roughfix 的原因...

编辑。 2:我猜这是问题的一部分。根据前面的参数,火车的行为总是不同的。在我的训练函数中,我使用配方包中的配方来删除 NZV。一旦我删除了配方, na.action 参数就再次可用。然而,现在 preProcess 参数消失了,这意味着我无法再删除 NZV。这真的是一团糟:-/是否有可能同时应用 na.action 和 preProcess 参数或针对我的 Missing-Values-NZV 问题使用任何其他解决方案?

编辑。 3:按照用户误用的意愿,我尝试为您提供代码说明。不幸的是,我无法向您提供数据,因为我的数据相对敏感 - 感谢您的理解。

首先,我创建了一个“蓝图”,并将其交给火车功能。在这里,我删除了接近零方差变量。

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))

最后,我将它们全部放入训练函数中:

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

这里,R 没有建议参数 na.action,这意味着它不可用。这会在开头的问题中引发错误消息。但是,如果我删除蓝图并像这样编写模型:

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 =”来删除 NZV,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"
)

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

我希望,我的问题现在更容易理解了......

最佳答案

来自?randomForest::na.roughfix的帮助仅执行中位数/众数插补,您可以在使用 step_impute_median 的配方时替换它和 step_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

关于r - 尽管 "na.action"设置为 "na.roughfix",但缺少值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68954983/

相关文章:

r - 根据组更改各个方面标签的颜色

python-3.x - 值错误: setting an array element with a sequence in scikit-learn (sklearn) using GaussianNB

python - 如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?

r - 将秒转换为天 : hours:minutes:seconds

r - 如何将裁剪蒙版应用于ggplot中的geom?

machine-learning - 如何让 Weka 分类器使用更少的内存和 CPU 时间?

machine-learning - 点击收入预测模型

r - 如何使 randomForest 模型尺寸变小?

machine-learning - 在 scikit-learn 中使用多标签随机森林没有标签分配的样本

html - 将 html 输出转换为图像