Правильно ли оценивать отдельных водителей с помощью значения AUC?
Я обсуждаю со своим руководителем использование 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
- Тогда результат говорит мне, что мои
dynamic driver
относительно более важны или просто лучше различать 0 от 1? - Это вообще статистически надежный метод? Если нет, то как еще я могу это оценить?
РЕДАКТИРОВАТЬ:
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 ставит под сомнение в комментариях.
Ответы
Учитывая, что штрафы важны для вашего моделирования, вы находитесь на потенциально хорошем пути, но вам необходимо включить информацию о потенциальной ошибке в вашу метрику качества AUC. Вы не можете сравнить AUC 0,58 с величиной 0,67, если не знаете, насколько переменными могут быть эти оценки.
Простой способ справиться с этим - повторить процесс с несколькими (скажем, несколькими сотнями) разбиениями на тест / поезд вместо одного, как вы сейчас выполняете. Разделение одного теста / поезда может быть ненадежным, если наборы данных содержат менее нескольких тысяч наблюдений . (Поскольку вам, вероятно, понадобится менее 200 наблюдений в классе меньшинства, чтобы надежно соответствовать непенализованной модели с 11 предикторами, я предполагаю, что у вас нет нескольких тысяч наблюдений и, следовательно, в любом случае следует выполнять больше повторной выборки.) Затем вы используете изменчивость среди (нескольких сотен) значений AUC тестового набора для оценки того, являются ли статистически достоверными какие-либо различия между подмножествами предикторов.
Возможно, вам будет лучше использовать аналогичный подход, основанный на начальной загрузке, а не на нескольких разделениях тест / поезд. Сначала вы используете все данные, чтобы соответствовать полной модели. Таким образом, вы получаете полную модель, которая, в отличие от вашего подхода, использует все доступные данные для построения и не зависит от капризов конкретного разделения теста / поезда.
Затем вы повторяете весь процесс моделирования (включая выбор alpha
и lambda
внутреннюю перекрестную проверку) на нескольких сотнях образцов начальной загрузки набора данных и в каждом случае используете весь набор данных в качестве набора тестов. В соответствии с принципом начальной загрузки, который аналогичен построению моделей на нескольких выборках из всей интересующей совокупности, а затем их тестированию на этой совокупности. Таким образом, вы получаете разумную оценку качества процесса моделирования: оптимизм (переоснащение) значений коэффициентов, а также предвзятость и изменчивость оценок вашего показателя качества.
С точки зрения моделирования, даже если вы решите использовать AUC в качестве окончательной меры, вы должны использовать отклонение вместо AUC в качестве критерия для выбора для перекрестной проверки alpha
и lambda
. AUC (или C-индекс) не очень чувствителен для различения моделей. Кроме того, lambda.1se
хорошенько подумайте, хороший ли выбор в данном случае. Это помогает получить экономную модель, но с таким небольшим количеством предикторов для начала (только 2 во втором примере) вам может быть намного лучше со lambda.min
значением, которое минимизирует ошибку перекрестной проверки (опять же, лучше всего делать с отклонением, даже если ваш последний оценка должна проводиться с помощью AUC).