이진 분류 문제에서 auc 대 logloss 최적화


12

결과 확률이 매우 낮은 이진 분류 작업을 수행하고 있습니다 (3 %). AUC 또는 로그 손실로 최적화할지 여부를 결정하려고합니다. 내가 아는 한, AUC는 클래스를 구별하는 모델의 능력을 최대화하는 반면, logloss는 실제 확률과 추정 된 확률 사이의 차이를 불이익을줍니다. 내 작업에서 정밀 정확도를 교정하는 것이 매우 중요합니다. 그래서 logloss를 선택하지만 최고의 log-loss 모델이 최고의 AUC / GINI 모델이어야하는지 궁금합니다.

답변:


12

언급했듯이 AUC는 순위 통계 (즉, 스케일 불변)이고 로그 손실은 교정 통계입니다. 동일한 AUC를 가지지 만 예측 된 값을 스케일링하여 다른 모델의 로그 손실을 최소화하지 못하는 모델을 사소하게 구성 할 수 있습니다. 치다:

auc <-  function(prediction, actual) {
  mann_whit <- wilcox.test(prediction~actual)$statistic
  1 - mann_whit / (sum(actual)*as.double(sum(!actual)))
}

log_loss <- function (prediction, actual) {
  -1/length(prediction) * sum(actual * log(prediction) + (1-actual) * log(1-prediction))
}

sampled_data <- function(effect_size, positive_prior = .03, n_obs = 5e3) {
  y <- rbinom(n_obs, size = 1, prob = positive_prior)
  data.frame( y = y,
              x1 =rnorm(n_obs, mean = ifelse(y==1, effect_size, 0)))
}

train_data <- sampled_data(4)
m1 <- glm(y~x1, data = train_data, family = 'binomial')
m2 <- m1
m2$coefficients[2] <- 2 * m2$coefficients[2]

m1_predictions <- predict(m1, newdata = train_data, type= 'response')
m2_predictions <- predict(m2, newdata = train_data, type= 'response')

auc(m1_predictions, train_data$y)
#0.9925867 
auc(m2_predictions, train_data$y)
#0.9925867 

log_loss(m1_predictions, train_data$y)
#0.01985058
log_loss(m2_predictions, train_data$y)
#0.2355433

따라서 AUC를 최대화하는 모델이 최소화 된 로그 손실을 의미한다고 말할 수는 없습니다. 로그 손실을 최소화하는 모델이 최대화 된 AUC에 해당하는지 여부는 컨텍스트에 크게 의존합니다. 클래스 분리 성, 모델 편향 등 실제로는 약한 관계를 고려할 수 있지만 일반적으로 단순히 다른 목표입니다. 클래스 분리 가능성 (예측 변수의 크기)을 증가시키는 다음 예제를 고려하십시오.

for (effect_size in 1:7) {
  results <- dplyr::bind_rows(lapply(1:100, function(trial) {
                                    train_data <- sampled_data(effect_size)
                                    m <- glm(y~x1, data = train_data, family = 'binomial')
                                    predictions <- predict(m, type = 'response')
                                    list(auc = auc(predictions, train_data$y),
                                         log_loss = log_loss(predictions, train_data$y),
                                         effect_size = effect_size)
                                  }))
  plot(results$auc, results$log_loss, main = paste("Effect size =", effect_size))
  readline()
}

effect_1

여기에 이미지 설명을 입력하십시오


매우 유익한 답변. 답은 AUC는 같지만 로그 손실은 매우 다른 두 가지 예측이 있습니다. 그래서 나는이 질문에 왔습니다 : 나는 AUC를 최적화하기위한 모델을 훈련했습니다. 그러나 나중에 나는 로그 손실을 위해 가야한다는 것을 깨달았습니다. 로그 손실에 대한 모델을 재교육 할 여유가 없습니다 (이상적 인 경우). 최고의 로그 손실을 갖도록 예측에 변환을 적용 할 수 있습니까? (여기서 고려되는 로그 손실은 이진 의미이며 참조 확률은 1 또는 0입니다).
Rajesh Dachiraju

1
모델은 무엇을 추정합니까? 로그 손실은 사후 확률을 생성하는 경우에만 의미가 있으며 AUC 최적화 모델에는 적합하지 않습니다. AUC와 같은 순위 통계는 예측의 상대적 순서 만 고려하므로 예측 간의 간격의 크기는 관련이 없습니다. 분명히 이것은 확률의 경우가 아닙니다. AUC 최적화 예측에서 수행하는 모든 스케일링은이 문제를 해결해야합니다. 또한이 게시물에 요약 된대로 LL의 전체 최소화가 아니라 합리적인 사후 추정에 대한 예측 교정 만 다룹니다.
khol

1
시작점으로 플래트 스케일링에 관심이있을 수 있습니다 .
khol

나는 그것이 전 세계가 아니라는 것을 이해합니다. 매개 변수가있을 수있는 변환을 설정하고이를 가지고 놀고 싶습니다.
Rajesh Dachiraju

1

불균형 레이블의 경우 정밀 리콜 곡선 아래 영역이 AUC보다 선호됩니다 ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/ 또는 python scikit-learn docs )

또한 정확도를 극대화하는 것이 목표라면 "정밀도"를 성능 메트릭으로 사용하여 교차 검증을 수행하여 최상의 모델 (알고리즘 + 하이퍼 파라미터)을 선택할 수 있습니다.


2
몇 가지 이유로 여기에 투표를했습니다. 1) 첫 진술의 근거 또는 이유를 인용해야합니다. 2) 정밀도를 얼마나 정확하게 최적화합니까? 그것이 퇴화 모델을 만들지 않습니까?
Matthew Drury

2
더 나은 답변을 해주셔서 감사합니다. 2 개의 참조를 추가했습니다. 정밀도를 어떻게 최적화합니까? 다른 측정 항목과 마찬가지로 예를 들어 scikit-learn과 같이 "정밀도"를 스코어링 함수로 지정하면됩니다. 정밀도는 정확도, AUC 등과 같은 메트릭입니다.
Paul

아, 물론 이죠 그러나 사람들이 "최적화"를 읽으면 모델을 훈련하는 동안이라고 가정합니다. sklearn은 고정 분류 임계 값을 사용하기 때문에 이것이 잘못되었다고 생각합니다. 교차 검증을 통해 실제로 조정해야합니다.
Matthew Drury

1
그렇다. 이제 나는 "최적화"가 어떻게 혼란 스러울 수 있는지를 보았다. OP가 어떻게 의미하는지 잘 모르겠습니다. 저에게는 CV를 통해 하이퍼 파라미터를 조정하여 정밀도를 극대화하십시오. 그리고 그것이 당신이 sklearn에도 적용하는 방법이라고 생각합니다.
Paul

분명히, 당신이 그 설명을 추가하면 여기에 당신의 대답이 향상 될 것이라고 생각합니다. 약간 벗어난 주제이지만 실제로는 sklearn이 고정 분류 임계 값을 기반으로 조정하기 때문에 상당히 부적절하다고 생각합니다.
Matthew Drury
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.