しきい値を動かすと、見逃しと誤検出が入れ替わる
第5章のロジスティック回帰は、「陽性である確率」を出し、その確率が しきい値 (例えば0.5)以上なら陽性と判定しました。しきい値は、0.5でなければいけないわけではありません。しきい値を動かすと、判定の結果が変わります。
乳がんの診断データで確かめる
乳がんの診断データ(細胞の画像から測った30個の数値と、良性・悪性の診断)を使います。悪性を「陽性」として、ロジスティック回帰で学習させ、テストデータ171件(うち悪性64件)で、しきい値を変えてみました。
しきい値を 下げる と、少しでも悪性の可能性があれば陽性と判定するので、見逃しは減ります(再現率が上がる)。その代わり、誤検出が増えます(適合率が下がる)
しきい値を 上げる と、確信があるときだけ陽性と判定するので、誤検出は減りますが、見逃しが増えます
しきい値は、「どちらの間違いが重いか」で決める
見逃しの被害が大きい(がんを見落とすと命に関わる)なら、しきい値を下げて、誤検出は精密検査で確かめる、という考え方になります。反対に、誤検出の被害が大きい場面(大事なメールを迷惑メールとして捨ててしまうなど)では、しきい値を上げます。しきい値は、モデルの性能ではなく、使い方の設計で決めるもの です。
(このモデルは教材のための例で、実際の診断は医師が行います)
出典: 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に近づく (グラフの左上に張り付く)形になります。
偽陽性率 真陽性率 0 0.5 1 0 0.5 1 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の組だけが逆)。8 9 ≈ 0.889 \frac{8}{9} \approx 0.889 9 8 ≈ 0.889 が、AUCの「陽性の方に高い確率を付けている割合」という意味と一致しています。
よくある誤解
「しきい値は0.5に決まっている」 : 0.5は目安にすぎません。見逃しと誤検出のどちらが重いかで決めます
「AUCが高ければ、そのまま使ってよい」 : AUCは、しきい値を決める前の「分ける力」です。実際に使うしきい値での見逃しや誤検出の数を、必ず確かめます
「AUCに predict の結果(0か1)を渡せばよい」 : 0か1だけでは、しきい値を変えた様子を表せません。確率を渡します
振り返り
しきい値を下げると見逃しが減り誤検出が増え、上げるとその逆になる。どちらの間違いが重いかで決める
ROC曲線は、しきい値を変えたときの偽陽性率と真陽性率のグラフ。左上に張り付くほどよい
AUCはROC曲線の下の面積。陽性と陰性を1件ずつ選んだとき、陽性に高い確率を付けている割合