Performansi Multiclass Classification
Pada beberapa tulisan sebelumnya, kita telah mengenal confusion matrix dan performansi pada binary class. Dan untuk tulisan kali ini, kita bahas tentang performansi sistem pada klasifikasi multi kelas (multiclass classification).
Contoh Kasus
Kasus kali ini, terdapat sistem klasifikasi rimpang dalam 3 kelas: jahe, kunyit, atau lengkuas. Singkat cerita, terhadap hasil sebagai berikut dari 21x percobaan:
Confusion matrix dari data di atas digambarkan sebagai berikut:
Dan didapatkan nilai parameter TP, FP, FN, dan TN sebagai berikut:
Untuk cara mendapatkan nilai di atas, bisa dilihat tulisan sebelumnya tentang multiclass classification.
Performansi Sistem: Akurasi
Performansi sistem biasanya dilihat dari keseluruhan total prediksi yang dilakukan. Nilai akurasi cukup gampang untuk melihat performa sistem. Nilai ini dihitung sebagai perbandingan jumlah total TP terhadap semua data percobaan yang dilakukan.
Total semua class yang dikenali benar (total TP — 16) dibagi jumlah data keseluruhan (21). Jadi nilai performansi berupa akurasi sistem ≈ 0.762 atau 76.2%. Dengan kata lain, dari 100 data percobaan, terdapat 76 data yang menghasilkan nilai benar.
Mode Rataan untuk Performansi
Akurasi cukup gampang untuk dihitung. Akan tetapi, untuk mendapatkan nilai precision/recall/f1-score untuk performansi sistem diperlukan “mode” rataan yang digunakan setelah mendapatkan nilai precision/recall/f1-score per class.
Terdapat beberapa mode yang dikenal, yaitu
- macro: menghitung rataan dari nilai performansi (recall/precision/f1-score) yang sudah dihitung sebelumnya (per class).
- micro: menjumlahkan semua nilai TP, FP, FN, dan TN secara keseluruhan; setelahnya baru menghitung nilai performansi (recall/precision/f1-score) sesuai rumus.
- weighted: menghitung rataan berdasarkan nilai performansi per class dengan memperhitungkan support. Dengan kata lain, sebelum merata-ratakan, dilakukan perkalian dengan nilai support.
Nilai support merupakan jumlah kejadian/occurrence (data aktual) dari class terhadap data keseluruhan.
Contoh, jumlah data aktual class jahe bernilai 7 dari 21 data yang diberikan. Artinya, nilai supportnya adalah 7/21 atau 1/3 atau 0.33. Dikarenakan nilai data aktual kunyit dan lengkuas juga 7 dari 21, maka setiap support dari masing-masing kelas bernilai sama, yaitu 0.33.
Sebelum menghitung nilai average dalam setiap mode, baiknya kita hitung dulu nilai performansi precision/recall/f1-score per class.
Performansi per Class
Berdasarkan nilai TP, FP, FN, dan TN dari sebelumnya.. kita dapat menghitung precision, recall, dan f1-score untuk tiap kelas/class.
Untuk akurasi, sudah dihitung secara keseluruhan sistem, jadi tidak diperlukan lagi menghitung nilai tersebut untuk per class.
Nilai precision, recall, dan f1-score untuk tiap class yang telah dihitung dapat dicari rataannya menggunakan 3 mode sebelumnya yang sudah dijabarkan di atas.
Mode Rataan Macro
Mode macro, merata-ratakan nilai precision/recall/f1-score yang sudah didapat sebelumnya.
Didapat nilai performansi sistem sebagai berikut:
- precision: 0.759 (75.9%)
- recall: 0.762 (76.2%)
- f1-score: 0.753 (75.3%)
Mode Rataan Micro
Untuk perhitungan micro, jumlahkan masing-masing TP, FP, FN, dan TN.
Berdasarkan total yang didapat, hitung nilai precision/recall/f1-score sesuai rumus.
- precision: 16/(16+5) = 0.7619 ≈ 0.762
- recall: 16/(16+5) = 0.7619 ≈ 0.762
- f1-score: 2 × 0.7619 × 0.7619/(0.7619+0.7619) = 0.7619 ≈ 0.762
Nilai yang didapat untuk ketiga parameter performansi sebesar 0.762 atau 76.2%. Perhatikan setiap perhitungan memiliki nilai yang sama (baik proses ataupun hasil) sama dengan akurasi yang sudah dihitung sebelumnya. Berdasarkan pengamatan ini, dapat dilihat bahwa nilai precision, dan recall dengan perhitungan micro-average dan juga akurasi memiliki nilai yang sama.
Dari sini, dapat disimpulkan bahwa.. nilai accuracy, precision, recall, dan f1-score dengan rataan micro bernilai sama.
accuracy = micro-precision = micro-recall = micro-f1
Mode Rataan Weighted
Perhitungan mode weighted dilihat dari perkalian performansi per class dikalikan dengan nilai support-nya. Nilai support masing-masing class pada kasus ini adalah sama, yaitu 1/3.
Lakukan perkalian nilai performansi dengan masing-masing support, dan jumlahkan.
Laporan Nilai/Score Report
Berdasarkan nilai-nilai di atas, kita dapat membuat laporannya sebagai berikut:
Memilih Mode Rataan
Mode rataan yang berbeda, menghasilkan perbedaan nilai. Untuk contoh kasus di atas, perbedaan tidak terlalu signifikan.. tapi untuk kasus lain nilainya bisa cukup berbeda. Sehingga, kita bisa memilih mode yang tepat sesuai kasus.
Jika data bersifat balanced, dan kita ingin melihat status dari metric evaluation yang “seragam”, gunakan mode micro-average.
Untuk data bersifat imbalanced, dan semua class berstatus important/penting, gunakan mode macro. Hal ini dikarenakan mode macro memperlakukan semua class dengan rata.
Sedangkan untuk data imbalanced dengan kontribusi data yang beragam, dapat menggunakan mode weighted.
Kode (Python)
Berdasarkan kasus sebelumnya, kita dapat import hal yang diperlukan:
from sklearn.metrics import confusion_matrix, classification_report, f1_score, precision_score, recall_score, accuracy_scorefrom seaborn import heatmap
Berikutnya, tentukan kelas yang digunakan dan tuliskan data aktual serta prediksinya.
# Constants
# J --> 0; K--> 1; L --> 2
J="Jahe"
K="Kunyit"
L="Lengkuas"actual = [J,J,J,J,J,J,J,K,K,K,K,K,K,K,L,L,L,L,L,L,L]
predicted = [J,J,J,L,L,K,J,K,K,K,K,J,J,K,L,L,L,L,L,L,L]
Print confusion matrix & visualnya menggunakan heatmap.
print(confusion_matrix(actual,predicted))
heatmap(confusion_matrix(actual,predicted), annot = True)
Bisa juga tampilkan summary dalam bentuk classification report dengan kode
print(classification_report(actual,predicted,digits=3))
Hasil classification report dapat dibandingkan dengan perhitungan sebelumnya.
Selain dilihat dari classification report, dapat juga menampilkan nilai performansi dalam berbagai mode dengan kode:
# Akurasi
accuracy = accuracy_score(actual, predicted)
print("Akurasi = $.3f " %(accuracy))# Micro
recall_mi = recall_score(actual, predicted, average='micro')
precision_mi = precision_score(actual, predicted, average='micro')
f1_mi = f1_score(actual, predicted, average='micro')
print("Micro-average Mode")
print("Recall = %.3f" %(recall_mi))
print("Precision = %.3f" %(precision_mi))
print("F1 score =%.3f" %(f1_mi))# Macro
recall_ma = recall_score(actual, predicted, average='macro')
precision_ma = precision_score(actual, predicted, average='macro')
f1_ma = f1_score(actual, predicted, average='macro')
print("Macro-average Mode")
print("Recall = %.3f" %(recall_ma))
print("Precision = %.3f" %(precision_ma))
print("F1 score = %.3f" %(f1_ma))# Weighted
recall_w = recall_score(actual, predicted, average='weighted')
precision_w = precision_score(actual, predicted, average='weighted')
f1_w = f1_score(actual, predicted, average='weighted')
print("weighted-average Mode")
print("Recall = %.3f" %(recall_w))
print("Precision = %.3f" %(precision_w))
print("F1 score = %.3f" %(f1_w))
Kode lengkap dituliskan sebagai berikut: