私は、結果の確率がかなり低い(aroung 3%)バイナリ分類タスクを実行しています。AUCで最適化するか、ログ損失で最適化するかを決定しようとしています。私が理解しているように、AUCはモデルの能力を最大化してクラスを区別しますが、対数損失は実際の確率と推定された確率の相違にペナルティを課します。私の仕事では、精度の精度を校正することが非常に重要です。だから私はログロスを選びますが、最高のログロスモデルは最高のAUC / GINIモデルでもあるべきかどうか疑問に思います。
私は、結果の確率がかなり低い(aroung 3%)バイナリ分類タスクを実行しています。AUCで最適化するか、ログ損失で最適化するかを決定しようとしています。私が理解しているように、AUCはモデルの能力を最大化してクラスを区別しますが、対数損失は実際の確率と推定された確率の相違にペナルティを課します。私の仕事では、精度の精度を校正することが非常に重要です。だから私はログロスを選びますが、最高のログロスモデルは最高のAUC / GINIモデルでもあるべきかどうか疑問に思います。
回答:
ご指摘のとおり、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()
}
不均衡なラベルの場合、AUC(https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/またはpython scikit-learn docs)よりも、再現率曲線の下の領域が望ましい
また、精度を最大化することが目標である場合は、クロス検証を実行して、パフォーマンスメトリックとして「精度」を使用する最適なモデル(アルゴリズム+ハイパーパラメーター)を選択することを検討できます。