Utilizo el paquete caret para entrenar un objeto randomForest con 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"))
Después de eso, pruebo el randomForest en un testSet (nuevos datos)
RF.testSet$Prediction <- predict(RFFit, newdata=testSet)
La matriz de confusión me muestra que el modelo no es tan malo.
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
Ahora quiero probar el $ finalModel y creo que debería darme el mismo resultado, pero de alguna manera recibo
> 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
¿Qué me estoy perdiendo?
editar @topepo:
También aprendí otro randomForest sin la opción preProcessed y obtuve otro 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
Franco
fuente
fuente
RFFit
, en la segunda vez que predijiste usar el objeto modelo, supongo. Entonces, la diferencia podría estar en pasar otras cosas junto con el objeto del tren que procesó sus nuevos datos de prueba de alguna manera diferente que sin usar el objeto del tren.train
modelo obtendrá un resultado ligeramente diferente a menos que establezca la semilla de número aleatorio antes de ejecutarlo (ver?set.seed
). Los valores de precisión son 0.8135 y 0.8111, que son bastante cercanos y solo debido a la aleatoriedad del remuestreo y los cálculos del modelo.Respuestas:
La diferencia es el preprocesamiento.
predict.train
centra y escala automáticamente los nuevos datos (ya que lo solicitó) mientraspredict.randomForest
toma lo que se le da. Dado que las divisiones de árbol se basan en los valores procesados, las predicciones estarán apagadas.Max
fuente
RFFit
objeto se crea con eltrain
método preProcesado ... por lo que debería devolver un objeto centrado y escalado (¿no?). Si es así -> el$finalModel
también debe ser escalado y centradotestSet
.predict.train
hace eso peropredict.randomForest
no lo hace.predict(RFFit$finalModel, testSet)
ypredict(RFFit, testSet)
en el mismo testSet?predict(RFFit$finalModel, testSet)
ypredict(RFFit, testSet)
será diferente si usa lapreProc
opción entrain
. Si no lo hace, están entrenando en el mismo conjunto de datos. En otras palabras, cualquier procesamiento previo que solicite se realiza en el conjunto de entrenamiento antes de la ejecuciónrandomForest
. También aplicó el mismo preprocesamiento a los datos que predice (usandopredict(RFFit, testSet)
). Si usa elfinalModel
objeto, lo está usando enpredict.randomForest
lugar depredict.train
y ninguno de los procesos previos se realiza antes de la predicción.