【问题标题】:rfe in R's caret package giving error as : task 1 failed - "argument 1 is not a vector"R 的插入符号包中的 rfe 给出错误为:任务 1 失败 - “参数 1 不是向量”
【发布时间】:2023-03-28 20:39:01
【问题描述】:

我有一个training_predictors 设置有56 列,所有这些都是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 返回$Overall 列? [作为一个临时解决方案,我正在创建一个新列$Overall 并将其附加到rank 函数中的vimp。]

【问题讨论】:

    标签: r r-caret feature-selection


    【解决方案1】:

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

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

    【讨论】:

    • 您好,请举个例子,我的类属性有两个级别,它们都是字符,让肿瘤和正常。我仍然遇到同样的错误。其余代码相同。我有 200 个数字列,最后一列 201 是 Class。
    • 非常感谢麦克斯!我非常喜欢您的书以及您解决机器学习问题的所有实用建议!
    【解决方案2】:

    我找到了解决这个问题的方法,可以使用插入符号在 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
    }
    

    【讨论】:

      猜你喜欢
      • 2014-04-03
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 2015-06-09
      • 2014-03-06
      相关资源
      最近更新 更多