Est-il correct d'évaluer les pilotes individuels avec la valeur AUC ?
J'ai une discussion avec mon superviseur sur l'utilisation de l'AUC pour déterminer, essentiellement, l'importance de trois facteurs différents composés chacun de plusieurs variables. Il affirme que je peux examiner la valeur AUC pour le modèle global, puis essayer d'exécuter un modèle similaire en utilisant uniquement un pilote à la fois, obtenir la valeur AUC pour chaque pilote et ensuite évaluer l'importance de chaque pilote.
Inherent driver: 2 variables
Static driver: 2 variables
Dynamic driver: 7 variables
Ainsi, ma sortie AUC d'un modèle binaire ElasticNet serait la suivante :
Overall AUC score (all drivers included): 0.89
Ensuite, j'exécute le même modèle ElasticNet mais uniquement avec mes deux variables sélectionnées dans le inherent driver
et la variable dépendante. Et ainsi de suite avec les pilotes suivants etc. etc. Les valeurs AUC sont les suivantes :
Inherent driver: 0.58
Static driver: 0.67
Dynamic driver: 0.88
- Est-ce que le résultat me dit alors que je suis
dynamic driver
relativement plus important, ou juste mieux pour distinguer 0 de 1 ? - Est-ce même une méthode statistiquement valable? Sinon, comment puis-je l'évaluer autrement?
ÉDITER:
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
Maintenant, je répète toute la procédure de modélisation du filet élastique (recherche du compromis crête/lasso optimal et de la valeur de pénalité optimale) avec seulement deux variables. En gros, je modifie les éléments suivants :
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")
Donc finalement, la dernière chose que @EDM a remise en question dans les commentaires.
Réponses
Étant donné que la pénalisation est importante pour votre modélisation, vous êtes potentiellement sur une bonne voie, mais vous devez incorporer des informations sur l'erreur potentielle dans votre métrique de qualité de l'AUC. Vous ne pouvez pas comparer une AUC de 0,58 à une de 0,67 à moins que vous ne sachiez à quel point ces estimations peuvent être variables.
Un moyen simple de gérer cela serait de répéter le processus avec plusieurs (disons plusieurs centaines) fractionnements de test/entraînement au lieu d'un seul comme vous le faites actuellement. Les fractionnements test/train uniques peuvent ne pas être fiables avec des ensembles de données contenant moins de plusieurs milliers de cas . (Comme vous auriez probablement besoin de moins de 200 cas dans la classe minoritaire pour ajuster de manière fiable un modèle non pénalisé avec 11 prédicteurs, je suppose que vous n'avez pas plusieurs milliers de cas et que vous devriez donc faire plus de rééchantillonnage dans tous les cas.) Ensuite, vous utilisez la variabilité parmi les (plusieurs centaines) valeurs d'ASC de l'ensemble de tests pour évaluer si des différences entre les sous-ensembles de prédicteurs sont statistiquement fiables ou non.
Vous pourriez être mieux avec une approche similaire basée sur l'amorçage au lieu des multiples fractionnements test/train. Vous utilisez d'abord toutes les données pour ajuster un modèle complet. De cette façon, vous obtenez un modèle complet qui, contrairement à votre approche, utilise toutes les données disponibles pour construire et ne dépend pas des aléas d'une séparation test/train particulière.
Vous répétez ensuite l'ensemble du processus de modélisation (y compris le choix de alpha
et lambda
via la validation croisée interne) sur quelques centaines d'échantillons bootstrap de l'ensemble de données, et utilisez l'ensemble de données complet comme ensemble de test dans chaque cas. Selon le principe du bootstrap, cela revient à construire des modèles sur plusieurs échantillons de l'ensemble de la population d'intérêt, puis à les tester sur la population. Vous obtenez ainsi une estimation raisonnable de la qualité du processus de modélisation : optimisme (surajustement) dans les valeurs des coefficients, et biais et variabilité dans les estimations de votre mesure de qualité.
En termes de modélisation, même si vous choisissez d'utiliser l'AUC comme mesure finale, vous devriez utiliser la déviance au lieu de l'AUC comme critère pour le choix de validation croisée de alpha
et lambda
. L'AUC (ou C-index) n'est pas très sensible pour distinguer les modèles. Aussi, réfléchissez bien si le lambda.1se
est un bon choix dans ce cas. Cela aide à obtenir un modèle parcimonieux, mais avec si peu de prédicteurs pour commencer (seulement 2 dans votre deuxième exemple), vous pourriez être beaucoup mieux avec la lambda.min
valeur qui minimise l'erreur de validation croisée (encore une fois, mieux fait avec la déviance même si votre final l'évaluation doit être faite avec l'AUC).