AUC(ROC曲線下面積)とは — 順番の正しさを測る指標と、確率の正しさとの違い
この記事の要点
- AUCは、予測スコアの順番の付け方がどれだけ正しいかを0〜1で表す指標です。0.5は当てずっぽうと同じ、1.0は当たりを全部外れより上に並べられた状態です。
- 「ランダムに選んだ当たり1件のスコアが、外れ1件のスコアより高い確率」と読めます。下の8件の例では0.9375です。
- AUCは確率の数字が正しいか(校正)を見ません。確率を全部半分にしてもAUCは変わらないので、Brier scoreと組み合わせて使います。
モデルが出した確率を評価するとき、「当たりそうなものを上位に並べられているか」と「確率の数字そのものが正しいか」は別の問題です。AUCは前者だけを測る指標です。scikit-learnのroc_auc_scoreの公式リファレンスは、この関数を「予測スコアからROC曲線下面積(ROC AUC)を計算する」ものと説明しています。
ROC曲線とAUC
確率に「ここ以上なら当たりと見なす」というしきい値を置くと、当たりを正しく拾えた割合(真陽性率)と、外れを誤って当たりと見なした割合(偽陽性率)が決まります。しきい値を1から0まで動かし、横軸に偽陽性率、縦軸に真陽性率をとって描いた線がROC曲線で、その下の面積がAUCです。
| AUCの値 | 読み方 |
|---|---|
| 1.0 | 当たりを全部、外れより上に並べられている |
| 0.5 | 順番の付け方が当てずっぽうと変わらない |
| 0.5未満 | 順番が逆になりがち(スコアの向きを取り違えている可能性がある) |
8件の例でAUCを手計算する
架空の8レースについて、ある1艇の1着確率と結果を並べました(実在のレースの値ではありません)。
| レース | モデルの1着確率 | 結果 |
|---|---|---|
| A | 0.90 | 当たり |
| B | 0.80 | 当たり |
| C | 0.70 | 当たり |
| D | 0.60 | 外れ |
| E | 0.55 | 当たり |
| F | 0.50 | 外れ |
| G | 0.30 | 外れ |
| H | 0.20 | 外れ |
当たりは4件(A・B・C・E)、外れは4件(D・F・G・H)です。当たりと外れの組は4×4=16組あります。このうち「当たりの確率が外れより高い」組を数えると、Eの0.55がDの0.60より低い1組だけが逆で、残り15組は正しい順番です。
この「組を数える」考え方は、ROC曲線の面積と同じ値になります。同点の組は0.5組と数えます。
AUCでは分からないこと — 確率の正しさ
上の8件の確率を、全部半分(0.45、0.40、0.35…)にしてみます。順番は変わらないので、AUCは0.9375のままです。ところが確率と結果のずれを二乗して平均するBrier scoreは、0.135から0.224へ悪化します。半分にした確率は、実際の当たりの割合よりずっと低いからです。
| 指標 | 元の確率 | 全部半分にした確率 | 何を見ているか |
|---|---|---|---|
| AUC | 0.9375 | 0.9375 | 順番の付け方 |
| Brier score(小さいほど良い) | 0.135 | 0.224 | 確率の数字と結果のずれ |
オッズと比べて期待値を考えるときに必要なのは、確率の数字そのものです。AUCが高くても、確率が全体に低すぎたり高すぎたりすれば、期待値の計算は狂います。確率のずれの直し方はPlatt scalingとisotonicの違い、ずれの測り方はECE(校正誤差)と予測確率のキャリブレーションで扱っています。
レース予測で使うときの注意
- 1レースの中の比較か、全体の比較かを決める。全レースの全艇をまとめてAUCを出すと、レースをまたいだ比較(強いレースの2番手と弱いレースの1番手)まで混ざります。
- 日付順に分けた検証データで出す。学習に使ったレースでAUCを出すと高く出すぎます。分け方はTimeSeriesSplitの使い方を参照してください。
- 比べる相手を置く。オッズから逆算した確率(インプライド確率)のAUCと並べないと、モデルが市場より順番付けがうまいかは分かりません。
よくある質問
AUCとは何ですか?
ROC曲線の下の面積で、予測スコアの順番の付け方がどれだけ正しいかを0〜1で表す指標です。ランダムに選んだ「当たり」1件のスコアが「外れ」1件より高い確率と読むことができ、0.5は当てずっぽうと同じ水準です。
AUCが高ければ確率も正しいのですか?
そうとは限りません。AUCは順番だけを見るので、すべての予測確率を半分にしても値が変わりません。確率の数字そのものが正しいかは、Brier scoreや校正の図で別に確かめます。
AUCはどうやって計算しますか?
scikit-learnでは roc_auc_score(y_true, y_score) で計算できます。手で計算する場合は、当たりと外れの組を全部作り、当たりのスコアが高い組の割合を数えます(同点は0.5と数えます)。