AUC 값으로 개별 드라이버를 평가하는 것이 맞습니까?
기본적으로 각각 여러 변수로 구성된 세 가지 다른 동인의 중요성을 결정하기 위해 AUC 사용에 대해 상사와 논의했습니다. 그는 전체 모델에 대한 AUC 값을 조사한 다음 한 번에 하나의 드라이버 만 사용하여 유사한 모델을 실행하고 각 드라이버의 AUC 값을 얻은 다음 각 드라이버의 중요성을 평가할 수 있다고 주장합니다.
Inherent driver: 2 variables
Static driver: 2 variables
Dynamic driver: 7 variables
따라서 바이너리 ElasticNet 모델의 AUC 출력은 다음과 같습니다.
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
이제 두 개의 변수만으로 전체 Elastic-net 모델링 절차 (최적 능선 / 올가미 트레이드 오프 및 최적 페널티 값 검색)를 반복합니다. 기본적으로 다음을 변경합니다.
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 중 하나와 비교할 수 없습니다.
이를 처리하는 간단한 방법은 현재 수행중인 단일 테스트 / 훈련 분할 대신 여러 번 (예 : 수백) 테스트 / 훈련 분할로 프로세스를 반복하는 것입니다. 단일 테스트 / 트레인 분할은 수천 케이스 미만의 데이터 세트를 사용하면 신뢰할 수 없습니다 . (11 개의 예측 변수가있는 페널티없는 모델을 안정적으로 맞추려면 소수 클래스에서 200 개 미만의 케이스가 필요할 수 있으므로 수천 개의 케이스가 없으므로 어떤 이벤트에서든 더 많은 리샘플링을 수행해야한다고 가정합니다.) 그런 다음 사용합니다. 예측 인자 하위 집합 간의 차이가 통계적으로 신뢰할 수 있는지 여부를 측정하기위한 (수백 개) 검정 집합 AUC 값 간의 변동성.
여러 테스트 / 훈련 분할 대신 부트 스트랩을 기반으로하는 유사한 접근 방식을 사용하는 것이 더 나을 수 있습니다. 먼저 전체 모델을 맞추기 위해 모든 데이터를 사용합니다. 이렇게하면 접근 방식과 달리 사용 가능한 모든 데이터를 사용하여 특정 테스트 / 훈련 분할의 변동에 의존하지 않는 전체 모델을 얻을 수 있습니다.
그런 다음 수백 개의 데이터 세트 부트 스트랩 샘플에 대해 전체 모델링 프로세스 (선택 alpha
및 lambda
내부 교차 검증 포함) 를 반복하고 각 경우에 전체 데이터 세트를 테스트 세트로 사용합니다. 세 이하 부트 스트랩 원리 인구에 그들을 테스트 후 관심의 전체 인구에서 여러 샘플에 대한 모델을 구축하고 유사하다. 따라서 모델링 프로세스의 품질에 대한 합리적인 추정치를 얻을 수 있습니다. 계수 값의 낙관론 (과적 합), 품질 측정 추정치의 편향 및 변동성입니다.
모델링 측면에서 AUC를 최종 측정 값으로 사용하도록 선택하더라도 alpha
및 의 교차 검증 선택에 대한 기준으로 AUC 대신 이탈도를 사용해야합니다 lambda
. AUC (또는 C-index) 는 모델을 구분하는 데 매우 민감하지 않습니다 . 또한, lambda.1se
이 경우에 좋은 선택 인지 신중하게 생각하십시오 . 이는 간결한 모델을 얻는 데 도움이되지만, 시작할 예측 변수가 너무 적 으면 (두 번째 예에서는 2 개만) lambda.min
교차 검증 오류를 최소화 하는 값을 사용하는 것이 훨씬 더 나을 수 있습니다 (다시 말하지만, 최종 평가는 AUC로 수행해야합니다).