Eu uso o pacote de intercalação para treinar um objeto randomForest com 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"))
Depois disso, testei o randomForest em um testSet (novos dados)
RF.testSet$Prediction <- predict(RFFit, newdata=testSet)
A matriz de confusão me mostra que o modelo não é tão ruim assim.
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
Agora quero testar o $ finalModel e acho que ele deve me dar o mesmo resultado, mas de alguma forma recebo
> 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
o que estou perdendo?
edit @topepo:
Também aprendi outra randomForest sem a opção preProcessed e obtive outro resultado:
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
Frank
fonte
fonte
RFFit
, na segunda vez que previu usando o objeto de modelo, eu acho. Portanto, a diferença pode estar na passagem de outras coisas junto com o objeto train que processou seus novos dados de teste de alguma maneira diferente do que sem o uso do objeto train.train
modelo, você obterá um resultado ligeiramente diferente, a menos que defina a semente do número aleatório antes de executá-lo (consulte?set.seed
). Os valores de precisão são 0,8135 e 0,8111, que são bastante próximos e apenas devido à aleatoriedade da reamostragem e aos cálculos do modelo.Respostas:
A diferença é o pré-processamento.
predict.train
centraliza e dimensiona automaticamente os novos dados (desde que você solicitou isso) epredict.randomForest
aceita o que for fornecido. Como as divisões da árvore são baseadas nos valores processados, as previsões serão desativadas.Máx.
fonte
RFFit
objeto é criado com otrain
método preProcessed ... então ele deve retornar um objeto centralizado e dimensionado (não deveria?). Se assim for -> o$finalModel
também deve ser escalado e centradotestSet
.predict.train
faz isso, maspredict.randomForest
não faz.predict(RFFit$finalModel, testSet)
epredict(RFFit, testSet)
no mesmo testSet?predict(RFFit$finalModel, testSet)
epredict(RFFit, testSet)
será diferente se você usar apreProc
opçãotrain
. Caso contrário, eles estão treinando no mesmo conjunto de dados. Em outras palavras, qualquer pré-processamento solicitado é feito no conjunto de treinamento antes da execuçãorandomForest
. Ele também aplicou o mesmo pré-processamento a todos os dados que você prevê (usandopredict(RFFit, testSet)
). Se você usar ofinalModel
objeto, estará usando empredict.randomForest
vez depredict.train
e nenhum pré-processamento será feito antes da previsão.