Ensemble pada chapter sebelumnya berhasil mengangkat akurasi — tetapi coba jelaskan kepada seorang pelanggan mengapa aplikasi kreditnya ditolak oleh gabungan lima model, atau kepada seorang dokter mengapa sistem menandai pasien berisiko tinggi. Makin kuat sebuah model, sering makin sulit menjawab pertanyaan “mengapa”. Explainable AI (XAI) adalah bidang yang menutup jurang itu: seperangkat teknik untuk mengurai bagaimana model mengambil keputusan tanpa harus membongkar seluruh isi mesinnya. Pada chapter ini kita pilah pendekatan intrinsik dan post-hoc, berkenalan dengan dua nama besar — SHAP dan LIME — lalu mempraktikkan teknik yang paling jujur dan ringan: permutation importance dari scikit-learn.
Kenapa Model Harus Bisa Dijelaskan #
Kebutuhan penjelasan bukan sekadar sopan santun pelaporan. Setidaknya lima alasan praktis membuat XAI menjadi syarat di banyak proyek nyata:
| Kebutuhan | Pertanyaan yang harus dijawab | Contoh |
|---|---|---|
| Keputusan bisa dipertanggungjawabkan | “Mengapa permohonan pelanggan ini ditolak?” | penilaian kredit, penyaringan lamaran |
| Kesalahan bisa dilacak | “Fitur mana yang membuat model salah di kelompok ini?” | debugging bias data |
| Regulasi dan audit | “Apakah keputusan bertumpu pada fitur yang dilarang?” | sektor keuangan dan kesehatan |
| Kepercayaan pengguna | “Saya perlu tahu alasannya sebelum mengikuti saran sistem” | alat bantu klinis |
| Wawasan domain | “Pola apa yang sebenarnya dipelajari model?” | penemuan pola bisnis baru |
Model yang tidak bisa menjelaskan dirinya sendiri akan kesulitan melewati kelima pintu tersebut — bahkan saat akurasinya tinggi.
Intrinsik dan Post-hoc: Dua Jalur Penjelasan #
Jalur pertama memakai model yang intrinsik mudah dijelaskan: koefisien regresi linear, aturan decision tree, atau bobot Naive Bayes bisa dibaca langsung. Jalur kedua memakai model apa pun lalu menjelaskannya post-hoc — penjelasan dibangun di luar model setelah model selesai dilatih.
| Aspek | Intrinsik | Post-hoc |
|---|---|---|
| Kapan penjelasan dibuat | Saat model dibentuk, bagian dari strukturnya | Setelah model jadi, sebagai lapisan tambahan |
| Jenis model | Regresi linear, decision tree, Naive Bayes | Random forest, gradient boosting, neural network |
| Kejujuran penjelasan | Persis — penjelasan adalah modelnya | Perkiraan — penjelasan bukan model itu sendiri |
| Kompromi | Kemampuan prediksi biasanya lebih rendah | Akurasi tinggi, penjelasan tetap approximation |
Jembatan antara keduanya adalah model surrogat: latih model sederhana untuk meniru keputusan model kompleks, lalu baca surrogatnya. Trik ini bermanfaat ketika regulasi menuntut aturan yang bisa dibaca manusia, meskipun kita tetap perlu waspada — surrogat hanya meniru, dan tiruan yang terlalu jauh berarti penjelasannya keliru.
SHAP dan LIME: Dua Nama Besar Penjelasan Lokal #
Dua teknik post-hoc paling terkenal berfokus pada penjelasan lokal — mengapa baris ini diputuskan begitu. LIME (Local Interpretable Model-agnostic Explanations) mengganggu satu baris berkali-kali dengan mengubah sebagian nilai fiturnya, mencatat prediksi model untuk tiap versi gangguan, lalu melatih model kecil yang mudah dibaca di sekitar baris itu; bobot model kecil itulah penjelasannya. SHAP menghitung kontribusi tiap fitur lewat kerangka nilai Shapley dari teori permainan — cara membagi hasil “permainan” (prediksi) secara adil ke para “pemain” (fitur), dengan menjumlahkan kontribusi fitur pada setiap kemungkinan urutan kerja sama. SHAP menjamin kontribusi semua fitur berjumlah tepat menjadi selisih prediksi terhadap nilai dasar, sehingga penjelasannya runtut secara matematis.
Keduanya tersedia sebagai library terpisah; SHAP tersedia di shap.readthedocs.io . Untuk penjelasan global — fitur mana yang paling berpengaruh bagi model secara keseluruhan — scikit-learn sudah menyediakan alat ringkas yang tidak butuh library tambahan.
Praktik: Permutation Importance #
Idenya sederhana dan jujur: ukur akurasi model, kocok (acakkan urutan) satu kolom fitur sehingga hubungannya dengan target putus, ukur ulang akurasinya. Fitur yang penurunannya besar adalah fitur yang benar-benar dipakai model. Kita jalankan pada model random forest pemesanan pelanggan dari chapter sebelumnya, dengan pengocokan diulang 30 kali agar hasilnya stabil:
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.inspection import permutation_importance
rng = np.random.default_rng(42)
X = pd.DataFrame({
"kunjungan_bulan": np.concatenate([rng.integers(5, 15, 32), rng.integers(3, 11, 8)]),
"jumlah_keluhan": np.concatenate([rng.integers(0, 4, 32), rng.integers(1, 6, 8)]),
"umur_member": np.concatenate([rng.integers(3, 41, 32), rng.integers(1, 31, 8)]),
})
y = pd.Series(np.array([0] * 32 + [1] * 8), name="berhenti")
X_latih, X_uji, y_latih, y_uji = train_test_split(
X, y, test_size=0.25, stratify=y, random_state=42
)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_latih, y_latih)
hasil = permutation_importance(
model, X_uji, y_uji, n_repeats=30, random_state=42
)
penting = pd.DataFrame({
"fitur": X.columns,
"penurunan_akurasi": hasil.importances_mean.round(4),
"simpangan": hasil.importances_std.round(4),
}).sort_values("penurunan_akurasi", ascending=False)
print(penting.to_string(index=False))
# satu pelanggan untuk penjelasan lokal
pelanggan_baru = pd.DataFrame({"kunjungan_bulan": [4], "jumlah_keluhan": [4], "umur_member": [6]})
peluang = model.predict_proba(pelanggan_baru)[0, 1]
print(f"\nPeluang pelanggan (4, 4, 6) berhenti: {peluang:.2f}")Output yang Dihasilkan:
fitur penurunan_akurasi simpangan
kunjungan_bulan 0.0567 0.0803
jumlah_keluhan 0.0433 0.0496
umur_member -0.0100 0.0907
Peluang pelanggan (4, 4, 6) berhenti: 0.97Mari kita telaah baris-baris pentingnya:
- Baris 17-19 (
permutation_importance(..., n_repeats=30)): pengujian dilakukan pada data uji, bukan data latih — kita ingin tahu fitur mana yang dipakai saat menggeneralisasi, bukan saat menghafal.n_repeats=30mengulang pengocokan sehingga kita mendapat rata-rata dan simpangan. - Baris 21-27 (rangkuman ke DataFrame):
importances_meanadalah rata-rata penurunan akurasi;importances_stdmenunjukkan goyangan hasil antar ulangan. DataFrame diurutkan supaya fitur terpenting tampil paling atas. - Bacaan hasilnya:
kunjungan_bulanmenempati posisi teratas (0,057) disusuljumlah_keluhan(0,043) — masuk akal, dua fitur inilah yang membedakan pelanggan bertahan dan berhenti sejak chapter Imbalanced Learning . - Nilai negatif
umur_member(-0,0100): mengocok kolom umur justru sedikit menaikkan akurasi rata-rata — artinya pada data uji sekecil ini (10 baris), fitur umur tidak membantu model sama sekali, dan selisihnya lebih kecil daripada simpangannya (0,0907). Permutation importance yang jujur memang bisa menghasilkan nilai nol atau negatif; itu penanda fitur tidak berkontribusi. - Baris 30-32 (satu pelanggan): model memberi peluang 0,97 bahwa pelanggan dengan profil (kunjungan 4, keluhan 4, umur 6) akan berhenti. Angka ini adalah jenis pertanyaan yang digarap SHAP dan LIME: dari mana datangnya 0,97 untuk baris ini — dan itu pertanyaan penjelasan lokal.
Rangkuman #
- XAI menjawab lima kebutuhan praktis: akuntabilitas keputusan, pelacakan kesalahan, regulasi, kepercayaan, dan wawasan domain.
- Penjelasan intrinsik melekat pada model sederhana (koefisien, aturan pohon); penjelasan post-hoc membingkai model kompleks dari luar.
- LIME menjelaskan satu baris lewat model kecil di sekitarnya; SHAP membagi prediksi secara adil ke tiap fitur lewat nilai Shapley dan menjamin jumlahnya runtut.
- Permutation importance adalah teknik global yang ringan dan jujur: kocok satu kolom, lihat seberapa jauh akurasi jatuh — pada data uji, diulang berkali-kali.
- Nilai nol atau negatif bukan keanehan melainkan pesan jujur bahwa fitur tersebut tidak terbukti membantu model.
Permutation importance bukan satu-satunya cara membaca pengaruh fitur. Random forest memiliki feature_importances_ bawaan yang sering dipakai orang tanpa mengetahui biasnya — perbandingan kedua ukuran itulah bahasan chapter berikutnya: Interpretasi Feature Importance
.
Referensi: