非常感谢您提前提供的帮助。我目前正在处理一个包含794个观测值和1023个变量的数据集。我试图对数据进行某种特征选择。我最初的想法是使用随机森林递归特征消除(RFE),但代码运行了超过24小时,所以我停止了这个尝试。我接下来考虑再次使用RFE,但这次使用偏最小二乘法,因为它的运行速度比随机森林模型快得多。当我这样做时,我得到了以下错误:
"Error in { : task 1 failed - "wrong sign in 'by' argument".
我将在下面展示我的代码,但我明白这个错误来自于seq()函数中的某个负值参数,但我使用的序列是(1,1021, by =2)。我认为这里没有问题。代码运行了大约6-7小时后出现了这个错误。我的问题大致分为两部分:
- 如果你们能想到比我现在用的方法更快(几小时内能完成)的特征选择方法,我洗耳恭听。
- 如果想不到更好的方法,你们知道如何修复上述错误吗?非常感谢你们在这方面的帮助。注意:下面的代码中predVars是一个chr[1:1022]类型。
train.control <- trainControl(method = "cv", number = 10)#Recursive Feature Elimination Partial Least SquarespredVars <- 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)
回答:
您的varSeq
向量可能是错误信息的来源,也是您计算时间长的原因。
?caret::rfe
文档说明sizes
参数应该是一个:
对应于应保留的特征数量的整数数值向量
您现在的varSeq
包含了从1到1021的500多个整数。序列从1开始会导致错误(我猜是因为sizes = 1
无法计算)。请注意,文档中的示例中sizes
向量的最小值至少为2。
此外,有500多个’sizes’需要处理您的这个数据集需要很长时间。因此,为了避免这个错误并加速分析,可以尝试如下设置:
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 SquarespredVars <- 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)