R вставка: "нечисловой c аргумент двоичного оператора" в поезде с qrf - PullRequest
1 голос
/ 13 июля 2020

Когда я запускаю модель леса квантильной регрессии с caret::train, я получаю следующую ошибку: Error in { : task 1 failed - "non-numeric argument to binary operator".

Когда я устанавливаю ntree на большее число (в моем воспроизводимом примере это будет ntree = 150), мой код работает без ошибок.

Этот код

library(caret)
library(quantregForest)

data(segmentationData)

dat <- segmentationData[segmentationData$Case == "Train",]
dat <- dat[1:50,]

# predictors
preds <- dat[,c(5:ncol(dat))]

# convert all to numeric
preds <- data.frame(sapply(preds, function(x) as.numeric(as.character(x))))

# response variable
response <- dat[,4]

# set up error measures
sumfct <- function(data, lev = NULL, model = NULL){
  RMSE <- sqrt(mean((data$pred - data$obs)^2, na.omit = TRUE))
  c(RMSE = RMSE)
}


# specify folds
set.seed(42, kind = "Mersenne-Twister", normal.kind = "Inversion")
folds_train <- caret::createMultiFolds(y = dat$Cell,
                                       k = 10,
                                       times = 5)

# specify trainControl for tuning mtry with the created multifolds
finalcontrol <- caret::trainControl(search = "grid", method = "repeatedcv", number = 10, repeats = 5, 
                                    index = folds_train, savePredictions = TRUE, summaryFunction = sumfct)

# build grid for tuning mtry
tunegrid <- expand.grid(mtry = c(2, 10, sqrt(ncol(preds)), ncol(preds)/3))

# train model
set.seed(42, kind = "Mersenne-Twister", normal.kind = "Inversion")
model <- caret::train(x = preds, 
                      y = response,
                      method ="qrf",
                      ntree = 30, # with ntree = 150 it works
                      metric = "RMSE",
                      tuneGrid = tunegrid,
                      trControl = finalcontrol,
                      importance = TRUE,
                      keep.inbag = TRUE
)

вызывает ошибку. Модель с моими реальными данными имеет ntree = 10000, но задача все равно не выполняется. Как я могу это исправить?

Где в исходном коде каретки я могу найти условия для сообщения об ошибке Error in { : task 1 failed - "non-numeric argument to binary operator"? Из какой части исходного кода приходит сообщение об ошибке?

1 Ответ

1 голос
/ 14 июля 2020

Вы получаете сообщение об ошибке, потому что вы использовали опцию keep.inbag = TRUE в Quantregforest code , строка 95:

minoob <- min( apply(!is.na(valuesPredict),1,sum))
if(minoob<10) stop("need to increase number of trees for sufficiently many out-of-bag observations")

Поэтому для всех ваших наблюдений требуется как минимум 10 экземпляров OOB (вне сумки), чтобы сохранить прогнозы вне сумки. Поэтому, если ваши реальные данные огромны, ntrees, необходимое для хранения вне сумки, будет огромным.

Если вы используете курсор для обучения данных, сохранение OOB и savePredictions = TRUE кажется избыточный. В целом, внеплановые предсказания могут оказаться не столь полезными, поскольку вы все равно будете использовать тестовую свертку для предсказания.

Другой вариант, учитывая размер ваших данных, - это настроить sampsize. В randomForest производится выборка только из sampsize наблюдений с заменяющим подмножеством для соответствия дереву. Если вы установите меньший размер для этого, вы убедитесь, что OOB достаточно. Например, в приведенном примере мы видим:

model <- caret::train(x = preds, 
                      y = response,
                      method ="qrf",
                      ntree = 30, sampsize=17,
                      metric = "RMSE",
                      tuneGrid = tunegrid,
                      trControl = finalcontrol,
                      importance = TRUE,
                      keep.inbag = TRUE)

model
Quantile Random Forest 

50 samples
57 predictors

No pre-processing
Resampling: Cross-Validated (10 fold, repeated 5 times) 
Summary of sample sizes: 44, 43, 44, 46, 45, 46, ... 
Resampling results across tuning parameters:

  mtry       RMSE    
   2.000000  42.53061
   7.549834  42.72116
  10.000000  43.11533
  19.000000  42.80340

RMSE was used to select the optimal model using the smallest value.
The final value used for the model was mtry = 2.
...