Sessi 11: Evaluasi Model Klasifikasi (Metrik Kritis)

Fokus: Memahami dan mengimplementasikan metrik evaluasi model klasifikasi biner, termasuk Confusion Matrix, Akurasi, Presisi, Recall, dan F1-Score. Penekanan pada pemilihan metrik yang tepat dalam studi kasus ilmiah (e.g., diagnosis).

A. The Confusion Matrix (Matriks Kebingungan)

Confusion Matrix adalah fondasi dari semua metrik evaluasi klasifikasi. Matriks ini menyajikan visualisasi kinerja algoritma klasifikasi dengan membandingkan nilai kelas yang diprediksi dengan nilai kelas aktual. Matriks ini terbagi menjadi empat kuadran hasil:

1. Komponen Dasar

Penting untuk Mhs Fisika/Matematika: Dalam pengujian hipotesis, FP adalah menolak hipotesis nol (H0) yang benar, sementara FN adalah gagal menolak H0 yang salah.

2. Visualisasi Matriks

Meskipun ini adalah tabel, implementasi di Python (menggunakan seaborn.heatmap) akan memvisualisasikannya menjadi *heatmap* yang intuitif.

Aktual
Prediksi Positif (P) Negatif (N)
Positif (P') TP FP
Negatif (N') FN TN

B. Metrik Utama Berbasis Confusion Matrix

Metrik-metrik ini dihitung dari nilai-nilai TP, TN, FP, dan FN.

1. Akurasi (Accuracy)

Akurasi mengukur proporsi total prediksi yang benar (TP + TN) dari semua kasus. Ini adalah metrik yang paling intuitif, tetapi bisa menyesatkan pada *dataset* yang tidak seimbang (*imbalanced*).

Akurasi = (TP + TN) / (TP + TN + FP + FN)

2. Presisi (Precision)

Presisi menjawab: "Dari semua yang diprediksi positif, berapa banyak yang benar-benar positif?". Presisi penting ketika biaya False Positive (FP) sangat tinggi.

Presisi = TP / (TP + FP)

3. Recall (Sensitivitas / Tingkat Keberhasilan)

*Recall* (Sensitivitas) menjawab: "Dari semua yang seharusnya positif, berapa banyak yang berhasil diprediksi positif?". Recall penting ketika biaya False Negative (FN) sangat tinggi (e.g., gagal mendeteksi kanker atau cacat material).

Recall = TP / (TP + FN)

4. F1-Score

F1-Score adalah rata-rata harmonis dari Presisi dan Recall. Metrik ini berguna ketika kita membutuhkan keseimbangan antara Presisi dan Recall, terutama pada *dataset* yang tidak seimbang.

F1-Score = 2 * ((Presisi * Recall) / (Presisi + Recall))

C. Studi Kasus Implementasi: Evaluasi Klasifikasi Biner

Melanjutkan model Regresi Logistik dari Sessi 10, kita akan menggunakan Scikit-learn untuk menghitung dan memvisualisasikan metrik-metrik tersebut.

Langkah 1: Import dan Menghitung Matriks

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, classification_report

# --- Data Persiapan Ulang (Seperti Sessi 10) ---
data = {
    'mean radius': [17.99, 20.57, 19.69, 11.42, 20.29, 12.45, 18.25, 13.71, 13.00, 12.43],
    'mean texture': [10.38, 17.77, 21.25, 20.38, 14.34, 15.70, 19.98, 20.83, 21.89, 23.36],
    'diagnosis': [1, 1, 1, 0, 1, 0, 1, 0, 1, 0] # 1=Malignant (Ganas), 0=Benign (Jinak)
}
df = pd.DataFrame(data)
X = df[['mean radius', 'mean texture']] 
y = df['diagnosis'] 

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(
    X_scaled, y, test_size=0.3, random_state=42
)

model_logreg = LogisticRegression(random_state=42)
model_logreg.fit(X_train, y_train)
y_pred = model_logreg.predict(X_test)

# --- TAHAP EVALUASI (Sessi 11) ---

# 1. Hitung Confusion Matrix
cm = confusion_matrix(y_test, y_pred)
print("--- Confusion Matrix ---")
print(cm)
# Output Matriks (Contoh Fiktif: [[TN, FP], [FN, TP]])
# [[1, 1],
#  [0, 1]] 
# Interpretasi: TN=1, FP=1, FN=0, TP=1

# 2. Hitung Metrik Utama
acc = accuracy_score(y_test, y_pred)
prec = precision_score(y_test, y_pred)
rec = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)

print("\n--- Ringkasan Metrik Kunci ---")
print(f"Akurasi: {acc:.3f}")
print(f"Presisi: {prec:.3f}")
print(f"Recall: {rec:.3f}")
print(f"F1-Score: {f1:.3f}")

Langkah 2: Menggunakan Classification Report

Cara paling ringkas dan profesional untuk melihat semua metrik secara sekaligus adalah dengan menggunakan classification_report.

print("\n--- Classification Report ---")
print(classification_report(y_test, y_pred))

# Interpretasi Classification Report:
# Nilai metrik (Presisi, Recall, F1) disajikan untuk setiap kelas (0 dan 1).
# Pada kasus medis (diagnosis), kita seringkali lebih peduli pada metrik kelas '1' (Malignant/Ganas).
# Jika Recall (Sensitivitas) untuk kelas 1 rendah, berarti model sering gagal mendeteksi kasus positif yang sebenarnya (FN tinggi).

D. Kasus Kritis: Kapan Akurasi Gagal?

Bayangkan *dataset* di mana hanya 1% pasien yang memiliki penyakit (kelas Positif=1) dan 99% sehat (kelas Negatif=0).

Jika model selalu memprediksi **Negatif**, maka Akurasi model tersebut adalah **99%**. Akurasi terlihat sangat tinggi, tetapi model ini sama sekali tidak berguna karena ia gagal mendeteksi semua kasus penyakit yang sebenarnya (Recall 0%).

Dalam skenario ini, Akurasi menyesatkan. Metrik seperti Recall, Presisi, atau F1-Score menjadi wajib untuk menilai kinerja model secara valid, terutama ketika *dataset* Anda tidak seimbang (*imbalanced*).