Требуется ли предварительная обработка перед прогнозированием с использованием FinalModel из RandomForest с пакетом Caret?

12

Я использую пакет caret для обучения объекта randomForest с 10x10CV.

library(caret)
tc <- trainControl("repeatedcv", number=10, repeats=10, classProbs=TRUE, savePred=T) 
RFFit <- train(Defect ~., data=trainingSet, method="rf", trControl=tc, preProc=c("center", "scale"))

После этого я тестирую randomForest на testSet (новые данные)

RF.testSet$Prediction <- predict(RFFit, newdata=testSet)

Матрица путаницы показывает мне, что модель не так уж и плоха.

confusionMatrix(data=RF.testSet$Prediction, RF.testSet$Defect)
              Reference
    Prediction   0   1
             0 886 179
             1  53 126  

      Accuracy : 0.8135          
             95% CI : (0.7907, 0.8348)
No Information Rate : 0.7548          
P-Value [Acc > NIR] : 4.369e-07       

              Kappa : 0.4145 

Теперь я хочу протестировать $ finalModel и думаю, что он должен дать мне тот же результат, но каким-то образом я получаю

> RF.testSet$Prediction <- predict(RFFit$finalModel, newdata=RF.testSet)
>  confusionMatrix(data=RF.testSet$Prediction, RF.testSet$Defect)
Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 323  66
         1 616 239

               Accuracy : 0.4518          
                 95% CI : (0.4239, 0.4799)
    No Information Rate : 0.7548          
    P-Value [Acc > NIR] : 1               

                  Kappa : 0.0793 

Что мне не хватает?

изменить @topepo:

Я также узнал другой randomForest без опции preProcessed и получил другой результат:

RFFit2 <- train(Defect ~., data=trainingSet, method="rf", trControl=tc)
testSet$Prediction2 <- predict(RFFit2, newdata=testSet)
confusionMatrix(data=testSet$Prediction2, testSet$Defect)

Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 878 174
         1  61 131

               Accuracy : 0.8111          
                 95% CI : (0.7882, 0.8325)
    No Information Rate : 0.7548          
    P-Value [Acc > NIR] : 1.252e-06       

                  Kappa : 0.4167     
Фрэнк
источник
во-первых, вы предсказывали с помощью объекта поезда, который вы вызывали RFFit, во второй раз, когда вы предсказывали, используя объект модели, я полагаю. Таким образом, разница может заключаться в передаче других вещей вместе с объектом поезда, который обрабатывал ваши новые тестовые данные как-то иначе, чем без использования объекта поезда.
докторская степень
4
Для 2-й trainмодели вы получите немного другой результат, если вы не установите случайное число семян перед запуском (см. ?set.seed). Значения точности равны 0,8135 и 0,8111, которые довольно близки и связаны только со случайностью повторной выборки и модельных расчетов.
topepo

Ответы:

17

Разница заключается в предварительной обработке. predict.trainавтоматически центрирует и масштабирует новые данные (поскольку вы об этом просили), а predict.randomForestберет все, что им дано. Поскольку разбиения дерева основаны на обработанных значениях, прогнозы будут отключены.

Максимум

topepo
источник
но RFFitобъект создается с помощью предварительно обработанного trainметода ... поэтому он должен возвращать центрированный и масштабированный объект (не так ли?). Если так -> $finalModelследует также масштабировать и центрировать
Фрэнк
2
Да, но, согласно приведенному выше коду, вы не применили центрирование и масштабирование к testSet. predict.trainделает это, но predict.randomForestне делает.
Топепо
так нет разницы в использовании predict(RFFit$finalModel, testSet)и predict(RFFit, testSet)на одном и том же testSet?
Фрэнк
6
predict(RFFit$finalModel, testSet)и predict(RFFit, testSet)будет другим, если вы используете preProcопцию в train. Если нет, они тренируются по одному и тому же набору данных. Другими словами, любая предварительная обработка, которую вы запрашиваете, выполняется в тренировочном наборе перед запуском randomForest. Он также применил ту же предварительную обработку к любым данным, которые вы прогнозируете (используете predict(RFFit, testSet)). Если вы используете finalModelобъект, вы используете predict.randomForestвместо, predict.trainи никакая предварительная обработка не выполняется до прогнозирования.
топепо