Карета возвращает другие предсказания с объектом поезда кареты, чем с извлеченной конечной моделью - PullRequest
0 голосов
/ 17 мая 2018

Я предпочитаю использовать каретку при подгонке моделей из-за ее относительной скорости и возможностей предварительной обработки. Тем не менее, я немного запутался в том, как он делает прогнозы. При сравнении прогнозов, сделанных непосредственно из объекта поезда, и прогнозов, сделанных из извлеченной окончательной модели, я вижу очень разные цифры. Прогнозы от объекта поезда кажутся более точными.

library(caret)
library(ranger)

x1 <- rnorm(100)
x2 <- rbeta(100, 1, 1)

y <- 2*x1 + x2 + 5*x1*x2

data <- data.frame(x1, x2, y)
fitRanger <- train(y ~ x1 + x2, data = data,
                   method = 'ranger', 
                   tuneLength = 1,
                   preProcess = c('knnImpute', 'center', 'scale'))

predict.data <- data.frame(x1 = rnorm(10), x2 = rbeta(10, 1, 1))
prediction1 <- predict(fitRanger, newdata = predict.data)
prediction2 <- predict(fitRanger$finalModel, data = predict.data)$prediction

results <- data.frame(prediction1, prediction2)
results

Я уверен, что это как-то связано с тем, как я препроцессирую данные в объекте поезда, но даже когда я препроцессирую тестовые данные и использую модель Ranger, чтобы делать прогнозы, значения разные

predict.data.processed <- predict.data %>% 
                             preProcess(method = c('knnImpute', 
                                                   'center', 
                                                   'scale')) %>% .$data

results3 <- predict(fitRanger$finalModel, data = predict.data.processed)$prediction

results <- cbind(results, results3)
results

Я хочу извлечь прогнозы из каждого отдельного дерева в модели рейнджера, что я не могу сделать в карете. Есть мысли?

1 Ответ

0 голосов
/ 17 мая 2018

Чтобы получить те же прогнозы из окончательной модели, что и с помощью каретки train, вы должны предварительно обработать данные таким же образом. Используя ваш пример с set.seed(1):

предсказание кареты:

prediction1 <- predict(fitRanger,
                       newdata = predict.data)

предсказатель рейнджера на окончательной модели. предварительный процесс вставки использовался в предикате. данные

prediction2 <- predict(fitRanger$finalModel,
                       data = predict(fitRanger$preProcess,
                                      predict.data))$prediction

all.equal(prediction1,
          prediction2)
#output
TRUE
...