1 votos

Se observa una correlación negativa entre la precisión de la CV y la del conjunto de pruebas

He estado tratando de evaluar si es más apropiado dividir mi conjunto de datos en conjuntos de prueba y de entrenamiento para estimar la exactitud del modelo o utilizar el CV con exclusión.

Al comparar la variación en las precisiones reportadas por los dos enfoques, noté que tienden a estar correlacionadas negativamente, lo cual no tiene ningún sentido para mí.

Para ilustrar este problema he utilizado un conjunto de datos diferente que he visto mencionado en este Correo electrónico: y también usé los mismos comandos de preprocesamiento que se usaron en ese post. Como se mencionó anteriormente, he visto la misma correlación negativa extraña en las precisiones en un conjunto de datos diferente, así que no creo que los pasos de preprocesamiento y / o las peculiaridades de este conjunto de datos específicos son responsables.

Creo que es más probable que me esté perdiendo algo trivial - ¿alguien tiene una idea de lo que está pasando aquí? Ver mi Rscript y gráfico de dispersión de las precisiones a continuación.

library(caret)

### import doMC library and allow up to 30 cores to be used for multi-threading:
library(doMC)
registerDoMC(cores = 30)

### GermanCredit dataset, which is packaged with caret:
data(GermanCredit)

### prep df for all results:
out <- data.frame( matrix( NA , nrow=0 , ncol=5 ))
colnames(out) <- c("Rep" , "mtry" , "train_accuracy" , "test_accuracy" , "Kappa")

GermanCredit <- GermanCredit[, -nearZeroVar(GermanCredit)]
GermanCredit$CheckingAccountStatus.lt.0 <- NULL
GermanCredit$SavingsAccountBonds.lt.100 <- NULL
GermanCredit$EmploymentDuration.lt.1 <- NULL
GermanCredit$EmploymentDuration.Unemployed <- NULL
GermanCredit$Personal.Male.Married.Widowed <- NULL
GermanCredit$Property.Unknown <- NULL
GermanCredit$Housing.ForFree <- NULL

### use leave-one-out CV and a grid search for the mtry parameter:
fit_control <- trainControl( method = "LOOCV" ,  search="grid" )

for ( i in 1:100) {

  ### change random seed for every replicate (for both dividing data into test/training sets and for the RF itself)
  set.seed(1991 + i)

  ### divide data into test/training sets:
  inTrain <- createDataPartition(GermanCredit$Class, p = .8)[[1]]
  GermanCreditTrain <- GermanCredit[ inTrain, ]
  GermanCreditTest  <- GermanCredit[-inTrain, ]

  set.seed(10847 + i)
  ### run RF model with tuneLength and ntree set to small values so this script can be re-run relatively quickly 
  ### I observed the same overall trend of negative correlation when tuneLength=30 and ntree = 1001, so this isn't the problem.

  credit.rf <- train( Class ~ . , data = GermanCreditTrain, trControl=fit_control , model="rf", tuneLength=3, ntree = 11)

  ### get accuracy on test set:
  test.rf <- predict( credit.rf, GermanCreditTest)
  test_confusionMatrix <- confusionMatrix( test.rf , GermanCreditTest$Class )

  result <- data.frame( matrix(c( i , credit.rf$bestTune[[1]] , credit.rf$results$Accuracy[which(credit.rf$results$mtry==credit.rf$bestTune[[1]])] , test_confusionMatrix$overall[[1]] ,  test_confusionMatrix$overall[[2]]  ), nrow=1, ncol=5) )

  colnames(result) <- c("Rep" , "mtry" , "train_accuracy" , "test_accuracy" , "Kappa")
  out <- rbind( out, result)

}

plot( out$train_accuracy , out$test_accuracy , pch = 16 , xlab="Training set leave-one-out CV accuracy" , ylab="Test set accuracy")

enter image description here

cor.test( out$train_accuracy , out$test_accuracy )

# Pearson's product-moment correlation
# 
# data:  out$train_accuracy and out$test_accuracy
# t = -5.128, df = 98, p-value = 1.476e-06
# alternative hypothesis: true correlation is not equal to 0
# 95 percent confidence interval:
# -0.601990 -0.289714
# sample estimates:
# cor 
# -0.4599582 

EDITAR: Creo que ahora entiendo el problema, véase mi respuesta más abajo.

2voto

hyeomans Puntos 726

Supongamos que tienes perros y gatos. Tiene una característica "ladridos" que predice los perros con una precisión del 100%. Sin embargo, falta el 50%. En cualquier muestra, cuantos más "ladridos" tenga, más perros podrá encontrar.

El número de ladridos en el tren está inversamente correlacionado en un 100% con el número de ladridos en su muestra de prueba. Por lo tanto, las puntuaciones en el tren y en la prueba también están inversamente correlacionadas.

Aunque este es un caso extremo, el mismo argumento se aplicaría a cualquier característica predictiva. Cuanto más aparece en el entrenamiento, menos aparece en la prueba. Las muestras de entrenamiento y de prueba no son independientes si se extraen de los mismos datos.

1voto

bmcoas Puntos 1

He realizado una validación cruzada con el conjunto de entrenamiento y he comparado esa precisión con la calculada al ajustar los datos de prueba al modelo. No es una comparación justa, ya que el modelo se evalúa en dos conjuntos de datos diferentes.

Creo que la razón de la correlación negativa anterior es que la RF se ajusta a algunas muestras mejor que a otras. En los casos en los que obtuve una alta precisión con CV, creo que esas muestras se incluyeron probablemente en el conjunto de entrenamiento y no en el conjunto de prueba (y viceversa cuando calculé una mayor precisión en el conjunto de prueba).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X