Mengapa Evaluasi Penting?
Evaluasi model adalah langkah kritis untuk mengetahui seberapa baik model ML bekerja. Accuracy saja tidak cukup, terutama untuk data imbalanced.
1. Confusion Matrix
Tabel yang menunjukkan prediksi benar vs salah untuk setiap kelas:
Prediksi
Positif Negatif
Aktual Positif TP FN
Negatif FP TN
TP = True Positive (benar positif)
TN = True Negative (benar negatif)
FP = False Positive (salah positif - Type I Error)
FN = False Negative (salah negatif - Type II Error)
2. Metrics Dasar
Accuracy
Accuracy = (TP + TN) / (TP + TN + FP + FN)
Proporsi prediksi benar dari total data. Hati-hati untuk data imbalanced!
Precision
Precision = TP / (TP + FP)
Dari semua yang diprediksi positif, berapa yang benar positif? Penting ketika FP costly (misal: spam detection).
Recall (Sensitivity)
Recall = TP / (TP + FN)
Dari semua yang aktual positif, berapa yang terdeteksi? Penting ketika FN costly (misal: diagnosis kanker).
F1-Score
F1 = 2 × (Precision × Recall) / (Precision + Recall)
Harmonic mean dari Precision dan Recall. Baik untuk perbandingan model.
3. ROC-AUC
ROC (Receiver Operating Characteristic) curve menunjukkan trade-off antara True Positive Rate dan False Positive Rate. AUC (Area Under Curve) mengukur area di bawah kurva ROC (0-1, semakin tinggi semakin baik).
Implementasi Python
from sklearn.metrics import (accuracy_score, precision_score, recall_score,
f1_score, confusion_matrix, classification_report,
roc_auc_score, roc_curve)
import matplotlib.pyplot as plt
# Setelah prediksi
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1] # probabilitas kelas positif
# Metrics
print(f"Accuracy: {accuracy_score(y_test, y_pred):.4f}")
print(f"Precision: {precision_score(y_test, y_pred):.4f}")
print(f"Recall: {recall_score(y_test, y_pred):.4f}")
print(f"F1-Score: {f1_score(y_test, y_pred):.4f}")
print(f"ROC-AUC: {roc_auc_score(y_test, y_prob):.4f}")
# Classification Report lengkap
print(classification_report(y_test, y_pred))
# Confusion Matrix
cm = confusion_matrix(y_test, y_pred)
print(cm)
# Plot ROC Curve
fpr, tpr, _ = roc_curve(y_test, y_prob)
plt.plot(fpr, tpr, label=f'ROC (AUC = {roc_auc_score(y_test, y_prob):.2f})')
plt.plot([0,1], [0,1], 'k--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend()
plt.show()
Tips Memilih Metrics
- Data balanced: Accuracy cukup.
- Data imbalanced: Gunakan F1-Score, Precision/Recall, atau ROC-AUC.
- FP costly: Optimalkan Precision.
- FN costly: Optimalkan Recall.