Simulator Threshold: Deteksi Komentar Spam
Sebuah model memberi skor probabilitas spam (0–1) pada 24 komentar YouTube kanal pemrograman. Komentar diprediksi spam (positif) jika skornya ≥ threshold. Geser threshold dan amati confusion matrix serta metriknya.
Confusion Matrix
Baris = label aktual, kolom = prediksi model. Positif = spam.
Metrik pada threshold ini
Metrik terhadap threshold
Klik atau seret pada grafik untuk memindahkan threshold.
Data dan prediksi
| # | Komentar | Skor spam | Aktual | Prediksi | Hasil |
|---|
Tugas 1
- Pada threshold 0,50, catat nilai TP, FP, FN, dan TN dari tabel data, lalu hitung kelima metrik secara manual. Cocokkan dengan hasil simulator.
- Cari threshold yang menghasilkan F1 tertinggi. Berapa nilai F1, presisi, dan recall-nya?
- Turunkan threshold sampai recall = 1. Berapa presisinya? Komentar mana saja yang menjadi FP, dan kata apa yang kemungkinan membuat model keliru?
- Naikkan threshold sampai presisi = 1. Berapa recall-nya? Spam jenis apa yang lolos?
- Jika Anda pengelola kanal ini dan komentar yang ditandai spam akan langsung dihapus, threshold mana yang Anda pilih? Bagaimana jika komentar hanya ditahan untuk ditinjau? Jelaskan alasannya.
Kalkulator Confusion Matrix
Masukkan nilai TP, FP, FN, dan TN dari eksperimen Anda sendiri. Semua metrik dihitung beserta langkahnya.
Input
| Prediksi Positif | Prediksi Negatif | |
|---|---|---|
| Aktual Positif | TP |
FN |
| Aktual Negatif | FP |
TN |
Hasil
Tugas 2
- Klik Tidak seimbang. Akurasinya 95%. Apakah model ini berguna? Metrik mana yang membongkar masalahnya?
- Klik Selalu positif. Mengapa recall bernilai 1 tetapi spesifisitas bernilai 0?
- Klik Terlalu hati-hati. Presisinya sempurna. Jelaskan mengapa F1 tetap rendah.
- Masukkan confusion matrix dari model yang pernah Anda latih (misalnya dari
sklearn.metrics.confusion_matrix) dan tafsirkan hasilnya.
Multi-Kelas: Analisis Sentimen 3 Kelas
Pada multi-kelas, metrik dihitung per kelas (one-vs-rest), lalu dirata-rata dengan cara macro, weighted, atau micro. Ubah angka di matriks untuk melihat efeknya.
Confusion matrix 3×3
Baris = aktual, kolom = prediksi. Diagonal hijau = prediksi benar.
Hasil per kelas
Cara menghitung untuk satu kelas (misalnya Positif)
TP = sel diagonal kelas tersebut. FP = jumlah kolom kelas tersebut dikurangi TP (kelas lain yang diprediksi sebagai Positif). FN = jumlah baris dikurangi TP (Positif yang diprediksi sebagai kelas lain).
Macro = rata-rata biasa antar kelas (semua kelas setara). Weighted = rata-rata dibobot jumlah data (support). Micro = dihitung dari total TP, FP, FN gabungan; pada klasifikasi single-label nilainya sama dengan akurasi.
Tugas 3
- Hitung secara manual presisi, recall, dan F1 untuk kelas Netral. Cocokkan dengan tabel.
- Klik Contoh kelas minoritas buruk. Bandingkan macro F1 dan weighted F1. Mengapa selisihnya besar?
- Jika laporan penelitian Anda hanya mencantumkan akurasi dan weighted F1, informasi penting apa yang tersembunyi?
Latihan
Bagian A: hitung metrik dari confusion matrix acak. Bagian B: pilih metrik yang tepat untuk sebuah skenario.
A. Hitung metrik (3 desimal, toleransi ±0,005)
Skor: 0/5B. Pilih metrik yang tepat
Skor: 0/0Ringkasan Rumus
Rujukan cepat selama praktikum.
| Metrik | Rumus | Pertanyaan yang dijawab | Penting saat |
|---|---|---|---|
| Akurasi | (TP + TN) / (TP + TN + FP + FN) | Seberapa sering model benar? | Kelas seimbang |
| Presisi | TP / (TP + FP) | Seberapa bisa dipercaya prediksi positif? | FP mahal (filter spam, auto-hapus) |
| Recall | TP / (TP + FN) | Berapa banyak positif yang tertangkap? | FN mahal (moderasi, deteksi hoaks) |
| Spesifisitas | TN / (TN + FP) | Seberapa baik mengenali negatif? | Analisis ROC (FPR = 1 − spesifisitas) |
| F1 | 2PR / (P + R) = 2TP / (2TP + FP + FN) | Seimbangkah presisi dan recall? | Kelas tidak seimbang, standar NLP |
Padanan di Python (scikit-learn)
from sklearn.metrics import confusion_matrix, classification_report, f1_score tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel() # biner spesifisitas = tn / (tn + fp) print(classification_report(y_true, y_pred)) # presisi, recall, F1 per kelas f1_score(y_true, y_pred, average="macro") # atau "weighted", "micro"