предикат.трейн против предсказать, используя объекты рецепта - PullRequest
1 голос
/ 11 марта 2019

После указания рецепта для использования в caret :: train я пытаюсь предсказать новые образцы. У меня есть пара вопросов по этому поводу, которые я не могу найти в документации по рецептам / рецептам.

  1. Должен ли я использовать предикат () или предикат.train ()? Какая разница?
  2. Должен ли я сначала испечь данные теста с подготовленным рецептом перед использованием предикторов? При использовании предварительной обработки непосредственно в train () вам не рекомендуется предварительно обрабатывать новые данные, так как объект train сделает это автоматически. Это то же самое при использовании рецептов?

Ниже приведен воспроизводимый пример, иллюстрирующий мой процесс и разницу в предсказаниях при использовании предиката против предиката. Поезд

library(recipes)
library(caret)
# Data ----
data("credit_data")

credit_train <- credit_data[1:3500,]
credit_test <- credit_data[-(1:3500),]

# Set up recipe ----

set.seed(0)
Rec.Obj = recipe(Status ~ ., data = credit_train) %>%
    step_knnimpute(all_predictors()) %>% 
    step_center(all_numeric())%>%
    step_scale(all_numeric())

# Control parameters ----
set.seed(0)
TC = trainControl("cv",number = 10, savePredictions = "final", classProbs = TRUE, returnResamp = "final")


set.seed(0)
Model.Output = train(Rec.Obj,
                     credit_train,
                     trControl = TC,
                     tuneLength = 1,
                     metric = "Accuracy",
                     method = "glm")

# Preped recipe ----
set.seed(0)
prep.rec <- 
    prep(Rec.Obj, newdata = credit_train)

# Baked data for observation ----
set.seed(0)
bake.train <- bake(prep.rec, new_data = credit_train)
bake.test <- bake(prep.rec, new_data = credit_test)

# investigation of prediction methods ----

# no application of recipe to newdata
set.seed(0)
predict.norm = predict(Model.Output, credit_test, type = "raw")
predict.train = predict.train(Model.Output, credit_test,  type = "raw")

identical(predict.norm,predict.train)
# evaluates to FALSE

# Apply recipe to new data (bake.test)
predict.norm.baked = predict(Model.Output, bake.test, type = "raw")
predict.train.baked = predict.train(Model.Output, bake.test, type = "raw")

identical(predict.norm.baked, predict.train.baked)
# evaluates to FALSE

# Comparison of both predict() funcs
identical(predict.norm, predict.norm.baked)
# evaluates to FALSE

1 Ответ

0 голосов
/ 21 марта 2019

Рецепт встроен в объект train.Ответы различаются по двум причинам:

  1. Поскольку вы даете рецепту (внутри Model.Output) обработанные данные для повторной обработки.Вы не должны давать predict() запеченные данные;просто используйте predict() и дайте ему исходный набор тестов ..

  2. Пусть S3 сделает свое дело: predict.train для интерфейса x / y и predict.train.recipe для рецептаинтерфейс.Использование predict() сделает правильную вещь.

...