пакет r caret, ошибка, если я указал индекс как для управления rfe, так и для управления поездом

#r #package #r-caret

#r #пакет #r-каретка

Вопрос:

Я получаю ошибку, когда я указал индекс для 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.Управление ,

  2. указание индекса в rfe.control, но не в train.control,

  3. указываю индекс в 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
  

Ответ №1:

Проблема может заключаться в том, что внешняя функция ( rfe ) использует те же индикаторы строк, что и исходные данные, но, как только train увидит данные, номера этих строк не будут означать одно и то же.

Предположим, у вас есть 100 точек данных, и вы выполняете 10-кратное резюме, и первое сгибание равно 1-10, второе — 11-20 и т.д.

При первом сгибе rfe передаются строки 11-100 в train . Если index вектор в train имеет какие-либо индексы > 90, возникнет ошибка. В противном случае он может выполняться, но не со строками, которые вы изначально указали train использовать.

Вы могли бы это сделать, но для этого потребуется отдельный набор индексов повторной выборки для каждой повторной выборки внешней модели (т. Е. ref ), поскольку внутренние данные каждый раз будут разными. Кроме того, вам нужно быть очень осторожным, если вы выполняете начальную загрузку, поскольку она выполняет выборку с заменой; в противном случае данные построения вашей модели и данные удержания могут содержать одинаковые точные записи.

Если вы действительно хотите воспроизводимость / отслеживаемость, задайте начальное значение в rfeControl и trainControl . Я почти уверен, что вы получите одинаковые повторные выборки при разных запусках (при условии, что набор данных и методы повторной выборки остаются одинаковыми при разных запусках).

Макс

Комментарии:

1. Спасибо! проблема решена! Я думал, что использовал индикатор уникальной строки, но, похоже, я допустил в нем какую-то ошибку