Ошибка при запуске gbm из каретки: ошибка в { : сбой задачи 1 — «входные данные должны быть факторами»

#r #machine-learning #r-caret

#r #машинное обучение #r-каретка

Вопрос:

Я новичок в R и пытаюсь изучить и выполнить ml в r.

Я получаю эту ошибку при запуске gbm из caret : Error in { : task 1 failed - "inputs must be factors" .

С тем же parameters успехом он отлично работал для многих других алгоритмов rf , таких как — и т.д. adaboost

Код для справки:

 fitCtrl_2 <- trainControl(
  method = "cv",
  # repeats = 5,
  number = 10,
  savePredictions = "final",
  classProbs = TRUE,
  summaryFunction = twoClassSummary
) 
  

Приведенный ниже код выдает ошибку

 set.seed(123)

system.time(

model_gbm <- train(pull(y) ~  duration nr.employed euribor3m pdays emp.var.rate poutcome.success month.mar cons.conf.idx contact.telephone contact.cellular previous age cons.price.idx month.jun job.retired, 
                  data = train, 
                  method = "gbm",   # Added for gbm
                  distribution="gaussian",   # Added for gbm
                  metric = "ROC",
                  bag.fraction=0.75,   # Added for gbm
                  # tuneLenth = 10,
                  trControl = fitCtrl_2)
)
  

Приведенный ниже код отлично работал с теми же данными

Модель SVM

 set.seed(123)

system.time(

model_svm <- train(pull(y) ~  duration nr.employed euribor3m pdays emp.var.rate poutcome.success month.mar cons.conf.idx contact.telephone contact.cellular previous age cons.price.idx month.jun job.retired, 
                        data = train, 
                        method = "svmRadial", 
                        tuneLenth = 10,
                        trControl = fitCtrl_2)
)
  

Я просмотрел другие сообщения SO, касающиеся этой проблемы, но неясно, что именно мне нужно сделать, чтобы это исправить.

Ответ №1:

Похоже, что вы выполняете классификацию, если это так, распределение должно быть «бернулли» вместо «гауссова», ниже приведен пример:

 set.seed(111)

df = data.frame(matrix(rnorm(1600),ncol=16))

colnames(df) = c("duration", "nr.employed", "euribor3m", "pdays", "emp.var.rate", 
"poutcome.success", "month.mar", "cons.conf.idx", "contact.telephone", 
"contact.cellular", "previous", "age", "cons.price.idx", "month.jun", 
"job.retired")

df$y = ifelse(runif(100)>0.5,"a","b")

mod = as.formula("y ~  duration nr.employed euribor3m pdays emp.var.rate poutcome.success month.mar cons.conf.idx contact.telephone contact.cellular previous age cons.price.idx month.jun job.retired")

model_gbm <- train(mod, data = df, 
                  method = "gbm",   
                  distribution="gaussian",   
                  metric = "ROC",
                  bag.fraction=0.75, 
                  trControl = fitCtrl_2)
  

Вы получаете сообщение об ошибке:

 Error in { : task 1 failed - "inputs must be factors"
  

Установите для него значение bernoulli, и все будет в порядке:

 model_gbm <- train(mod, data = df, 
                      method = "gbm",   
                      distribution="bernoulli",   
                      metric = "ROC",
                      bag.fraction=0.75, 
                      trControl = fitCtrl_2)

model_gbm

Stochastic Gradient Boosting 

100 samples
 15 predictor
  2 classes: 'a', 'b' 

No pre-processing
Resampling: Cross-Validated (10 fold) 
Summary of sample sizes: 90, 91, 90, 90, 89, 90, ... 
Resampling results across tuning parameters:

  interaction.depth  n.trees  ROC        Sens       Spec 
  1                   50      0.6338333  0.7233333  0.500
  1                  100      0.6093333  0.6533333  0.510
  1                  150      0.6193333  0.6500000  0.555
  2                   50      0.6445000  0.6900000  0.545
  2                  100      0.6138333  0.6166667  0.620
  2                  150      0.6085000  0.6700000  0.555
  3                   50      0.5770000  0.6466667  0.555
  3                  100      0.5756667  0.6066667  0.530
  3                  150      0.5808333  0.6300000  0.530
  

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

1. большое спасибо @StupidWolf, он работает с «bernoulli».