predict.train vs predict使用配方对象

predict.train vs predict使用配方对象,r,r-caret,predict,r-recipes,R,R Caret,Predict,R Recipes,在指定了在caret::train中使用的配方之后,我试图预测新的样本。关于这一点,我有几个问题,因为我在插入符号/食谱文档中找不到 我应该使用predict()还是predict.train()?有什么区别 在使用predict之前,我是否应该先用准备好的配方烘焙测试数据?在train()中直接使用preProcess时,建议不要预处理新数据,因为train对象将自动进行预处理。使用食谱时也是这样吗 下面是一个可复制的示例,说明了我的过程以及使用predict vs predict.train

在指定了在caret::train中使用的配方之后,我试图预测新的样本。关于这一点,我有几个问题,因为我在插入符号/食谱文档中找不到

  • 我应该使用predict()还是predict.train()?有什么区别
  • 在使用predict之前,我是否应该先用准备好的配方烘焙测试数据?在train()中直接使用preProcess时,建议不要预处理新数据,因为train对象将自动进行预处理。使用食谱时也是这样吗
  • 下面是一个可复制的示例,说明了我的过程以及使用predict vs predict.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
    
    库(配方)
    图书馆(插入符号)
    #资料----
    数据(“信用数据”)
    信贷列车%
    步进中心(所有数值())%>%
    阶跃刻度(所有数值()
    #控制参数----
    种子集(0)
    TC=列车控制(“cv”,编号=10,保存预测=“最终”,classProbs=TRUE,返回预测=“最终”)
    种子集(0)
    型号输出=列车(Rec.Obj,
    信用卡列车,
    trControl=TC,
    tuneLength=1,
    公制=“精度”,
    方法=“glm”)
    #配方----
    种子集(0)
    
    prep.rec配方被嵌入到
    train
    对象中。答案不同有两个原因:

  • 由于您正在给配方(在
    Model.Output
    内)重新处理的处理数据。您不应该给出
    predict()
    烘焙数据;只需使用
    predict()
    并为其提供原始测试集

  • 让S3做它自己的事情:
    predict.train
    用于x/y接口,
    predict.train.recipe
    用于配方接口。只要使用
    predict()
    就可以做适当的事情