#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**
Я перепробовал все другие возможные способы.
-
указание индекса в rfe.control и train.Управление ,
-
указание индекса в 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
Ответ №1:
Проблема может заключаться в том, что внешняя функция ( rfe
) использует те же индикаторы строк, что и исходные данные, но, как только train
увидит данные, номера этих строк не будут означать одно и то же.
Предположим, у вас есть 100 точек данных, и вы выполняете 10-кратное резюме, и первое сгибание равно 1-10, второе — 11-20 и т.д.
При первом сгибе rfe
передаются строки 11-100 в train
. Если index
вектор в train
имеет какие-либо индексы > 90, возникнет ошибка. В противном случае он может выполняться, но не со строками, которые вы изначально указали train
использовать.
Вы могли бы это сделать, но для этого потребуется отдельный набор индексов повторной выборки для каждой повторной выборки внешней модели (т. Е. ref
), поскольку внутренние данные каждый раз будут разными. Кроме того, вам нужно быть очень осторожным, если вы выполняете начальную загрузку, поскольку она выполняет выборку с заменой; в противном случае данные построения вашей модели и данные удержания могут содержать одинаковые точные записи.
Если вы действительно хотите воспроизводимость / отслеживаемость, задайте начальное значение в rfeControl
и trainControl
. Я почти уверен, что вы получите одинаковые повторные выборки при разных запусках (при условии, что набор данных и методы повторной выборки остаются одинаковыми при разных запусках).
Макс
Комментарии:
1. Спасибо! проблема решена! Я думал, что использовал индикатор уникальной строки, но, похоже, я допустил в нем какую-то ошибку