Mengevaluasi model secara mendalam dan jujur: memilih metrik yang selaras dengan tujuan bisnis, menetapkan threshold yang optimal, memeriksa kalibrasi probabilitas, dan menerjemahkan angka teknis menjadi dampak bisnis yang bisa dipertanggungjawabkan

Setelah di episode 6 kita mencatat semua eksperimen, kini pertanyaan yang paling menentukan: model mana yang benar-benar bagus, dan bagaimana menilai "bagus" itu secara jujur? Angka accuracy 95% yang tampak mengesankan bisa menjadi tidak berguna sama sekali — misalnya saat fraud hanya 1% dari data dan model memprediksi "tidak fraud" untuk semua orang.
Evaluasi yang baik bukan tentang menghitung banyak metrik, melainkan tentang memilih metrik yang selaras dengan konsekuensi keputusan bisnis, menetapkan threshold yang tepat, dan memastikan angka probabilitas yang dikeluarkan model bisa dipercaya. Episode ini membangun evaluasi yang mendalam — bukan sekadar mencetak classification report.
Untuk data tidak seimbang, akurasi adalah metrik paling menyesatkan. Metrik yang lebih informatif:
| Metrik | Menjawab Pertanyaan | Cocok Saat |
|---|---|---|
| Precision | "Kalau model bilang fraud, seberapa yakin?" | Biaya false positive tinggi |
| Recall | "Dari semua fraud, berapa yang tertangkap?" | Biaya false negative tinggi |
| F1 | Trade-off precision & recall | Keseimbangan keduanya |
| ROC-AUC | Peringkat positif vs negatif secara global | Membandingkan model |
from sklearn.metrics import precision_recall_fscore_support
precision, recall, f1, _ = precision_recall_fscore_support(y_test, y_pred, average="binary")
print(f"precision={precision:.3f} recall={recall:.3f} f1={f1:.3f}")Untuk prediksi nilai (harga, durasi, jumlah), pilih error yang sesuai:
Pilih berdasarkan apa yang "sakit" bagi bisnis saat error terjadi.
Kebanyakan classifier menghasilkan probabilitas, dan kalian yang memilih threshold. Threshold default 0.5 sering bukan yang terbaik — apalagi untuk data tidak seimbang. Cara yang benar: pilih threshold berdasarkan trade-off biaya.
from sklearn.metrics import precision_recall_curve
probs = model.predict_proba(X_val)[:, 1]
precision, recall, thresholds = precision_recall_curve(y_val, probs)
# cari threshold di mana precision & recall paling seimbang
best = thresholds[(precision[:-1] + recall[:-1]).argmax()]
print(f"threshold optimal: {best:.3f}")Cara yang lebih disiplin adalah cost-based thresholding: hitung biaya rata-rata false positive vs false negative dari sisi bisnis, lalu pilih threshold yang meminimalkan biaya total.
Sebuah model dapat akurat dalam peringkat (AUC tinggi) tapi tidak terkalibrasi: saat model berkata "probabilitas 0.8", hanya 60% kasus yang benar-benar positif. Untuk keputusan yang bergantung pada probabilitas (misal skor risiko), kalibrasi penting.
from sklearn.calibration import CalibratedClassifierCV, calibration_curve
fraction_of_positives, mean_predicted = calibration_curve(
y_val, probs, n_bins=10
)
# kalau kurva jauh dari diagonal, kalibrasi ulang:
calibrated = CalibratedClassifierCV(model, cv=5, method="isotonic")Model yang terkalibrasi menghasilkan probabilitas yang bisa dipakai untuk perhitungan bisnis — misal ekspektasi kerugian, bukan hanya keputusan biner.
Evaluasi terbaik berakhir dengan angka yang bisa dimengerti stakeholder. Terjemahkan metrik teknis menjadi dampak bisnis:
Fraud model:
- precision 0.85 → 85% alert yang dicek tim fraud adalah benar-benar fraud
- recall 0.70 → 70% fraud tertangkap; 30% lolos (potensi kerugian Rp X)
- threshold 0.6 → jumlah alert per hari = 1.200, tim bisa handle maksimal 1.500Pertanyaan yang harus dijawab evaluasi: "berapa uang yang dihemat / berapa biaya yang dihindari / berapa pengguna yang tertolong?" — bukan sekadar "AUC naik 0.02".
Model yang hebat secara rata-rata bisa gagal di segmen tertentu — kelompok umur tertentu, wilayah tertentu, atau perangkat tertentu. Evaluasi mendalam memecah metrik per segmen:
for segment in df_test["region"].unique():
mask = df_test["region"] == segment
acc = (y_pred[mask] == y_test[mask]).mean()
print(f"{segment}: accuracy {acc:.3f}")Segmentasi mengungkap bias laten: performa buruk di satu segmen bisa menjadi masalah bisnis besar di segmen itu. Ini beririsan dengan fairness dan governance yang akan kita bahas di episode 19.
Important
Satu metrik untuk semua keputusan itu berbahaya. Tetapkan primary metric (untuk membandingkan model) plus guardrail metrics (misal performa segmen minoritas, latensi) yang tidak boleh turun. Model yang naik di primary tapi merusak guardrail harus ditolak.
| Pitfall | Dampak | Pencegahan |
|---|---|---|
| Akurasi untuk data imbalance | Model yang tidak berguna terlihat bagus | Precision/recall/F1 |
| Threshold default 0.5 | Trade-off tidak sesuai bisnis | Threshold berbasis biaya |
| Probabilitas tanpa kalibrasi | Skor risiko tidak bisa dipakai | Cek & perbaiki kalibrasi |
| Hanya metrik rata-rata | Segmen lemah tertutup rata-rata | Evaluasi per segmen |
| Evaluasi tanpa konteks biaya | Stakeholder tidak bisa mengambil keputusan | Terjemahkan ke business metric |
Pada episode 7 ini, kalian telah menguasai evaluasi yang mendalam:
Di episode 8 selanjutnya kita akan membahas Versioning: Code, Data, dan Model — DVC untuk data, git untuk kode, registry untuk model, dan bagaimana ketiganya membentuk lineage yang membuat proyek ML benar-benar reproducible. Sampai jumpa di episode 8!