Membicarakan Precision, Recall, dan F1-Score
Membangun model machine learning saja tidaklah cukup, kita perlu mengetahui seberapa baik model kita bekerja. Tentunya, dengan sebuah ukuran (atau istilah yang seringkali digunakan adalah metric).
Evaluation metrics sangatlah banyak dan beragam, namun untuk tulisan ini, saya hanya akan fokus dengan evaluation metrics yang paling umum digunakan untuk model klasifikasi. Ya, precision, recall dan F1-Score.
Alasan saya hanya membahas ketiganya, karena buat saya, mereka dapat memperlihatkan bagaimana model kita mengambil suatu keputusan di dunia nyata, bisa dari urusan bisnis, sampai melakukan diagnosa medis.
Namun, kita tidak dapat membicarakan precision, recall dan F1-Score. Sebelum memperkenalkan ke kalian, suatu matriks yang seringkali membingungkan banyak orang, yaitu Confusion Matrix.
Confusion Matrix
Jangan khawatir dengan matematiknya, itu tidak membingungkan. Tapi yang membingungkan adalah terminologinya. Sebelum lebih jauh, ada baiknya jika saya tekankan, yang akan saya bicarakan ini, untuk masalah binary classification.
Begini bentuk Confusion Matrix:
0 untuk Label Negatif dan 1 untuk Label Positif. Confusion Matrix punya empat istilah:
- True Negative (TN): Model memprediksi data ada di kelas Negatif dan yang sebenarnya data memang ada di kelas Negatif.
- True Postive (TP): Model memprediksi data ada di kelas Positif dan yang sebenarnya data memang ada di kelas Positif.
- False Negative (FN): Model memprediksi data ada di kelas Negatif, namun yang sebenarnya data ada di kelas Positif.
- False Positive (FP): Model memprediksi data ada di kelas Positif, namun yang sebenarnya data ada di kelas Negatif.
Mungkin sekarang kita sama-sama mengerti, kenapa matriks ini dinamai Confusion Matrix. Untuk mempermudahnya, kita dapat membayangkannya begini, ambil contoh medical testing. Anggap yang terkena kanker kita label positif, sedangkan yang tidak terkena kanker kita label negatif:
- True Negative (TN): Model memprediksi seorang pasien tidak terkena kanker dan memang kenyataannya, pasien itu tidak terkena kanker.
- True Positive (TP): Model memprediksi seorang pasien terkena kanker dan memang kenyataannya, pasien itu terkena kanker.
- False Negative (FN): Model memprediksi seorang pasien tidak terkena kanker, padahal pasien terkena kanker.
- False Positive (FP): Model memprediksi seorang pasien terkena kanker, padahal pasien tidak terkena kanker.
Pemilihan mana kondisi label positif atau negatif adalah kebebasan dari yang membuat model. Sebagai contoh, saya akan menggunakan bantuan Python:
# pip install sklearn
from sklearn.metrics import confusion_matrixactual = [1,1,1,0,0,0,1,1,0,1]
predicted = [1,0,0,0,1,1,1,0,1,0]
confusion_matrix(actual, predicted)
Atau bisa juga direpresentasikan dengan heatmap dengan bantuan library seaborn dan matplotlib
import seaborn as sns
import matplotlib.pyplot as pltplt.figure(figsize = (6, 5))
sns.heatmap(confusion_matrix(actual, predicted), annot = True)
Dari Confusion Matrix di atas, seharusnya kita menyadari adanya 2 tipe kesalahan yaitu False Negative (type 2 error) and False Positive (type 1 error). Dan kedua istilah ini, akan menjadi sangat krusial ketika kita membicarakan precision dan recall.
Mari kita ke inti pembicaran, membicarakan precision, recall dan F1-score.
Precision dan Recall
Secara definisi, precision adalah perbandingan antara True Positive (TP) dengan banyaknya data yang diprediksi positif. Atau bisa juga dituliskan secara matemetis:
Sedangkan untuk Recall, secara definisi adalah perbandingan antara True Positive (TP) dengan banyaknya data yang sebenarnya positif. Dan dapat dituliskan secara matematis seperti ini:
Tapi ini poinnya, kalau kita lihat kedua persamaan di atas dan membandingkannya. Kita seharusnya melihat, adanya satu perbedaan di antara keduanya, precision punya variabel False Positive (FP) sedangkan recall punya variabel False Negative (FN).
Dan juga dari persamaannya, kita tahu, semakin kecil False Positive (FP), membuat precision semakin besar. Sedangkan untuk recall, semakin kecil False Negative (FN) membuat recall semakin besar. Yang dimana, sebelumnya telah disinggung bahwa False Positive (FP) dan False Negative (FN) adalah dua tipe error yang telah dijelaskan di atas.
Jadi mana yang harus kita pilih? Precision atau recall? Jawabannya, tergantung. Tergantung masalahnya. Jika misalnya, kita ambil lagi contoh medical testing di atas. Kita harusnya mempertanyakan hal ini:
Mana yang lebih buruk? Saat model kita memprediksi pasien terkena kanker padahal tidak terkena kanker? Atau saat model kita memprediksi pasien tidak terkena kanker padahal terkena kanker?
Ini seharusnya dijawab secara individu, tapi memang, umumnya, jawabannya adalah akan jauh lebih fatal jika model memprediksi pasien yang tidak terkena kanker padahal terkena kanker. Jadi sebaiknya, model mempunyai nilai recall yang tinggi.
Tapi kenapa kita tidak memilih model dengan precision dan recall yang sama-sama punya skor yang tinggi? Di sini menariknya, adanya dilema antara precision dan recall.
Dilema Antara Precision dan Recall
Dilema ini terjadi dikarenakan adanya tradeoff di antara keduanya. Yang artinya, ketika Recall sangat tinggi, Precision akan sangat rendah, begitu juga sebaliknya. Meskipun memang, ada situasi yang ideal, dimana data dapat dipisahkan dengan sempurna, kita bisa mendapatkan skor 1.0 diantara keduanya. Namun, itu jarang malah hampir tidak pernah terjadi di dunia nyata. Itu kenapa ketika melakukan pemilihan model, seharusnya kita tidak menggunakan skor di antara keduanya. Skor yang kita gunakan seharusnya adalah F1-Score.
F1-Score
Secara definisi, F1-Score adalah harmonic mean dari precision dan recall. Yang secara matematik dapat ditulis begini:
Nilai terbaik F1-Score adalah 1.0 dan nilai terburuknya adalah 0. Secara representasi, jika F1-Score punya skor yang baik mengindikasikan bahwa model klasifikasi kita punya precision dan recall yang baik.
Sebagai penutup, kita akan menghitung precision, recall dan f1-score menggunakan data sebelumnya.
from sklearn.metrics import f1_score, precision_score, recall_score #pip install sklearnprint('Recall: {}'.format(recall_score(actual, predicted)))
print('Precision: {}'.format(precision_score(actual, predicted)))
print('F1-Score: {}'.format(f1_score(actual, predicted)))
Saya harap tulisan ini dapat membantu… Terimakasih telah membacanya sampai selesai…