R 的插入符包中的 rfe 给出错误:任务 1 失败 - "argument 1 is not a vector"

rfe in R's caret package giving error as : task 1 failed - "argument 1 is not a vector"

我有一个 training_predictors56 列,所有这些都是 numerictraining_labels01factor 向量。

我使用以下列表作为要测试的子集大小。

subset_sizes <- c(1:5, 10, 15, 20, 25)

以下是修改后的 rfFuncs 函数列表。

rfRFE <- list(summary = defaultSummary, 
              fit = function(x, y, first, last, ...) {
                  library(randomForest)
                  randomForest(x, y, importance = first, ...)
              }, 
              pred = function(object, x) predict(object, x), 
              rank = function(object, x, y) {
                  vimp <- varImp(object)
                  vimp <- vimp[order(vimp$Overall, decreasing = TRUE),,drop = FALSE]
                  vimp$var <- rownames(vimp)
                  vimp
              }, 
              selectSize = pickSizeBest, 
              selectVar = pickVars)

我已将控制函数声明为:

rfeCtrl <- rfeControl(functions = rfRFE, 
                      method = "cv", 
                      number = 10, 
                      verbose = TRUE)

但是当我运行rfe函数如下所示时,

rfProfile <- rfe(training_predictors, 
                 training_labels, 
                 sizes = subset_sizes, 
                 rfeControl = rfeCtrl)

我收到一个错误:

Error in { : task 1 failed - "argument 1 is not a vector"

我也试过改变矢量 subset_sizes,但还是不行。我做错了什么?

更新:我试着 运行 这些步骤一个接一个,问题似乎出在 rank 函数上。但是我还是想不出问题所在。

更新: 我发现了问题。 rank 函数中的 varImp 不包含 $Overall。但它包含名称为 01 的列。为什么会这样? 01 表示什么(顺便说一下,两个列的值完全相同)?另外,如何将 varImp 设为 return $Overall 列? [作为临时解决方案,我正在创建一个新列 $Overall 并将其附加到 rank 函数中的 vimp。]

使用 01 作为因子水平是有问题的,因为它们不是有效的 R 列名称。在您的其他 SO post 中,您可能会收到一条关于将这些用作输出的因子水平的消息。

尝试使用具有更多信息级别的因子结果,这些级别可以转换为有效的 R 列名称(对于 class 概率)。

我找到了针对同一问题的解决方案,以使用插入符号在 rfe 中拟合逻辑回归模型。解决方法如下:

glmFuncs$rank <-function (object, x, y){

  vimp <- varImp(object, scale = FALSE)
  loadNamespace("dplyr")

  vimp <- vimp$importance %>% 
    mutate(var=row.names(.)) %>%
    arrange(-Overall)

   vimp <- vimp[order(vimp$Overall, decreasing = TRUE), ,drop = FALSE]
   vimp
}