¿Es correcto evaluar controladores individuales con el valor AUC?
Tengo una discusión con mi supervisor sobre el uso de AUC para determinar, básicamente, la importancia de tres controladores diferentes que constan de múltiples variables cada uno. Afirma que puedo ver el valor de AUC para el modelo general y luego tratar de ejecutar un modelo similar solo usando un controlador a la vez, obtener el valor de AUC para cada controlador y luego evaluar la importancia de cada controlador.
Inherent driver: 2 variables
Static driver: 2 variables
Dynamic driver: 7 variables
Entonces, mi salida AUC de un modelo binario de ElasticNet sería la siguiente:
Overall AUC score (all drivers included): 0.89
Luego realizo el mismo modelo de ElasticNet pero solo con mis dos variables seleccionadas en inherent driver
y la variable dependiente. Y así sucesivamente con los siguientes controladores, etc., etc. Los valores de AUC son los siguientes:
Inherent driver: 0.58
Static driver: 0.67
Dynamic driver: 0.88
- ¿Me dice entonces el resultado que mi
dynamic driver
es relativamente más importante, o simplemente es mejor para distinguir 0 de 1? - ¿Es esto incluso un método estadísticamente sólido? Si no, ¿de qué otra manera puedo evaluarlo?
EDITAR:
V1 dependent V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1 -1.3 0 494. 34.1 2.23 43.0 4.58 46.7 283. 0.442 34.5 0
2 -4.2 0 231. 16.9 1.01 69.4 0 66.4 277. 0.959 11.1 0
3 -11.7 0 646. 132. 20.5 88.0 0.063 34.0 291. 5.63 21 0
4 -9.3 0 44.0 16.4 0.397 39.1 2.37 77.6 279. 7.24 31.8 0
5 -14.2 0 88.2 128. 40.6 83.4 1.09 47.2 284. 8.23 2.92 0
6 19.4 0 382. 49.4 1.15 54.4 0.914 53.6 279. 3.03 16.8 1
df <- df %>% select(V1, dependent, V2, V3, V4, V5, V6, V7, V8, V9, V11, V12)
training.samples <- df$dependent %>% createDataPartition(p = 0.8, list = FALSE)
train <- df[training.samples, ]
test <- df[-training.samples, ]
x.train <- data.frame(train[, names(train) != "dependent"])
x.train <- data.matrix(x.train)
y.train <- train$dependent
x.test <- data.frame(test[, names(test) != "dependent"])
x.test <- data.matrix(x.test)
y.test <- test$dependent
list.of.fits.overall.model <- list()
for (i in 0:10){
fit.name <- paste0("alpha", i/10)
list.of.fits.overall.model[[fit.name]] <- cv.glmnet(x.train, y.train, type.measure = c("auc"), alpha = i/10, family = "binomial", nfolds = 10, foldid = foldid, parallel = TRUE)
}
predicted <- predict(list.of.fits.overall.model[[fit.name]], s = list.of.fits.overall.model[[fit.name]]$lambda.1se, newx = x.test, type = "response")
#PLOT AUC
pred <- prediction(predicted, y.test)
perf <- performance(pred, "tpr", "fpr")
plot(perf)
abline(a = 0, b = 1, lty = 2, col = "red")
auc_ROCR <- performance(pred, measure = "auc")
auc_ROCR <- [email protected][[1]]
auc_ROCR
Ahora repito todo el procedimiento de modelado de red elástica (búsqueda de compensación óptima de cresta/lazo y valor de penalización óptimo) con solo dos variables. Básicamente, cambio lo siguiente:
df.inherent <- df %>% select(V1, dependent, V2)
training.samples <- df.inherent$dependent %>% createDataPartition(p = 0.8, list = FALSE)
train <- df.inherent[training.samples, ]
test <- df.inherent[-training.samples, ]
x.train <- data.frame(train[, names(train) != "dependent"])
x.train <- data.matrix(x.train)
y.train <- train$dependent
x.test <- data.frame(test[, names(test) != "dependent"])
x.test <- data.matrix(x.test)
y.test <- test$dependent
list.of.fits.inherent <- list()
for (i in 0:10){
fit.name <- paste0("alpha", i/10)
list.of.fits.inherent[[fit.name]] <- cv.glmnet(x.train, y.train, type.measure = c("auc"), alpha = i/10, family = "binomial", nfolds = 10, foldid = foldid, parallel = TRUE)
}
predicted <- predict(list.of.fits.inherent[[fit.name]], s = list.of.fits.inherent[[fit.name]]$lambda.1se, newx = x.test, type = "response")
Entonces, finalmente, lo último que @EDM cuestionó en los comentarios.
Respuestas
Dado que la penalización es importante para su modelado, está en un camino potencialmente bueno, pero necesita incorporar información sobre el error potencial en su métrica de calidad de AUC. No puede comparar un AUC de 0,58 con uno de 0,67 a menos que sepa cuán variables pueden ser esas estimaciones.
Una forma sencilla de manejar esto sería repetir el proceso con múltiples (digamos varios cientos) divisiones de prueba/entrenamiento en lugar de una sola como lo realiza actualmente. Las divisiones de prueba/tren individuales pueden ser poco confiables con conjuntos de datos que tienen algo por debajo de varios miles de casos . (Como probablemente necesitaría menos de 200 casos en la clase minoritaria para ajustar un modelo no penalizado con 11 predictores de manera confiable, asumo que no tiene varios miles de casos y, por lo tanto, debería hacer más remuestreo en cualquier caso). Luego usa la variabilidad entre los (varios cientos) valores de AUC del conjunto de prueba para medir si las diferencias entre los subconjuntos predictores son o no estadísticamente confiables.
Es posible que esté mejor con un enfoque similar basado en el arranque en lugar de múltiples divisiones de prueba/entrenamiento. Primero usa todos los datos para ajustar un modelo completo. De esa manera, obtiene un modelo completo que, a diferencia de su enfoque, usa todos los datos disponibles para construir y no depende de los caprichos de una división de prueba/entrenamiento en particular.
Luego, repite todo el proceso de modelado (incluida la elección de alpha
y lambda
a través de la validación cruzada interna) en unos pocos cientos de muestras de arranque del conjunto de datos, y utiliza el conjunto de datos completo como conjunto de prueba en cada caso. Bajo el principio de arranque, que es análogo a construir modelos en múltiples muestras de toda la población de interés y luego probarlos en la población. De este modo, obtiene una estimación razonable de la calidad del proceso de modelado: optimismo (sobreajuste) en los valores de los coeficientes y sesgo y variabilidad en las estimaciones de su medida de calidad.
En términos de modelado, incluso si elige usar AUC como su medida final, debe usar la desviación en lugar de AUC como criterio para la elección de validación cruzada de alpha
y lambda
. El AUC (o índice C) no es muy sensible para distinguir entre modelos. Además, piense detenidamente si lambda.1se
es una buena opción en este caso. Eso ayuda a obtener un modelo parsimonioso, pero con tan pocos predictores para comenzar (solo 2 en su segundo ejemplo), es posible que esté mucho mejor con el lambda.min
valor que minimiza el error de validación cruzada (nuevamente, es mejor hacerlo con desviación incluso si su final la evaluación debe hacerse con AUC).