Confusion Matrix untuk Evaluasi Model pada Supervised Learning
Contoh: Untuk Pemodelan Klasifikasi Biner
Ketika berhadapan dengan permasalahan machine learning timbul banyak pertanyaan “bagaimana cara mendapatkan model yang paling baik?”. Oleh karena itu, mengukur kinerja suatu model yang telah kita buat merupakan langkah penting dalam machine learning sehingga dapat menjadi pertimbangan untuk memilih model “terbaik”. Salah satu teknik yang dapat digunakan untuk mengukur kinerja suatu model khusunya kasus klasifikasi (supervised learning) pada machine learning adalah confusion matrix.
Saya berharap tulisan ini dapat membantu anda untuk lebih memahami tentang confusion matrix. Selamat membaca 😀
Apa itu confusion matrix dan mengapa kita memerlukan itu ?
Confusion matrix juga sering disebut error matrix. Pada dasarnya confusion matrix memberikan informasi perbandingan hasil klasifikasi yang dilakukan oleh sistem (model) dengan hasil klasifikasi sebenarnya. Confusion matrix berbentuk tabel matriks yang menggambarkan kinerja model klasifikasi pada serangkaian data uji yang nilai sebenarnya diketahui. Gambar dibawah ini merupakan confusion matrix dengan 4 kombinasi nilai prediksi dan nilai aktual yang berbeda. Perhatikan gambar dibawah ini:
Terdapat 4 istilah sebagai representasi hasil proses klasifikasi pada confusion matrix. Keempat istilah tersebut adalah True Positive (TP), True Negative (TN), False Positive (FP) dan False Negative (FN). Agar lebih mudah memahaminya, saya menggunakan contoh kasus sederhana untuk memprediksi seorang pasien menderita kanker atau tidak.
- True Positive (TP)
Merupakan data positif yang diprediksi benar. Contohnya, pasien menderita kanker (class 1) dan dari model yang dibuat memprediksi pasien tersebut menderita kanker (class 1). - True Negative (TN)
Merupakan data negatif yang diprediksi benar. Contohnya, pasien tidak menderita kanker (class 2) dan dari model yang dibuat memprediksi pasien tersebut tidak menderita kanker (class 2). - False Postive (FP) — Type I Error
Merupakan data negatif namun diprediksi sebagai data positif. Contohnya, pasien tidak menderita kanker (class 2) tetapi dari model yang telah memprediksi pasien tersebut menderita kanker (class 1). - False Negative (FN) — Type II Error
Merupakan data positif namun diprediksi sebagai data negatif. Contohnya, pasien menderita kanker (class 1) tetapi dari model yang dibuat memprediksi pasien tersebut tidak menderita kanker (class 2).
Pada beberapa kasus “Type II Error” lebih berbahaya, kita dapat menghubungkan pernyataan itu dengan contoh prediksi kanker diatas. Jika pasien tidak menderita kanker tetapi diprediksi menderita kanker (FP), maka pada diagnosa selanjutnya pasien tersebut dapat mengetahui keadaan sebenarnya bahwa pasien tersebut benar tidak menderita kanker. Tetapi jika ada pasien yang sebenarnya menderita kanker tetapi diprediksi tidak menderita kanker (FN), maka pasien tersebut akan mengetahui keadaan sebenarnya dengan sangat terlambat dan pasien tersebut tidak segera mengambil tindakan pencegahan medis untuk kanker itu. Sehingga dapat menyebabkan kondisi pasien yang semakin memburuk setiap harinya bahkan kematian. Jadi dapat dikatakan bahwa “Type II Error” lebih berbahaya.
Ada cara yang lebih mudah untuk mengingatnya, yaitu:
- Jika diawali dengan True maka prediksinya adalah benar, entah diprediksi terjadi atau tidak terjadi.
- Jika diawali dengan False maka prediksinya adalah salah.
- Positif dan negatif merupakan hasil prediksi dari model.
Tentunya kita ingin model yang telah kita buat memberikan 0 false positive dan 0 false negative. Tetapi pada prakteknya hal tersebut tidak akan pernah terjadi karena model mana pun tidak akan memberikan keakuratan 100%. Jika model anda memberikan nilai 100% maka ada masalah pada model yang anda buat atau data yang anda gunakan.
Mengapa kita memerlukan confusion matrix ?
Seperti yang telah dijelaskan diatas, confusion matrix akan memberi tahu seberapa baik model yang kita buat. Secara khusus confusion matrix juga memberikan informasi tentang TP, FP, TN, dan FN. Hal ini sangat berguna karena hasil dari klasifikasi umumnya tidak dapat diekspresikan dengan baik dalam satu angka saja.
Dengan contoh yang sama untuk memprediksi kanker, anda akan mencoba memprediksi siapa yang akan mati karena kanker tahun ini berdasarkan perilaku seperti merokok dari seluruh populasi. Pada tahun tertentu, hanya 1% populasi yang mati karena kanker. Algoritma klasifikasi naif hanya akan memprediksi tidak ada yang mati karena kanker. Dengan confusion matrix memungkinkan kita untuk melihat dengan cepat, dari siapa yang akan diprediksi mati, berapa banyak yang mati dan yang tidak.
Berikut adalah beberapa manfaat dari confusion matrix:
- Menunjukkan bagaimana model ketika membuat prediksi.
- Tidak hanya memberi informasi tentang kesalahan yang dibuat oleh model tetapi juga jenis kesalahan yang dibuat.
- Setiap kolom dari confusion matrix merepresentasikan instance dari kelas prediksi.
- Setiap baris dari confusion matrix mewakili instance dari kelas aktual.
Contoh confusion matrix pada klasifikasi biner
Confusion matrix dapat digunakan untuk mengukur performa dalam permasalahan klasifikasi biner maupun permasalahan klasifikasi multiclass. Klasifikasi biner hanya menghasilkan dua ouput kelas (label), seperti “Ya” atau “Tidak”, “0” atau “1” untuk setiap data input yang diberikan. Kelas utama biasanya dinotasikan sebagai data positif dan yang lainnya sebagai data negatif.
Sebagai contoh, sebuah model akan dilatih untuk memprediksi apakah seorang pasien sedang menderita kanker atau tidak. Dengan asumsi terdapat 20 pasien dengan 9 pasien positif kanker dan 11 pasien negatif kanker, maka contoh confusion matrix yang dihasilkan model seperti dibawah ini :
Jika dilihat dari confusion matrix diatas dari 9 pasien positif kanker, model memprediksi ada 3 pasien yang diprediksi negatif kanker (FN), dan dari 11 pasien negatif kanker, model memprediksi ada 2 pasien yang diprediksi positif kanker (FP). Prediksi yang benar terletak pada tabel diagonal (garis bawah merah), sehingga secara visual sangat mudah untuk melihat kesalahan prediksi karena kesalahan prediksi berada di luar tabel diagonal confusion matrix.
Bagaimana mengukur performance metrics dari confusion matrix ?
Kita dapat menggunakan confusion matrix untuk menghitung berbagai performance metrics untuk mengukur kinerja model yang telah dibuat. Pada bagian ini mari kita pahami beberapa performance metrics populer yang umum dan sering digunakan: accuracy, precission, dan recall.
Accuracy
Accuracy menggambarkan seberapa akurat model dapat mengklasifikasikan dengan benar. Maka, accuracy merupakan rasio prediksi benar (positif dan negatif) dengan keseluruhan data. Dengan kata lain, accuracy merupakan tingkat kedekatan nilai prediksi dengan nilai aktual (sebenarnya). Nilai accuracy dapat diperoleh dengan persamaan (1).
Dari contoh confusion matrix klasifikasi biner diatas maka dengan menghitung nilai accuracy dapat menjawab pertanyaan “Berapa persen pasien yang benar diprediksi menderita kanker maupun yang tidak menderita kanker dari kesuluruhan pasien?”
Precision (Positive Predictive Value)
Precision menggambarkan tingkat keakuratan antara data yang diminta dengan hasil prediksi yang diberikan oleh model. Maka, precision merupakan rasio prediksi benar positif dibandingkan dengan keseluruhan hasil yang diprediksi positf. Dari semua kelas positif yang telah di prediksi dengan benar, berapa banyak data yang benar-benar positif. Nilai precision dapat diperoleh dengan persamaan (2).
Dari contoh confusion matrix klasifikasi biner diatas maka dengan menghitung nilai precision dapat menjawab pertanyaan “Berapa persen pasien yang benar menderita kanker dari keseluruhan pasien yang diprediksi menderita kanker?”
Recall atau Sensitivity (True Positive Rate)
Recall menggambarkan keberhasilan model dalam menemukan kembali sebuah informasi. Maka, recall merupakan rasio prediksi benar positif dibandingkan dengan keseluruhan data yang benar positif. Nilai recall dapat diperoleh dengan persamaan (3).
Dari contoh confusion matrix klasifikasi biner diatas maka dengan menghitung nilai recall dapat menjawab pertanyaan “Berapa persen pasien yang diprediksi kanker dibandingkan keseluruhan pasien yang sebenarnya menderita kanker”.
Confusion Matrix pada Python
Pada bagian ini saya akan memberikan contoh bagaimana cara membuat model sederhana untuk prediksi dan menampilkan confusion matrixnya untuk menghitung beberapa performance metrics pada python. Kita membutuhkan library scikit-learn untuk menghasilkan confusion matrix, jadi pastikan anda telah menginstallnya terlebih dahulu. Fungsi confusion_matrix()
akan menghitung confusion matrix pada model dan mengembalikan hasilnya dalam bentuk array.
Dataset yang Digunakan
Saya menggunakan dataset diagnosa kanker payudara dari kaggle untuk melakukan prediksi penderita kanker. Disarankan anda untuk mengunduh dataset dan mengikuti langkah yang ada pada tulisan ini.
import pandas as pd
import numpy as np# membaca dataset
data = pd.read_csv("data/breast-cancer-wisconsin-data.csv")# mengahapus kolom yang tidak digunakan
data.drop(["Unnamed: 32","id"], axis=1, inplace=True)# merubah label M(ganas) = 1 dan B(jinak) = 0
data.diagnosis = [1 if each == "M" else 0 for each in data.diagnosis]data.head(3) # menampilkan sample data
Membagi Dataset dan Membuat Model Prediksi
Dataset dibagi ke dalam data latih dan data uji, data latih digunakan untuk melatih model yang telah dibuat sedangkan evaluasinya akan dilakukan pada data uji.
from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=42)
Selanjutnya, kita akan membuat model sederhana menggunakan Decision Tree untuk melakukan prediksi.
from sklearn.tree import DecisionTreeClassifiermodel = DecisionTreeClassifier()
model.fit(x_train, y_train)
y_pred = model.predict(x_test) # prediksi
Evaluasi Model menggunakan Confusion Matrix
Kita akan menggunakan confusion matrix untuk mengevaluasi model yang sudah kita buat sebelumnya.
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred) # ouput
# array([[95, 3],
# [ 2, 43]])
Kita dapat memvisualisasikan confusion matrix tersebut untuk memudahkan dalam mengevaluasi.
import seaborn as sns
import matplotlib.pyplot as pltf, ax = plt.subplots(figsize=(8,5))
sns.heatmap(confusion_matrix(y_test, y_pred), annot=True, fmt=".0f", ax=ax)
plt.xlabel("y_head")
plt.ylabel("y_true")
plt.show()
Seberapa baik model kita ?
Seperti yang sudah saya jelaskan diatas, dengan confusion matrix kita dapat mengetahui keakuratan dari model yang kita buat dengan performance metrics seperti: accuracy, recall, dan precision.
from sklearn.metrics import cclassification_report
print (classification_report(y_test, y_pred))# ouput
# precision recall f1-score support 0 0.98 0.97 0.97 98
1 0.93 0.96 0.95 45 accuracy 0.97 143
macro avg 0.96 0.96 0.96 143
weighted avg 0.97 0.97 0.97 143
Penutup dan saran belajar lanjutan
Tulisan ini hanya menjabarkan teori secara umum serta praktek ringkas untuk confusion matrix. Oleh karena itu, ada beberapa saran belajar lanjutan agar anda lebih memahami tentang confusion matrix, antara lain: bagaimana menghitung confusion matrix pada permasalahan klasifikasi multiclass dan tentunya yang lebih penting adalah bagaimana cara memilih performance metric yang tepat untuk kasus anda sehingga anda dapat menjawab pertanyaan “bagaimana cara mendapatkan model yang paling baik?”.
Pada tulisan berikutnya saya akan membahas lebih dalam tentang confusion matrix dengan mengukur performance metrics lainnya. Selamat ‘pusing’ dengan confusion matrix 😀
Referensi
- Kohavi, Ron and Foster Provost, eds. 1998. “Glossary of Terms.” Special Issue on Applications of Machine Learning and the Knowledge Discovery Process, Machine Learning, vol. 30, pp. 271–274, Kluwer Academic Publishers.
- Narkhede, Sarang. 2018. “Understanding Confusion Matrix.” Towards Data Science, via Medium.
- Brownlee, Jason. 2016. “What is a Confusion Matrix in Machine Learning.” Machine Learning Mastery.
- Scikit-Learn Confusion Matrix (https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html)
- Scikit-Learn Classification Report (https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html)