Menerapkan explainable AI: SHAP untuk kontribusi fitur per prediksi, LIME untuk penjelasan lokal, permutation importance dan partial dependence untuk pemahaman global, plus praktik menjelaskan model ke stakeholder dan kepatuhan seperti credit scoring.

Selama 19 episode kita terus meningkatkan akurasi. Episode ini kita bertanya: mengapa model memutuskan seperti itu? Di banyak domain, akurasi saja tidak cukup — pengguna, regulator, dan stakeholder butuh alasan.
Mengapa interpretability wajib? Contoh paling nyata: credit scoring. Bank menolak kredit kalian — kalian berhak tahu alasannya, dan regulator mewajibkan bank menjelaskan keputusan. Sebuah model yang akurat tapi kotak hitam tidak bisa digunakan dalam konteks seperti ini. Di sinilah XAI (Explainable AI) masuk.
| Tingkat | Pertanyaan | Contoh alat |
|---|---|---|
| Global | Bagaimana model bekerja secara keseluruhan? Fitur mana yang paling penting? | Feature importance, partial dependence |
| Lokal | Mengapa prediksi spesifik ini dibuat? | SHAP, LIME |
Keduanya saling melengkapi: global untuk memahami model dan memvalidasi sanity, lokal untuk menjelaskan keputusan individual kepada user.
Di episode 9 kita memakai feature_importances_ bawaan tree — yang ternyata bias terhadap fitur numerik bervariasi. Permutation importance mengukurnya lebih jujur: acak-acak satu kolom, lalu lihat seberapa besar performa turun. Kolom yang kalau diacak membuat performa hancur = kolom penting.
from sklearn.inspection import permutation_importance
result = permutation_importance(
model, X_val, y_val,
n_repeats=10, scoring="roc_auc", random_state=42,
)
for i in result.importances_mean.argsort()[::-1][:5]:
print(f"{X.columns[i]:20s} {result.importances_mean[i]:.4f} ± {result.importances_std[i]:.4f}")Kelebihan permutation importance: model-agnostic (bisa untuk model apa pun) dan lebih dapat dipercaya daripada importance bawaan.
Partial dependence plot (PDP) menjawab: "Jika fitur X berubah dari nilai kecil ke besar, bagaimana prediksi rata-rata berubah — dengan fitur lain diabaikan?"
from sklearn.inspection import PartialDependenceDisplay
import matplotlib.pyplot as plt
PartialDependenceDisplay.from_estimator(
model, X_val, ["pendapatan"], kind="average"
)
plt.show()PDP memberi gambaran arah dan bentuk hubungan fitur-target — misalnya "prediksi churn turun tajam saat pendapatan di atas 5 juta". Ini yang paling mudah dipahami stakeholder non-teknis.
SHAP adalah standar de facto XAI modern. Ide dasarnya: nilai kontribusi tiap fitur dihitung berdasarkan nilai Shapley dari teori permainan — kontribusi marginal fitur terhadap prediksi, diuji pada semua kombinasi fitur lain.
Untuk satu prediksi — misalnya mengapa customer ini ditolak kredit:
import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_val)
shap.force_plot(
explainer.expected_value,
shap_values[7, :],
X_val.iloc[7, :],
matplotlib=True,
)Force plot menunjukkan basis prediksi (expected value) lalu fitur yang mendorong prediksi ke atas (merah) dan ke bawah (biru). Dari sini bisa dikatakan: "kredit ditolak terutama karena rasio hutang tinggi dan riwayat keterlambatan" — penjelasan yang bisa disampaikan ke user.
Ringkasan kontribusi seluruh data:
shap.summary_plot(shap_values, X_val, feature_names=X.columns)Summary plot menampilkan semua titik data: sumbu X adalah nilai SHAP (arah pengaruh), warna menunjukkan nilai fitur. Kolom yang tersebar luas = fitur penting. Plot ini merangkum kepentingan + arah + interaksi dalam satu gambar.
Tip
Untuk model linear, koefisien sudah memberi arah dan besaran — SHAP tidak wajib. SHAP paling bernilai untuk tree-based dan neural network di mana interpretasi langsung tidak tersedia.
LIME (Local Interpretable Model-agnostic Explanations) menjelaskan satu prediksi dengan melatih model linear kecil di sekitar titik tersebut — mengaproksimasi model kompleks secara lokal.
import lime
import lime.lime_tabular
explainer = lime.lime_tabular.LimeTabularExplainer(
X_train.values, feature_names=X.columns,
class_names=["tidak", "ya"], mode="classification",
)
exp = explainer.explain_instance(
X_val.iloc[7].values, model.predict_proba
)
print(exp.as_list())Keunggulan LIME: model-agnostic — bisa untuk model apa pun (bahkan neural network). Kelemahan: penjelasan sedikit tidak stabil — jalankan dua kali, hasil bisa sedikit berbeda karena sampling acak.
| Alat | Tingkat | Model-agnostic | Stabilitas |
|---|---|---|---|
| Permutation importance | Global | Ya | Stabil |
| Partial dependence | Global | Ya | Stabil |
| SHAP | Global + lokal | Tidak (per-algoritma) | Stabil |
| LIME | Lokal | Ya | Kurang stabil |
Alur lengkap untuk kebutuhan stakeholder + compliance:
def explain_decision(model, explainer, row, idx):
sv = explainer.shap_values(row.values.reshape(1, -1))[0]
reasons = pd.Series(sv, index=X.columns) \
.sort_values(key=abs, ascending=False) \
.head(3)
print(f"Keputusan: {'DITERIMA' if model.predict(row.values.reshape(1, -1))[0] == 1 else 'DITOLAK'}")
for feat, val in reasons.items():
arah = "mendorong diterima" if val > 0 else "mendorong ditolak"
print(f" {feat} ({row[feat]:.2f}): {arah}")Outputnya langsung bisa disampaikan ke user: "Pengajuan ditolak terutama karena rasio hutang 0.78 dan skor pembayaran 420." Transparansi semacam ini bukan sekadar kepatuhan — ia membangun kepercayaan.
Selain untuk compliance, interpretasi adalah alat debugging. Sebelum men-deploy model (episode 18), jawab pertanyaan ini:
Jika model menganggap id_pelanggan sebagai fitur paling penting, itu bukan insight — itu red flag bahwa model menghafal sesuatu yang tidak seharusnya.
Pada episode 20 ini, kalian telah menguasai interpretasi model.
Inti yang harus dibawa pulang:
Di episode 21 selanjutnya kita berpindah paradigma: reinforcement learning — agent, environment, dan reward, lalu Q-Learning, DQN, dan PPO, dengan praktik Gymnasium (cartpole & bandit problem). Sampai jumpa di episode 21!