【问题标题】:Missing Value Error although "na.action" was set to "na.roughfix"尽管“na.action”设置为“na.roughfix”,但缺少值错误
【发布时间】:2021-10-27 11:40:21
【问题描述】:

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

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

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

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

我很清楚这些列中存在缺失值……这就是我使用 na.roughfix 的原因。我也删除了 NZV,但这也无济于事。

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

许多问候

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

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

编辑。 3:正如用户误用的希望,我尝试为您提供代码示例。很遗憾,我无法为您提供数据,因为我的数据相对敏感 - 感谢您的理解。

首先,我创建了一个“蓝图”,并将其交给 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 =”来删除 NZV,R 不建议这样做,这意味着它不再可用。因此,我必须用 training_data 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 并手动删除它们 - 但如果我想应用更多步骤,整个过程会变得复杂。

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

【问题讨论】:

  • 一个可重现的示例,其中包含您所经历的内置数据集,将大大有助于解决您的问题。
  • 我认为这是相关的:github.com/tidymodels/recipes/issues/636。问题是插入符号可能不支持 100% 的食谱功能,因为插入符号不再开发,而食谱是。我相信如果您采用更现代的 ML 元框架,例如 tidymodelsmlr3,您会做得更好。我没有使用 tidymodels 的经验,但我只能赞美 mlr3。无论如何,手头的东西 - 我会检查这个例子,并在我有时间的时候尝试制定一个解决方案。

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


【解决方案1】:

?randomForest::na.roughfix 的帮助下,您可以在使用带有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

【讨论】:

  • 非常感谢您的帮助!这确实是一个聪明的解决方案,我没有考虑过。
  • 很高兴我能帮上忙。如果您认为答案解决了您的问题,请阅读stackoverflow.com/help/someone-answers
猜你喜欢
  • 1970-01-01
  • 2016-10-06
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
相关资源
最近更新 更多