ROC dan AUC

Kurva ROC dan AUC sebagai evaluasi klasifikasi yang tidak terikat satu ambang.

Daftar isi

Prediksi kelas yang sudah jadi menyembunyikan satu langkah penting, yaitu skor probabilitas yang dihitung model sebelum dipotong oleh ambang keputusan. Kurva ROC (receiver operating characteristic) memetakan perilaku model untuk semua ambang sekaligus, sedangkan AUC (area under the curve) meringkas kurva itu menjadi satu angka. Topik ini membahas keduanya pada dataset breast cancer dengan regresi logistik, mulai dari mekanisme ambang, penghitungan AUC, hingga kurva yang digambar ke berkas kurva-roc.png. Setelah topik ini, perbandingan model klasifikasi tidak lagi terikat pada satu pilihan ambang.

Dari skor ke ambang#

Banyak model klasifikasi tidak langsung mengeluarkan label, melainkan skor probabilitas melalui predict_proba. Label hanya muncul setelah skor dibandingkan dengan ambang (threshold), dan nilai 0.5 hanyalah pilihan bawaan, bukan kebutuhan matematis. Menggeser ambang selalu menukar dua jenis laju sekaligus. Ambang yang diturunkan membuat lebih banyak sampel diprediksi positif. Akibatnya, lebih banyak kasus positif yang tertangkap, tetapi lebih banyak pula sampel negatif yang keliru diprediksi positif.

Kurva ROC memetakan dua laju. Notasi TPTP, FPFP, FNFN, dan TNTN digunakan dengan makna yang sama seperti pada pembahasan confusion matrix. TPR=TPTP+FN \mathrm{TPR} = \frac{TP}{TP + FN} adalah laju positif sejati, yaitu proporsi sampel positif yang berhasil tertangkap, dan nilainya sama dengan recall. FPR=FPFP+TN \mathrm{FPR} = \frac{FP}{FP + TN} adalah laju positif palsu, yaitu proporsi sampel negatif yang keliru diprediksi positif.

Metrik yang dihitung dari satu ambang hanya menilai satu titik dari pertukaran ini. Dua model dengan komposisi kesalahan berbeda dapat tampak sama pada ambang 0.5 dan berbeda jauh pada ambang lain. Satu titik saja karena itu tidak cukup untuk menyatakan model mana yang lebih baik secara menyeluruh. Kurva ROC mengatasi keterbatasan itu dengan menilai seluruh ambang sekaligus.

Cara membaca kurva ROC dan AUC#

Kurva ROC adalah himpunan titik (FPR,TPR)(\mathrm{FPR}, \mathrm{TPR}) yang diperoleh dengan menggeser ambang dari tertinggi hingga terendah. Pada ambang tertinggi tidak ada sampel yang diprediksi positif, sehingga kurva bermula dari titik (0,0)(0, 0). Pada ambang terendah semua sampel diprediksi positif, sehingga kurva berakhir di titik (1,1)(1, 1). Garis diagonal dari (0,0)(0, 0) ke (1,1)(1, 1) menjadi acuan model yang menebak acak, karena laju kasus positif yang tertangkap naik seiring dengan laju sampel negatif yang keliru.

AUC adalah luas di bawah kurva tersebut, dengan nilai antara 0 dan 1. Nilai 0.5 berarti kurvanya bertepatan dengan diagonal, yaitu kualitas tebakan acak, sedangkan nilai 1.0 berarti setiap sampel positif diberi skor lebih tinggi daripada seluruh sampel negatif. AUC juga memiliki pembacaan probabilistik yang berguna, yaitu peluang sebuah sampel positif acak diberi skor lebih tinggi daripada sebuah sampel negatif acak. Kekuatan utamanya adalah mencakup seluruh ambang, sehingga dua model dapat dibandingkan tanpa perlu menyetujui satu ambang tertentu terlebih dahulu.

Untuk membandingkan dua model, kedua kurvanya digambar pada sumbu yang sama. Kurva yang selalu berada di atas kurva pembandingnya menandakan model yang lebih baik pada setiap ambang, sedangkan kurva yang saling bersilangan menandakan kedua model menang pada daerah ambang yang berbeda. Pada kasus yang bersilangan, AUC memberikan ringkasan menyeluruh. Namun, bentuk kurva tetap perlu dilihat karena ringkasan tunggal menyembunyikan daerah ambang yang penting bagi masalah yang dihadapi. Karena itu, laporan perbandingan model yang baik memuat kurva lengkap, dan AUC dipakai sebagai penyaring awal, bukan pengganti pembacaan kurva.

