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_predictors
集 56 列,所有这些都是 numeric
。 training_labels
是 0
和 1
的 factor
向量。
我使用以下列表作为要测试的子集大小。
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
。但它包含名称为 0
和 1
的列。为什么会这样? 0
和 1
表示什么(顺便说一下,两个列的值完全相同)?另外,如何将 varImp
设为 return $Overall
列? [作为临时解决方案,我正在创建一个新列 $Overall
并将其附加到 rank
函数中的 vimp
。]
使用 0
和 1
作为因子水平是有问题的,因为它们不是有效的 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
}
我有一个 training_predictors
集 56 列,所有这些都是 numeric
。 training_labels
是 0
和 1
的 factor
向量。
我使用以下列表作为要测试的子集大小。
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
。但它包含名称为 0
和 1
的列。为什么会这样? 0
和 1
表示什么(顺便说一下,两个列的值完全相同)?另外,如何将 varImp
设为 return $Overall
列? [作为临时解决方案,我正在创建一个新列 $Overall
并将其附加到 rank
函数中的 vimp
。]
使用 0
和 1
作为因子水平是有问题的,因为它们不是有效的 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
}