Правильно ли оценивать отдельных водителей с помощью значения AUC?

Aug 18 2020

Я обсуждаю со своим руководителем использование AUC для определения важности трех разных драйверов, каждый из которых состоит из нескольких переменных. Он утверждает, что я могу изучить значение AUC для всей модели, а затем попытаться запустить аналогичную модель, используя только один драйвер за раз, получить значение AUC для каждого драйвера и затем оценить важность каждого драйвера.

Inherent driver: 2 variables
Static driver: 2 variables
Dynamic driver: 7 variables

Итак, мой вывод AUC из бинарной модели ElasticNet будет следующим:

Overall AUC score (all drivers included): 0.89

Затем я использую ту же модель ElasticNet, но только с двумя моими переменными, выбранными в inherent driverзависимой переменной и. И так далее со следующими драйверами и т. Д. И т. Д. Значения AUC следующие:

Inherent driver:                          0.58
Static driver:                            0.67
Dynamic driver:                           0.88
  1. Тогда результат говорит мне, что мои dynamic driverотносительно более важны или просто лучше различать 0 от 1?
  2. Это вообще статистически надежный метод? Если нет, то как еще я могу это оценить?

РЕДАКТИРОВАТЬ:

       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

Теперь я повторяю всю процедуру моделирования эластичной сети (поиск оптимального соотношения гребень / лассо и оптимального значения штрафа) всего с двумя переменными. В основном я меняю следующее:

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")

В конце концов, это последнее, что @EDM ставит под сомнение в комментариях.

Ответы

2 EdM Aug 20 2020 at 00:47

Учитывая, что штрафы важны для вашего моделирования, вы находитесь на потенциально хорошем пути, но вам необходимо включить информацию о потенциальной ошибке в вашу метрику качества AUC. Вы не можете сравнить AUC 0,58 с величиной 0,67, если не знаете, насколько переменными могут быть эти оценки.

Простой способ справиться с этим - повторить процесс с несколькими (скажем, несколькими сотнями) разбиениями на тест / поезд вместо одного, как вы сейчас выполняете. Разделение одного теста / поезда может быть ненадежным, если наборы данных содержат менее нескольких тысяч наблюдений . (Поскольку вам, вероятно, понадобится менее 200 наблюдений в классе меньшинства, чтобы надежно соответствовать непенализованной модели с 11 предикторами, я предполагаю, что у вас нет нескольких тысяч наблюдений и, следовательно, в любом случае следует выполнять больше повторной выборки.) Затем вы используете изменчивость среди (нескольких сотен) значений AUC тестового набора для оценки того, являются ли статистически достоверными какие-либо различия между подмножествами предикторов.

Возможно, вам будет лучше использовать аналогичный подход, основанный на начальной загрузке, а не на нескольких разделениях тест / поезд. Сначала вы используете все данные, чтобы соответствовать полной модели. Таким образом, вы получаете полную модель, которая, в отличие от вашего подхода, использует все доступные данные для построения и не зависит от капризов конкретного разделения теста / поезда.

Затем вы повторяете весь процесс моделирования (включая выбор alphaи lambdaвнутреннюю перекрестную проверку) на нескольких сотнях образцов начальной загрузки набора данных и в каждом случае используете весь набор данных в качестве набора тестов. В соответствии с принципом начальной загрузки, который аналогичен построению моделей на нескольких выборках из всей интересующей совокупности, а затем их тестированию на этой совокупности. Таким образом, вы получаете разумную оценку качества процесса моделирования: оптимизм (переоснащение) значений коэффициентов, а также предвзятость и изменчивость оценок вашего показателя качества.

С точки зрения моделирования, даже если вы решите использовать AUC в качестве окончательной меры, вы должны использовать отклонение вместо AUC в качестве критерия для выбора для перекрестной проверки alphaи lambda. AUC (или C-индекс) не очень чувствителен для различения моделей. Кроме того, lambda.1seхорошенько подумайте, хороший ли выбор в данном случае. Это помогает получить экономную модель, но с таким небольшим количеством предикторов для начала (только 2 во втором примере) вам может быть намного лучше со lambda.minзначением, которое минимизирует ошибку перекрестной проверки (опять же, лучше всего делать с отклонением, даже если ваш последний оценка должна проводиться с помощью AUC).