0

非常感谢您提前提供的帮助。我目前正在使用一个包含 794 个观测值和 1023 个变量的数据集。我正在尝试对数据进行某种特征选择。我最初的想法是做随机森林 rfe,但代码运行时间超过 24 小时,所以我停止了。我的下一个想法是再次使用 rfe,但使用偏最小二乘法,因为它的运行速度比随机森林模型快得多。当我这样做时,我收到以下错误:

"Error in { : task 1 failed - "wrong sign in 'by' argument".

我将在下面展示我的代码,但我知道这个错误来自 seq() 参数,其中有某种负值,但我的序列是 (1,1021, by =2)。我不认为那里有什么问题。代码运行大约 6-7 小时后,我得到了错误。我想我的问题有两个:

  1. 如果你们能想到任何更好的特征选择方法,我可以在几个小时内运行,而不是我正在做的事情,我会全力以赴。
  2. 如果您想不出更好的方法,您知道如何解决上述错误吗?真的很感谢所有的帮助。 注意:下面代码中的 predVars 是 chr[1:1022]。
train.control <- trainControl(method = "cv", number = 10)

#Recursive Feature Elimination Partial Least Squares
predVars <- names(Training)[!names(Training) %in% c("MOV")]
varSeq <- seq(1, 1021, by = 2)
ctrl <- rfeControl(method = "cv",
                   number = 10,
                   verbose = FALSE,
                   functions = caretFuncs) 

Results <- rfe(x = Training[,predVars], y = Training$MOV, sizes = varSeq,
               rfeControl = ctrl, method = "pls", tuneLength = 15,
               preProc = c("center","scale"), trControl = train.control)
4

1 回答 1

0

您的varSeq向量可能是错误消息的来源,也是您计算的长时间。

?caret::rfe文档说这个论点sizes是:

与应保留的特征数量相对应的整数数值向量

照原样,您varSeq有 500 多个从 1 到 1021 的整数。序列以 1 开头会导致错误(我猜是因为sizes = 1无法计算)。请注意,在文档中的示例中,sizes向量的最小值至少为 2。

此外,拥有 500 多个“大小”来处理您的数据只需要时间。因此,为避免此错误并加快分析速度,请尝试以下操作:

varSeq <- c(2:25, 30, 35, 40, 45, 50, 55, 60, 65)

当我使用一些示例数据和这种调整执行您的代码时,分析就会完成。

library(caret)

Training <- data.frame(MOV = factor(rep(c("A", "B"), 400)),
                       F1 = sample(0:1, 800, replace = TRUE),
                       F2 = sample(0:1, 800, replace = TRUE),
                       F3 = sample(0:1, 800, replace = TRUE),
                       F4 = sample(0:1, 800, replace = TRUE),
                       F5 = sample(0:1, 800, replace = TRUE))


train.control <- trainControl(method = "cv", number = 10)

#Recursive Feature Elimination Partial Least Squares
predVars <- names(Training)[!names(Training) %in% c("MOV")]
varSeq <- seq(2, 5, by = 2)
ctrl <- rfeControl(method = "cv",
                   number = 10,
                   verbose = FALSE,
                   functions = caretFuncs) 

Results <- rfe(x = Training[,predVars], y = Training$MOV, sizes = varSeq,
               rfeControl = ctrl, method = "pls", tuneLength = 15,
               preProc = c("center","scale"), trControl = train.control)
于 2021-03-11T10:56:20.640 回答