Model klasifikasi memberi label kelas pada setiap sampel, dan satu prediksi yang salah belum tentu semurah prediksi lain yang salah. Topik ini membahas empat metrik evaluasi klasifikasi, yaitu akurasi, presisi, recall, dan F1, beserta konteks yang menentukan metrik mana yang wajib dilaporkan. Seluruh metrik dipraktikkan dengan scikit-learn pada dataset breast cancer untuk kasus mendeteksi tumor ganas, termasuk perbandingan dengan baseline yang tidak belajar apa pun. Setelah topik ini, pilihan metrik dapat dinyatakan disertai alasan biaya kesalahannya.
Empat metrik dan rumusnya#
Rumus pada bagian ini menggunakan empat besaran yang dihitung pada data uji. (true positive) adalah banyaknya sampel positif yang diprediksi positif, sedangkan (false positive) adalah banyaknya sampel negatif yang diprediksi positif. (false negative) adalah banyaknya sampel positif yang diprediksi negatif, sedangkan (true negative) adalah banyaknya sampel negatif yang diprediksi negatif. Kelas yang disebut positif merupakan pilihan analis. Pada kasus deteksi tumor, kelas positif yang dipilih adalah tumor ganas karena kelas inilah yang paling ingin dideteksi.
Akurasi mengukur proporsi prediksi yang benar dari seluruh prediksi:
Metrik ini mudah dibaca tetapi menipu apabila kelas tidak seimbang. Pada data dengan kasus positif satu persen, model yang menebak negatif untuk semua sampel memperoleh akurasi 99 persen tanpa mendeteksi satu kasus pun. Akurasi tetap informatif apabila kedua kelas seimbang dan kedua jenis kesalahan sama mahalnya, karena penipuan pada metrik ini muncul dari ketimpangan kelas.
Presisi menilai keandalan prediksi positif:
Pertanyaannya adalah “dari semua yang diprediksi positif, berapa yang benar-benar positif”. Presisi menjadi metrik utama ketika kesalahan false positive mahal, misalnya pasien sehat yang keliru dirujuk ke pemeriksaan lanjutan yang tidak perlu. Sebaliknya, presisi tinggi tidak menjamin sebagian besar kasus positif tertangkap, karena metrik ini sama sekali tidak melihat sel .
Recall menilai cakupan terhadap seluruh kasus positif:
Pertanyaannya adalah “dari semua yang benar-benar positif, berapa yang tertangkap”. Recall menjadi metrik utama ketika kesalahan false negative mahal, misalnya penderita yang tidak terdeteksi sehingga tidak pernah dirujuk ke pengobatan. Sebaliknya, recall tinggi tidak menjamin prediksi positifnya andal, karena metrik ini sama sekali tidak melihat sel .
F1 menggabungkan presisi dan recall melalui rata-rata harmonik:
Rata-rata harmonik menurunkan hasil akhir ketika salah satu komponennya jauh lebih kecil. Kombinasi presisi 1.00 dengan recall 0.01 menghasilkan F1 sekitar 0.02, jauh di bawah rata-rata aritmetika keduanya. Karena itu, F1 hanya tinggi bila presisi dan recall tinggi bersamaan. Sifat ini penting karena presisi dan recall saling menekan, sehingga menaikkan salah satunya biasanya menurunkan pasangannya.
Konteks menentukan metrik yang penting#
Contoh pertama adalah saringan penyakit pada pemeriksaan awal. Biaya terbesar ada pada kasus yang lolos tanpa terdeteksi, sehingga recall tinggi yang dituntut. Sebagian hasil yang keliru diprediksi positif masih dapat ditoleransi karena pemeriksaan lanjutan akan menyaringnya.
Contoh kedua adalah sistem yang menahan transaksi karena dicurigai penipuan. Transaksi sah yang keliru ditahan langsung merugikan penggunanya dan menurunkan kepercayaan, sehingga presisi tinggi yang dituntut. Sebagian penipuan yang lolos masih ditangani lapisan sistem lain. F1 dipilih apabila kedua jenis kesalahan sama pentingnya atau belum ada yang dominan.
Pada data uji breast cancer, model memperoleh presisi 0.9762 dan recall 0.9535 untuk kelas ganas. Recall 0.9535 berarti dua dari 43 tumor ganas pada data uji lolos tanpa terdeteksi, informasi yang tidak diberikan oleh akurasi 0.9737 sekalipun. Bila skenario yang dijalankan adalah saringan penyakit, recall itulah yang dilaporkan lebih dahulu. Upaya menaikkannya biasanya menurunkan presisi karena ambang keputusan digeser menjadi lebih longgar.
Menghitung metrik dengan scikit-learn#
Skrip berikut memuat dataset breast cancer, memisahkan dua puluh persen data sebagai data uji dengan random_state=42, lalu melatih pipeline berisi StandardScaler dan LogisticRegression(max_iter=1000). Penskalaan diperlukan karena fitur dataset ini memiliki rentang nilai yang sangat berbeda. Pipeline memastikan parameter penskalaan dipelajari hanya dari data latih, sehingga tidak ada informasi data uji yang ikut masuk ke pelatihan. Metrik dihitung dengan pos_label=0 agar seluruh angka mengacu pada kelas ganas. Baseline berupa DummyClassifier dengan strategi most_frequent selalu menebak kelas terbanyak tanpa melihat fitur sama sekali.
from sklearn.datasets import load_breast_cancer
from sklearn.dummy import DummyClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import (
accuracy_score,
f1_score,
precision_score,
recall_score,
)
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
# kelas 0 pada load_breast_cancer adalah ganas (malignant)
KELAS_POSITIF = 0
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)
prediksi = model.predict(X_uji)
baseline = DummyClassifier(strategy="most_frequent")
baseline.fit(X_latih, y_latih)
prediksi_baseline = baseline.predict(X_uji)
def laporkan(nama, y_benar, y_prediksi):
"""Cetak empat metrik klasifikasi untuk kelas positif ganas."""
akurasi = accuracy_score(y_benar, y_prediksi)
presisi = precision_score(
y_benar, y_prediksi, pos_label=KELAS_POSITIF, zero_division=0
)
recall = recall_score(
y_benar, y_prediksi, pos_label=KELAS_POSITIF, zero_division=0
)
f1 = f1_score(y_benar, y_prediksi, pos_label=KELAS_POSITIF, zero_division=0)
print(nama)
print(f" akurasi = {akurasi:.4f}")
print(f" presisi = {presisi:.4f}")
print(f" recall = {recall:.4f}")
print(f" F1 = {f1:.4f}")
laporkan("Pipeline StandardScaler + LogisticRegression", y_uji, prediksi)
laporkan("Baseline DummyClassifier (most_frequent)", y_uji, prediksi_baseline)Pipeline StandardScaler + LogisticRegression
akurasi = 0.9737
presisi = 0.9762
recall = 0.9535
F1 = 0.9647
Baseline DummyClassifier (most_frequent)
akurasi = 0.6228
presisi = 0.0000
recall = 0.0000
F1 = 0.0000Angka baseline menjelaskan bahaya akurasi secara langsung. Baseline memperoleh akurasi 0.6228 hanya dengan menebak jinak untuk semua pasien. Namun, presisi, recall, dan F1 terhadap kelas ganas semuanya 0.0000 karena tidak ada satu tumor ganas pun yang dideteksi. Model sungguhan unggul di keempat metrik sekaligus, dengan presisi 0.9762 dan recall 0.9535. Pola seperti ini muncul pada hampir semua masalah klasifikasi tak seimbang, yaitu akurasi yang tampak layak sementara kemampuan deteksi terhadap kelas minoritas nol.
Ringkasan#
- Akurasi menghitung proporsi prediksi yang benar dan menjadi menipu apabila kelas tidak seimbang.
- Presisi menilai keandalan prediksi positif, recall menilai cakupan terhadap kasus positif, dan F1 menyeimbangkan keduanya melalui rata-rata harmonik.
- Metrik yang dilaporkan mengikuti biaya kesalahan pada konteks masalah, bukan kebiasaan.
- Baseline
most_frequentmemperlihatkan akurasi yang tampak layak dengan kemampuan deteksi nol.
Referensi#
- Metrics and scoring: quantifying the quality of predictions — scikit-learn — Panduan resmi metrik klasifikasi beserta presisi, recall, dan F1.
- sklearn.metrics.accuracy_score — scikit-learn — Dokumentasi fungsi akurasi beserta contohnya.
- sklearn.metrics.precision_score — scikit-learn — Dokumentasi fungsi presisi dan parameter pos_label.
- sklearn.metrics.recall_score — scikit-learn — Dokumentasi fungsi recall dan parameter zero_division.
- sklearn.metrics.f1_score — scikit-learn — Dokumentasi F1 sebagai rata-rata harmonik presisi dan recall.
- sklearn.dummy.DummyClassifier — scikit-learn — Dokumentasi classifier baseline untuk pembanding jujur.