バイナリ分類問題でのaucとloglossの最適化


12

私は、結果の確率がかなり低い(aroung 3%)バイナリ分類タスクを実行しています。AUCで最適化するか、ログ損失で最適化するかを決定しようとしています。私が理解しているように、AUCはモデルの能力を最大化してクラスを区別しますが、対数損失は実際の確率と推定された確率の相違にペナルティを課します。私の仕事では、精度の精度を校正することが非常に重要です。だから私はログロスを選びますが、最高のログロスモデルは最高の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

ここに画像の説明を入力してください


非常に有益な答え。あなたの答えには2つの予測があり、AUCは同じですが、ログの損失が大きく異なります。だから私はこの質問に行きます:私はAUCを最適化するためのモデルを訓練しました。しかし、後になって、ログを失う必要があることに気付きました。ログ損失のモデルを再トレーニングする余裕はありません(これは理想的なケースです)。予測に変換を適用して、ログ損失が最もよくなるようにできますか?(ここで考慮される対数損失はバイナリの意味であり、参照確率は1または0です)。
Rajesh Dachiraju 2017

1
モデルは何を推定していますか?ログ損失は、事後確率を生成している場合にのみ意味があります。これは、AUC最適化モデルでは考えられません。AUCのようなランク統計では、予測の相対的な順序のみが考慮されるため、予測間のギャップの大きさは関係ありません。明らかにこれは確率の場合には当てはまりません。AUC最適化予測で実行するスケーリングでは、この問題に対処する必要があります。さらに、これは、この投稿で概説されているように、LLのグローバルな最小化ではなく、合理的な事後推定に向けた予測のキャリブレーションのみを扱います。
khol

1
出発点としてプラットスケーリングに興味があるかもしれません。
khol

グローバルではないことを理解しています。パラメータを持つ可能性のある変換を設定して、それを試してみたいだけです。
Rajesh Dachiraju 2017

1

不均衡なラベルの場合、AUC(https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/またはpython scikit-learn docs)よりも、再現率曲線の下の領域が望ましい

また、精度を最大化することが目標である場合は、クロス検証を実行して、パフォーマンスメトリックとして「精度」を使用する最適なモデル(アルゴリズム+ハイパーパラメーター)を選択することを検討できます。


2
ここでいくつかの理由で反対票を投じました。1)最初のステートメントの出典または理由を引用する必要があります。2)精度をどの程度正確に最適化しますか?それは縮退したモデルを作成しないでしょうか?
マシュードゥルーリー

2
より良い答えを出すのを手伝ってくれてありがとう。2つの参照を追加しました。そして、どのように精度を最適化しますか?他のメトリックと同じように。たとえばscikit-learnのように、スコアリング関数として「精度」を指定するだけです。精度は、精度、AUCなどのような指標です
ポール

確かに。しかし、人々が「最適化」を読んだとき、彼らはそれがモデルのトレーニング中だと思い込むでしょう。sklearnは固定分類しきい値を使用しているため、これはかなり間違っていると思います。交差検証で実際に調整する必要があります。
マシューDrury

1
ええ、私は今「最適化」がどのように混乱するかもしれないかを理解しています。OPの意味がわかりません。私にとっては、あなたが言うように:CVを介してハイパーパラメーターを調整し、精度を最大化します。そして、それがsklearnにも適用されると思います。
ポール、

確かに、その説明を追加すれば、あなたの答えはここで改善されると思います。少しずれたトピックですが、実際にはsklearnは固定された分類しきい値に基づいて調整するため、これをサポートするのはかなり貧弱だと思います。
Matthew Drury
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.