r插入包,如果我指定了rfe控制和列车控制的索引,则会出错

时间:2014-07-07 14:19:37

标签: r package r-caret

当我为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**

我尝试了所有其他可能的方法。

  1. 在rfe.control和train.Control中指定索引,

  2. 在rfe.control中指定索引但不在train.control中指定

  3. 在train.control中指定索引但不在rfe.control中指定索引。

  4. 然而,他们没有工作。但是如果我在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
    

1 个答案:

答案 0 :(得分:2)

问题可能是外部函数(rfe)使用与原始数据相同的行指示符,但是一旦train看到数据,那些行号就不一样了事情。

假设您有100个数据点并且正在进行10倍CV,第一个折叠是1-10,第二个是11-20等。

在第一次折叠时,rfe将第11-100行传递给train。如果index中的train向量具有任何索引&gt; 90,会有错误。如果没有,它可能会运行,但不会与您最初告诉train使用的行一起运行。

您可以这样做,但是对于外部模型的每个重采样(即ref),它将需要一组单独的重采样索引,因为内部数据每次都不同。此外,如果你进行自举,你需要非常小心,因为它是替换样品;如果不是您的模型构建数据和保持数据可能在其中具有相同的确切记录。

如果您真的想要可重复/可追溯性,请在rfeControltrainControl中设置种子。我非常确定您将在不同的运行中获得相同的重采样(只要数据集和重采样方法在运行期间保持相同)。

最大