R caret: прогнозируемые значения $ finalModel $ и значения, полученные с помощьюgnast () - PullRequest
0 голосов
/ 07 января 2019

Чтобы проиллюстрировать различия между $finalModel$predicted и значениями, вычисленными как predict(), я настроил следующий код:

library(caret)
library(randomForest)

dat <- data.frame(target = c(2.5, 4.5, 6.1, 3.2, 2.2),
              A = c(1.3, 4.4, 5.5, 6.7, 8.1),
              B = c(44.5, 50.1, 23.7, 89.2, 10.5),
              C = c("A", "A", "B", "B", "B"))

control <- trainControl(method="repeatedcv", number=10, repeats=3,     search="grid", savePred =T)

tunegrid <- expand.grid(.mtry=c(1:3))

set.seed(42)
rf_gridsearch <- train(target ~ A + B + C, 
                   data = dat, 
                   method="rf",
                   ntree = 2500, 
                   metric= "RMSE", 
                   tuneGrid=tunegrid, 
                   trControl=control)

dat$pred_caret <- rf_gridsearch$finalModel$predicted

dat$pred <- predict(object = rf_gridsearch, newdata = dat[,2:4])
dat$pred2 <- predict(object = rf_gridsearch$finalModel, newdata = dat[,2:4])

Последняя строка этого кода дает сообщение об ошибке

Error in predict.randomForest(object = rf_gridsearch$finalModel, 
newdata = dat[,  : variables in the training data missing in newdata

Как можно использовать $finalModel с прогнозом?

Почему данные в столбце dat$pred_caret отличаются от dat$pred? В чем разница между двумя предсказаниями?

1 Ответ

0 голосов
/ 08 января 2019

Там уже много вопросов, связанных с этой проблемой. См

по SO и Вопрос 1 , Вопрос 2 , Вопрос 3 , Вопрос 4 , Вопрос 5 на Stats.SE.


В качестве пары ответов на упоминание Stats.SE, dat$pred_caret отличается от dat$pred, потому что predict.train использует весь тренировочный набор, в то время как с predict.randomForest мы имеем это

newdata - фрейм данных или матрица, содержащая новые данные. (Примечание: если нет с учетом возвращается прогноз «вне пакета» в объекте.

где rf_gridsearch$finalModel$predicted в основном совпадает с

randomForest:::predict.randomForest(rf_gridsearch$finalModel)

, поскольку rf_gridsearch$finalModel является объектом класса randomForest. То есть newdata не предоставляется.

Что касается ошибки, то это связано с тем, что train и randomForest обрабатывают данные по-разному. На этот раз речь идет не о масштабировании или центрировании, а о создании манекенов. В частности, randomForest ищет переменную C (фактор), в то время как train создает фиктивную переменную CB <- 1 * (C == "B"). Следовательно, вы можете повторить результат predict.train с

predict(object = rf_gridsearch$finalModel, 
        newdata = model.matrix(~ A + B + C, dat[, 2:4])[, -1])

, где

model.matrix(~ A + B + C, dat[, 2:4])[, -1]
#     A    B CB
# 1 1.3 44.5  0
# 2 4.4 50.1  0
# 3 5.5 23.7  1
# 4 6.7 89.2  1
# 5 8.1 10.5  1
...