Я использую пакет 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
r
random-forest
prediction
caret
Фрэнк
источник
источник
RFFit
, во второй раз, когда вы предсказывали, используя объект модели, я полагаю. Таким образом, разница может заключаться в передаче других вещей вместе с объектом поезда, который обрабатывал ваши новые тестовые данные как-то иначе, чем без использования объекта поезда.train
модели вы получите немного другой результат, если вы не установите случайное число семян перед запуском (см.?set.seed
). Значения точности равны 0,8135 и 0,8111, которые довольно близки и связаны только со случайностью повторной выборки и модельных расчетов.Ответы:
Разница заключается в предварительной обработке.
predict.train
автоматически центрирует и масштабирует новые данные (поскольку вы об этом просили), аpredict.randomForest
берет все, что им дано. Поскольку разбиения дерева основаны на обработанных значениях, прогнозы будут отключены.Максимум
источник
RFFit
объект создается с помощью предварительно обработанногоtrain
метода ... поэтому он должен возвращать центрированный и масштабированный объект (не так ли?). Если так ->$finalModel
следует также масштабировать и центрироватьtestSet
.predict.train
делает это, ноpredict.randomForest
не делает.predict(RFFit$finalModel, testSet)
иpredict(RFFit, testSet)
на одном и том же testSet?predict(RFFit$finalModel, testSet)
иpredict(RFFit, testSet)
будет другим, если вы используетеpreProc
опцию вtrain
. Если нет, они тренируются по одному и тому же набору данных. Другими словами, любая предварительная обработка, которую вы запрашиваете, выполняется в тренировочном наборе перед запускомrandomForest
. Он также применил ту же предварительную обработку к любым данным, которые вы прогнозируете (используетеpredict(RFFit, testSet)
). Если вы используетеfinalModel
объект, вы используетеpredict.randomForest
вместо,predict.train
и никакая предварительная обработка не выполняется до прогнозирования.