Confusion matrix, yaitu tabel yang membandingkan label aktual dengan label prediksi, menampilkan seluruh hasil prediksi model klasifikasi dalam satu pandangan sehingga jenis-jenis kesalahan terlihat satu per satu. Topik ini membahas empat sel penyusunnya beserta konsekuensi nyatanya, posisi baris dan kolom pada fungsi confusion_matrix, serta pembacaan matriks mentah dan matriks ternormalisasi. Contoh diambil dari dataset breast_cancer dengan model LogisticRegression. Setelah topik ini dipahami, setiap jenis kesalahan model dapat diberi nama dan ditimbang harganya.
Empat sel dan konsekuensinya#
Keempat sel confusion matrix terbentuk dari perpotongan dua pertanyaan, yaitu apa label aktual sampelnya dan apa yang diprediksi model. Terhadap satu kelas yang ditetapkan sebagai kelas positif, sel-selnya bernama TP (true positive) untuk sampel positif yang diprediksi positif, FP (false positive) untuk sampel negatif yang diprediksi positif, FN (false negative) untuk sampel positif yang diprediksi negatif, dan TN (true negative) untuk sampel negatif yang diprediksi negatif. Keempat angka itu menjadi bahan baku seluruh metrik klasifikasi pada modul ini, mulai dari accuracy hingga precision dan recall.
Dua jenis kesalahan jarang berharga sama, dan perbedaannya bergantung pada domain. Pada pemeriksaan medis, FN berarti penderita penyakit tidak terdeteksi sehingga penanganan terlambat, sedangkan FP hanya memicu pemeriksaan lanjutan yang merepotkan. Pada filter pesan, FP berarti pesan yang sah terbuang karena disangka sampah, sedangkan FN hanya membuat beberapa pesan sampah lolos ke kotak masuk. Karena itu, pembacaan confusion matrix selalu dimulai dengan menetapkan kelas positif dan menimbang jenis kesalahan mana yang lebih mahal pada kasus yang dipegang.
Membaca fungsi confusion_matrix#
Fungsi confusion_matrix(y_true, y_pred) menerima label aktual sebagai argumen pertama dan label prediksi sebagai argumen kedua, lalu mengembalikan matriks dengan baris untuk label aktual dan kolom untuk label prediksi. Urutan kelasnya mengikuti urutan label yang terurut naik, sehingga pada data berlabel 0 dan 1, baris dan kolom pertama adalah kelas 0. Dataset breast_cancer memuat 569 sampel tumor dengan label 0 untuk tumor ganas dan label 1 untuk tumor jinak. Pada pemeriksaan medis, kelas positif ditetapkan sebagai tumor ganas (label 0) karena positif berarti penyakit terdeteksi, sehingga TP berada di sel baris 0 kolom 0.
Fungsi ini juga menerima argumen labels untuk memaksa urutan kelas, berguna ketika ada kelas yang tidak muncul pada data uji atau ketika urutan tampilan perlu disamakan antarlaporan. Di luar kasus dua kelas, matriks yang sama berlaku untuk data multikelas dengan bentuk k kali k, yaitu baris dan kolom untuk tiap kelas. Pembacaan TP, FP, FN, dan TN tetap dapat dilakukan dengan memandang satu kelas sebagai positif, sedangkan seluruh kelas lainnya digabung sebagai negatif.
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
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_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42, stratify=y
)
model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
model.fit(X_train, y_train)
pred = model.predict(X_test)
cm = confusion_matrix(y_test, pred)
print("Matriks mentah:")
print(cm)
print()
cm_norm = confusion_matrix(y_test, pred, normalize="true")
print("Matriks ternormalisasi (per baris aktual):")
print(cm_norm.round(2))Matriks mentah:
[[52 1]
[ 1 89]]
Matriks ternormalisasi (per baris aktual):
[[0.98 0.02]
[0.01 0.99]]Dengan kelas positif tumor ganas, matriks mentah terbaca sebagai TP 52, FN 1, FP 1, dan TN 89. Data uji memuat 53 tumor ganas dan 90 tumor jinak, sehingga satu tumor ganas lolos sebagai jinak (FN) dan satu tumor jinak salah disangka ganas (FP). Kedua kesalahan sama kecil pada matriks mentah, tetapi harganya berbeda sebagaimana ditimbang pada bagian di atas, sehingga satu FN pada domain medis tetap perlu ditanggapi dengan serius meskipun jumlahnya hanya satu. Diagram berikut merangkum keempat sel tersebut beserta jumlah sampelnya.
Matriks ternormalisasi per baris#
Matriks mentah menyulitkan perbandingan ketika jumlah tiap kelas berjauhan, karena baris dengan sampel banyak otomatis berisi angka besar. Argumen normalize="true" membagi tiap baris dengan jumlah sampel barisnya, sehingga isi sel berubah menjadi laju benar dan salah untuk tiap kelas aktual. Angka diagonalnya adalah recall tiap kelas, yaitu proporsi kelas tersebut yang tertangkap model.
Pada matriks ternormalisasi di atas, baris tumor ganas menunjukkan 0.98, artinya 98 persen tumor ganas tertangkap, dan baris tumor jinak menunjukkan 0.99. Angka per baris inilah yang layak dilaporkan pada data yang kelompoknya tidak seimbang, karena setiap kelas dinilai pada skalanya sendiri. Normalisasi juga membuat perubahan model lebih mudah terbaca, misalnya menurunkan FN dari 2 persen menjadi 1 persen pada baris ganas merupakan perbaikan yang berarti meskipun hanya berpindah satu sampel.
Kesalahan umum#
Tiga kesalahan berikut paling sering muncul saat membaca confusion matrix.
- Menukar posisi baris dan kolom, sehingga TP dan TN tertukar dengan FP dan FN. Gejalanya, angka kesalahan yang dilaporkan tidak cocok dengan keluaran
classification_report. Perbaikannya, ingat baris pertama adalah argumen pertama, yaitu label aktual, dan kolomnya adalah prediksi. - Membaca matriks tanpa menetapkan kelas positif, sehingga istilah TP, FP, FN, dan TN kehilangan maknanya. Perbaikannya, nyatakan kelas positif secara eksplisit sebelum melaporkan matriks.
- Membaca jumlah mentah untuk perbandingan antarkelas saat datanya tidak seimbang. Perbaikannya, gunakan
normalize="true"agar tiap kelas dinilai pada skalanya sendiri.
Ringkasan#
- Confusion matrix menyusun hasil prediksi ke dalam empat sel terhadap kelas positif yang ditetapkan, yaitu TP, FP, FN, dan TN.
confusion_matrix(y_true, y_pred)menempatkan label aktual pada baris dan label prediksi pada kolom, dengan kelas terurut naik.- FN dan FP berharga berbeda pada tiap domain, sehingga kelas positif dan jenis kesalahan yang lebih mahal wajib dinyatakan.
- Argumen
normalize="true"mengubah matriks menjadi laju per kelas aktual dan menjadikan diagonalnya recall tiap kelas.
Referensi#
- sklearn.metrics.confusion_matrix — scikit-learn — Dokumentasi resmi fungsi confusion_matrix termasuk argumen labels dan normalize.
- Model evaluation: quantifying the quality of predictions — scikit-learn — Bagian resmi confusion matrix dan penjelasan tiap selnya.
- sklearn.datasets.load_breast_cancer — scikit-learn — Dokumentasi dataset breast_cancer beserta makna labelnya.