Est-il correct d'évaluer les pilotes individuels avec la valeur AUC ?

Aug 18 2020

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 driveret 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
  1. Est-ce que le résultat me dit alors que je suis dynamic driverrelativement plus important, ou juste mieux pour distinguer 0 de 1 ?
  2. 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

2 EdM Aug 20 2020 at 00:47

É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 alphaet lambdavia 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 alphaet 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.1seest 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.minvaleur 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).