当我为rfe.control和train.control指定索引时,我收到错误
为了制作glmnet rfe功能,我编码了
glmnetFuncs <- caretFuncs #Default caret functions
glmnetFuncs$summary <- twoClassSummary
用于指定rfe.control的索引
MyRFEcontrol <- rfeControl(
method="LGOCV",
number=5,
index=RFE_CV_IN,
functions = glmnetFuncs,
verbose = TRUE)
用于指定train.control的索引
MyTrainControl=trainControl(
method="LGOCV",
index=indexIN,
classProbs = TRUE,
summaryFunction=twoClassSummary
)
由于数据量很大,我只选择随机3列以确保它有效,
x=train_v_final4[,c(1,30,55)]
y=TARGET
RFE <- rfe(x=x,y=y,sizes = seq(2,3,by=1),
metric = 'ROC',maximize=TRUE,rfeControl = MyRFEcontrol,
method='glmnet',
# tuneGrid = expand.grid(.alpha=c(0,0.1,1),.lambda=c(0.1,0.01,0.05)),
trControl = MyTrainControl)
但我说错误
**model fit failed for a: alpha=0.10, lambda=3 Error in if (!all(o)) { : missing value where TRUE/FALSE needed**
我尝试了所有其他可能的方法。
在rfe.control和train.Control中指定索引,
在rfe.control中指定索引但不在train.control中指定
在train.control中指定索引但不在rfe.control中指定索引。
然而,他们没有工作。但是如果我在train()函数中使用这些索引列表它可以正常工作。有谁知道我需要修理什么?任何意见/想法都非常感谢!
详细
> nearZeroVar(x[indexIN[[1]],])
integer(0) #other results (nearZeroVar(x[indexIN[[2]],])..etc...)are omitted since the outputs are identical.
> cor(x[indexIN[[1]],])
id category_q total_spent_90
id 1.0000000000 0.0300781 0.0001837173
category_q 0.0300781045 1.0000000 0.4102276754
total_spent_90 0.0001837173 0.4102277 1.0000000000
> nearZeroVar(x[RFE_CV_IN[[1]],])
integer(0)
> cor(x[RFE_CV_IN[[1]],])
id category_q total_spent_90
id 1.0000000000 0.002903591 -0.0004827006
category_q 0.0029035912 1.000000000 0.9612495056
total_spent_90 -0.0004827006 0.961249506 1.0000000000
> str(RFE_CV_IN)
List of 20
$ Resample01: int [1:28670] 8 12 35 39 47 51 55 66 71 76 ...
$ Resample02: int [1:28670] 1 5 7 38 39 49 55 76 91 100 ...
$ Resample03: int [1:28670] 1 5 7 8 18 30 38 39 49 63 ...
$ Resample04: int [1:28670] 9 12 18 24 30 35 38 39 49 51 ...
$ Resample05: int [1:28670] 8 30 47 49 51 63 71 76 77 92 ...
$ Resample06: int [1:28670] 1 18 30 39 49 55 63 66 71 77 ...
$ Resample07: int [1:28670] 5 18 24 25 51 76 91 101 112 116 ...
$ Resample08: int [1:28670] 1 5 7 12 24 25 38 39 49 51 ...
$ Resample09: int [1:28670] 8 18 24 25 38 49 51 76 101 113 ...
....omit rest...
> str(indexIN)
List of 20
$ Resample01: int [1:64024] 1 6 11 12 14 15 17 19 20 22 ...
$ Resample02: int [1:64024] 8 11 13 14 18 19 21 22 24 25 ...
$ Resample03: int [1:64024] 1 3 4 6 11 13 14 15 16 21 ...
$ Resample04: int [1:64024] 3 9 11 12 13 14 22 24 26 28 ...
.....omit rest
答案 0 :(得分:2)
问题可能是外部函数(rfe
)使用与原始数据相同的行指示符,但是一旦train
看到数据,那些行号就不一样了事情。
假设您有100个数据点并且正在进行10倍CV,第一个折叠是1-10,第二个是11-20等。
在第一次折叠时,rfe
将第11-100行传递给train
。如果index
中的train
向量具有任何索引&gt; 90,会有错误。如果没有,它可能会运行,但不会与您最初告诉train
使用的行一起运行。
您可以这样做,但是对于外部模型的每个重采样(即ref
),它将需要一组单独的重采样索引,因为内部数据每次都不同。此外,如果你进行自举,你需要非常小心,因为它是替换样品;如果不是您的模型构建数据和保持数据可能在其中具有相同的确切记录。
如果您真的想要可重复/可追溯性,请在rfeControl
和trainControl
中设置种子。我非常确定您将在不同的运行中获得相同的重采样(只要数据集和重采样方法在运行期间保持相同)。
最大