Чи потрібна попередня обробка перед прогнозуванням за допомогою FinalModel of RandomForest з пакетом caret?


12

Я використовую пакет caret для навчання випадкового об'єкта Forest з 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 без попередньо обробленої опції та отримав інший результат:

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
Для другої trainмоделі ви отримаєте дещо інший результат, якщо ви не встановите насіння випадкового числа перед його запуском (див. ?set.seed). Значення точності - 0,8135 та 0,8111, які є досить близькими і лише через випадковість перекомпонування та модельних розрахунків.
топепо

Відповіді:


17

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

Макс


але RFFitоб'єкт створюється за допомогою trainметоду preProcessed ... тому він повинен повертати об'єкт, орієнтований по центру, і масштабувати його (чи не так?). Якщо так -> $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.