本文へスキップ
ひもとくAI

しきい値とROC曲線・AUC

レッスン 2/6

しきい値を動かすと、見逃しと誤検出が入れ替わる

第5章のロジスティック回帰は、「陽性である確率」を出し、その確率が しきい値(例えば0.5)以上なら陽性と判定しました。しきい値は、0.5でなければいけないわけではありません。しきい値を動かすと、判定の結果が変わります。

乳がんの診断データで確かめる

乳がんの診断データ(細胞の画像から測った30個の数値と、良性・悪性の診断)を使います。悪性を「陽性」として、ロジスティック回帰で学習させ、テストデータ171件(うち悪性64件)で、しきい値を変えてみました。

しきい値0.10.30.50.70.9
見逃し(悪性なのに良性と判定、64件中)13458
誤検出(良性なのに悪性と判定、107件中)1410400
再現率0.9840.9530.9380.9220.875
適合率0.8180.8590.9381.0001.000
  • しきい値を 下げる と、少しでも悪性の可能性があれば陽性と判定するので、見逃しは減ります(再現率が上がる)。その代わり、誤検出が増えます(適合率が下がる)
  • しきい値を 上げる と、確信があるときだけ陽性と判定するので、誤検出は減りますが、見逃しが増えます

しきい値は、「どちらの間違いが重いか」で決める

見逃しの被害が大きい(がんを見落とすと命に関わる)なら、しきい値を下げて、誤検出は精密検査で確かめる、という考え方になります。反対に、誤検出の被害が大きい場面(大事なメールを迷惑メールとして捨ててしまうなど)では、しきい値を上げます。しきい値は、モデルの性能ではなく、使い方の設計で決めるもの です。

(このモデルは教材のための例で、実際の診断は医師が行います)

出典: Wolberg, W., Mangasarian, O., Street, N., & Street, W. (1993). Breast Cancer Wisconsin (Diagnostic) [Dataset]. UCI Machine Learning Repository. https://doi.org/10.24432/C5DW2B ライセンス: CC BY 4.0

ROC曲線とAUC:しきい値によらない、モデルのよさ

しきい値を決める前に、「モデルそのものが、陽性と陰性をどれくらい上手に分けられているか」を比べたいことがあります。そのときに使うのが ROC曲線 です。

しきい値を1から0まで少しずつ下げながら、次の2つの割合を記録し、グラフにします。

  • 縦軸 真陽性率: 本当に陽性の中で、陽性と判定した割合(再現率と同じ)
  • 横軸 偽陽性率: 本当は陰性の中で、誤って陽性と判定した割合

しきい値を下げるほど、両方とも増えていきます。よいモデルほど、偽陽性率が小さいうちに、真陽性率が一気に1に近づく(グラフの左上に張り付く)形になります。

偽陽性率真陽性率00.5100.51
  • 30個の数値を使うモデル(AUC 0.992)
  • 2個の数値だけのモデル(AUC 0.776)
  • でたらめに判定した場合(AUC 0.5)
乳がんの診断データのROC曲線。30個の数値を使うモデルは、偽陽性率0のまま真陽性率が0.92まで上がり、グラフの左上に張り付く形。2個の数値だけのモデルは、左上から離れた、ゆるやかに上がる階段状の曲線。でたらめに判定した場合は、左下から右上への対角線になる

AUC:ROC曲線の下の面積

ROC曲線の下側の面積を AUC と呼び、0.5〜1の値になります(1が完全に分けられる、0.5がでたらめと同じ)。30個の数値を使うモデルのAUCは0.992、わざと2個の数値(細胞の模様の粗さと、輪郭の複雑さ)だけにした弱いモデルは0.776でした。

AUCには、わかりやすい意味もあります。陽性のデータと陰性のデータを1件ずつでたらめに選んだとき、陽性の方に高い確率を付けている割合 です。AUC 0.992なら、ほぼ必ず、悪性の方に高い確率を付けられていることになります。

AUCと、正解率・F値の使い分け

  • AUCは、しきい値を決める前の「分ける力」を比べるのに使う。不均衡なデータでも、正解率ほどは見かけに引っ張られない
  • 実際に使うときは、しきい値を決め、そのしきい値での再現率・適合率(前のスライドの表)で、使い方に合っているかを確かめる

PythonでROC曲線とAUCを求める、よくある誤解と振り返り

from sklearn.metrics import roc_curve, roc_auc_score

y_true = [0, 0, 1, 1, 0, 1]
prob = [0.1, 0.4, 0.35, 0.8, 0.2, 0.9]      # モデルが出した「陽性である確率」

fpr, tpr, thresholds = roc_curve(y_true, prob)   # しきい値ごとの偽陽性率・真陽性率
print(roc_auc_score(y_true, prob))               # → 約0.889
  • roc_curve は、しきい値を変えたときの偽陽性率 fpr と真陽性率 tpr の並びを返します。これを線でつなぐとROC曲線になります
  • roc_auc_score には、判定結果(0か1)ではなく、確率 を渡します。scikit-learnのモデルなら model.predict_proba(X)[:, 1] で陽性の確率が得られます

この例では、陽性3件と陰性3件の組み合わせ9通りのうち、陽性の方に高い確率を付けているのは8通りです(陽性0.35と陰性0.4の組だけが逆)。89≈0.889\frac{8}{9} \approx 0.889 が、AUCの「陽性の方に高い確率を付けている割合」という意味と一致しています。

よくある誤解

  • 「しきい値は0.5に決まっている」: 0.5は目安にすぎません。見逃しと誤検出のどちらが重いかで決めます
  • 「AUCが高ければ、そのまま使ってよい」: AUCは、しきい値を決める前の「分ける力」です。実際に使うしきい値での見逃しや誤検出の数を、必ず確かめます
  • 「AUCに predict の結果(0か1)を渡せばよい」: 0か1だけでは、しきい値を変えた様子を表せません。確率を渡します

振り返り

  • しきい値を下げると見逃しが減り誤検出が増え、上げるとその逆になる。どちらの間違いが重いかで決める
  • ROC曲線は、しきい値を変えたときの偽陽性率と真陽性率のグラフ。左上に張り付くほどよい
  • AUCはROC曲線の下の面積。陽性と陰性を1件ずつ選んだとき、陽性に高い確率を付けている割合

演習

演習を読み込んでいます…