Menghitung AUC dan menggambar kurva#

Skrip berikut menghitung skor probabilitas kelas ganas pada data uji dan memperoleh koordinat kurva ROC melalui roc_curve. Sebagian baris koordinat dicetak untuk memperlihatkan mekanisme ambang, lalu kurvanya digambar ke kurva-roc.png dengan matplotlib. Modelnya kembali berupa pipeline StandardScaler dan LogisticRegression(max_iter=1000), dengan pemisahan data random_state=42 yang sama. Argumen pos_label=0 diberikan karena kelas positif yang dituju adalah kelas 0, yaitu ganas, dan pilihan ini konsisten dengan pembahasan metrik sepanjang modul ini.

python gambar-kurva-roc.py
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import auc, roc_curve
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

X, y = load_breast_cancer(return_X_y=True)
X_latih, X_uji, y_latih, y_uji = train_test_split(
    X, y, test_size=0.2, random_state=42
)

model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
model.fit(X_latih, y_latih)

# skor adalah probabilitas kelas ganas (0), kelas positif pada pembahasan ini
skor = model.predict_proba(X_uji)[:, 0]
fpr, tpr, ambang = roc_curve(y_uji, skor, pos_label=0)
nilai_auc = auc(fpr, tpr)
print(f"AUC = {nilai_auc:.4f}")

# sebagian baris roc_curve untuk menunjukkan mekanisme ambang
for target in (0.8, 0.5, 0.1):
    i = int(np.argmin(np.abs(ambang - target)))
    print(f"ambang {ambang[i]:.4f}: TPR={tpr[i]:.4f}, FPR={fpr[i]:.4f}")

fig, ax = plt.subplots(figsize=(5, 4))
ax.plot(fpr, tpr, label=f"Regresi logistik (AUC = {nilai_auc:.4f})")
ax.plot([0, 1], [0, 1], linestyle="--", label="Acuan tebakan acak")
ax.set_xlabel("Laju positif palsu (FPR)")
ax.set_ylabel("Laju positif sejati (TPR)")
ax.set_title("Kurva ROC pada data uji")
ax.legend(loc="lower right")
fig.tight_layout()
fig.savefig("kurva-roc.png", dpi=110)
print("Kurva ROC disimpan ke kurva-roc.png")
text Keluaran
AUC = 0.9974
ambang 0.7767: TPR=0.9535, FPR=0.0000
ambang 0.4848: TPR=0.9767, FPR=0.0141
ambang 0.1131: TPR=0.9767, FPR=0.0986
Kurva ROC disimpan ke kurva-roc.png

Kurva ROC model
Kurva ROC model

Kurva berada dekat pojok kiri atas dan berjauhan dengan diagonal acuan yang mewakili tebakan acak. Baris ambang 0.7767 memperlihatkan TPR 0.9535 dengan FPR 0.0000, artinya hampir semua tumor ganas tertangkap tanpa satu pun pasien jinak yang keliru diprediksi ganas. Ambang 0.4848 berikutnya masih menaikkan TPR menjadi 0.9767 dengan FPR 0.0141. Penurunan ambang ke 0.1131 tidak menaikkan TPR lagi, tetapi FPR naik ke 0.0986, sehingga geseran ambang ke bawah hanya menambah kesalahan pada data uji ini. AUC 0.9974 yang mendekati 1.0 meringkas keseluruhan kurva dan menandakan pemisahan kedua kelas yang sangat baik.

Ringkasan#

  • Label kelas muncul setelah skor probabilitas dipotong ambang, dan ambang 0.5 hanyalah pilihan bawaan.
  • ROC memetakan TPR terhadap FPR untuk semua ambang, sedangkan AUC meringkas kurva menjadi luas di bawahnya.
  • AUC 0.5 berarti tebakan acak dan AUC 1.0 berarti pemisahan sempurna antar kelas.
  • Perbandingan model melalui AUC tidak terikat pada satu pilihan ambang.

Referensi#