Требуется ли предварительная обработка перед прогнозированием с использованием 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берет все, что им дано. Поскольку разбиения дерева основаны на обработанных значениях, прогнозы будут отключены.

Максимум


но 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и никакая предварительная обработка не выполняется до прогнозирования.
топепо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.