我最近开始研究我正在开发的模型的插入符号包。我正在使用最新版本。作为第一步,我决定将其用于特征选择。我使用的数据有大约 760 个特征和 10k 个观察值。我根据网上的培训资料创建了一个简单的函数。不幸的是,我一直遇到错误,因此该过程永远不会完成。这是产生错误的代码。在这个例子中,我使用了一小部分功能。我从全套功能开始。我还更改了子集、折叠次数和重复次数,但无济于事。我知道如果没有数据,很难追查问题。我有 shared 数据的一个小子集(采用下面使用的 r 对象格式)。如果您无法从那里获取文件,请尝试使用 link 。
它总是产生这个错误:
caretFeatureSelection <- function() {
library(caret)
library(mlbench)
library(Hmisc)
set.seed(10)
lr.features = c("f2", f271","f527","f528","f404", "f376", "f67", "f670", "f281", "f333", "f13", "f282", "f599",
"f597", "f68", "f629", "f378", "f230", "f229", "f273", "f768", "f406", "f630",
"f596", "f598", "f413", "f412", "f332", "f377", "f766", "f767", "f775", "f10", "f442")
trainDF <- readRDS(file='trainDF.rds')
trainDF <- trainDF[trainDF$loss>0,]
trainDF$lossProb <- trainDF$loss/100
y <- trainDF[,'lossProb']
x <- trainDF[,names(trainDF) %in% lr.features]
rm(trainDF)
subsets <- c(1:5, 10, 15, 20, 25)
ctrl <- rfeControl(functions = lrFuncs,
method = "repeatedcv",
repeats = 1,
number=5)
lrProfile <- rfe(x, y,
sizes = subsets,
rfeControl = ctrl)
lrProfile
}
最佳答案
所以看数据,失败的原因有3个。第一的,
> str(x)
'data.frame': 100 obs. of 34 variables:
$ f2 : Factor w/ 10 levels "1","2","3","4",..: 8 8 8 8 9 8 9 9 7 8 ...
<snip>
rfe
将 lm
模型拟合到这些数据并生成 39 个系数,即使数据框 x
有 34 列。结果,rfe
变得……困惑。在运行 model.matrix
之前尝试使用 rfe
将因子转换为虚拟变量:x2 <- model.matrix(~., data = x)[,-1] ## the -1 removes the intercept column
... 但...
> table(x$f2)
1 2 3 4 6 7 8 9 10 11
0 0 0 2 2 5 32 36 23 0
所以
model.matrix
将生成一些零方差预测器(这是一个问题)。您可以创建一个具有新水平的新因子,排除空水平,但请记住,对这些数据的任何重新采样都会将某些因子水平(例如“4”、“6”)强制转换为零方差预测变量。其次,一些预测变量之间存在完美的相关性:
> cor(x$f597, x$f599)
[,1]
[1,] 1
这将导致某些模型系数的
NA
值出现并导致变量重要性缺失,并且会影响 rfe
。除非您使用树或其他一些可以容忍稀疏和/或相关预测变量的模型,否则
rfe
之前的可能工作流程可能是:> x2 <- model.matrix(~., data = x)[,-1]
>
> nzv <- nearZeroVar(x2)
> x3 <- x2[, -nzv]
>
> corr_mat <- cor(x3)
> too_high <- findCorrelation(corr_mat, cutoff = .9)
> x4 <- x3[, -too_high]
>
> c(ncol(x2), ncol(x3), ncol(x4))
[1] 42 37 27
最后,从
y
的外观来看,您想预测一个数字,但 lrFuncs
用于逻辑回归,所以我认为这是 lmFuncs
的一个错字。如果是这种情况,rfe
可以正常工作:> subsets <- c(1:5, 10, 15, 20, 25)
> ctrl <- rfeControl(functions = lmFuncs,
+ method = "repeatedcv",
+ repeats = 1,
+ number=5)
> set.seed(1)
> lrProfile <- rfe(as.data.frame(x4), y,
+ sizes = subsets,
+ rfeControl = ctrl)
最大限度
关于R 插入符号包 rfe 永远不会完成错误任务 1 失败 - "replacement has length zero",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22129561/