Model Interpretability dengan SHAP dan LIME: Menjelaskan Prediksi Machine Learning secara Transparan

Lhuqita Fazry
SHAP LIME Model Interpretability Explainable AI Machine Learning
Model Interpretability dengan SHAP dan LIME: Menjelaskan Prediksi Machine Learning secara Transparan

Keterbatasan Akurasi sebagai Satu-Satunya Ukuran dan Kebutuhan Model yang Dapat Dijelaskan

Model machine learning modern sering dianggap sebagai kotak hitam. Kita bisa melihat input dan output, tetapi proses di dalamnya sulit dipahami manusia. Masalah ini menjadi serius ketika akurasi tinggi tidak disertai kemampuan untuk menjelaskan keputusan. Sebuah model yang memprediksi penolakan kredit dengan akurasi 95 persen tetap berisiko jika kita tidak bisa menjelaskan mengapa satu nasabah ditolak.

Ada beberapa konteks di mana interpretability bukan pilihan, melainkan kewajiban. Regulasi keuangan menuntut bank menjelaskan alasan penolakan kredit kepada nasabah. Diagnosa medis membutuhkan dokter yang bisa mempertanggungjawabkan rekomendasi model di depan pasien. Persetujuan kredit dan keputusan asuransi juga masuk kategori ini, karena keputusan model berdampak langsung pada kehidupan seseorang.

Interpretability bekerja pada dua tingkat. Global interpretability menjelaskan pola keseluruhan model, misalnya fitur mana yang paling berpengaruh secara umum. Local interpretability menjelaskan alasan satu prediksi spesifik, misalnya mengapa model menolak pengajuan kredit milik satu nasabah tertentu.

SHAP dan LIME adalah post-hoc explainer. Kedua alat ini menjelaskan model yang sudah terlatih tanpa mengubah arsitektur atau melatih ulang. Pendekatan ini praktis karena kita bisa menerapkannya pada model apa pun yang sudah berjalan di produksi.

Prinsip Kerja LIME sebagai Local Surrogate Model di Sekitar Satu Observasi

LIME, singkatan dari Local Interpretable Model-agnostic Explanations, bekerja dengan ide yang berbeda dari kebanyakan teknik interpretability. Alih-alih mencoba memahami seluruh model, LIME melatih model interpretable sederhana, seperti linear regression atau decision tree, yang meniru perilaku model kompleks hanya di sekitar satu sampel. LIME bekerja seperti meminta pendapat panel ahli kecil yang hanya memahami satu keputusan spesifik, bukan seluruh kebijakan perusahaan.

Prosesnya dimulai dengan perturbasi. Kita membuat banyak sampel acak di sekitar observasi target dengan mengubah nilai fitur secara kecil-kecilan. Sampel-sampel ini kemudian diprediksi menggunakan model asli, sehingga kita mendapatkan label untuk setiap sampel perturbasi. Selanjutnya, model surrogate dilatih pada data perturbasi dengan pembobotan, di mana sampel yang lebih dekat dengan observasi target mendapat bobot lebih besar.

Hasilnya adalah koefisien dari model surrogate. Koefisien positif menunjukkan fitur yang mendorong prediksi ke arah kelas tertentu, sedangkan koefisien negatif menunjukkan fitur yang menjauhkan prediksi dari kelas tersebut. Interpretasi ini mudah dibaca karena berbentuk kontribusi per fitur.

Ilustrasi konsep local surrogate model pada LIME

Gambar: Ilustrasi konsep local surrogate model pada LIME — Sumber: marcotcr/lime (GitHub)

Batasan utama LIME terletak pada kestabilan. Karena perturbasi dilakukan secara acak, penjelasan yang dihasilkan bisa bervariasi antar run. Menjalankan LIME dua kali pada sampel yang sama bisa menghasilkan urutan fitur yang sedikit berbeda, sehingga kita perlu berhati-hati saat menyajikan hasilnya.

Prinsip Kerja SHAP dengan Shapley Values dan Kontribusi Aditif Setiap Fitur

SHAP, singkatan dari SHapley Additive exPlanations, berakar dari game theory. Konsep nilai Shapley awalnya digunakan untuk membagi keuntungan secara adil di antara pemain dalam sebuah koalisi. Dalam konteks machine learning, pemain adalah fitur dan keuntungan adalah prediksi. Nilai Shapley membagi kontribusi prediksi seperti membagi bonus tim berdasarkan kontribusi aktual setiap anggota, bukan rata-rata atau senioritas.

SHAP menerapkan konsep additive feature attribution. Prediksi akhir dihitung sebagai nilai baseline ditambah jumlah kontribusi setiap fitur. Baseline biasanya adalah rata-rata prediksi model pada data training. Prediksi akhir adalah penjumlahan kontribusi tiap fitur terhadap baseline, seperti nilai akhir rapor yang diakumulasi dari nilai setiap mata pelajaran.

Diagram Venn yang menunjukkan konsep Shapley values dan distribusi kontribusi fitur

Gambar: Diagram Venn yang menunjukkan konsep synergy Shapley values dalam distribusi kontribusi fitur — Sumber: Wikipedia: Shapley value

Keunggulan utama SHAP adalah jaminan matematis. Metode ini memenuhi sifat consistency, di mana fitur yang lebih berpengaruh tidak akan pernah mendapat nilai kontribusi yang lebih kecil. SHAP juga memenuhi local accuracy, artinya jumlah seluruh kontribusi fitur selalu sama dengan selisih antara prediksi dan baseline. Dua sifat ini membuat penjelasan SHAP dapat diandalkan secara teoritis.

Output SHAP hadir dalam dua bentuk. Untuk local explanation, kita mendapatkan objek shap.Explanation yang berisi kontribusi setiap fitur untuk satu sampel. Untuk gambaran global, shap.summary_plot menampilkan ranking fitur berdasarkan pengaruhnya terhadap seluruh data.

Implementasi LIME untuk Menjelaskan Satu Prediksi dari Random Forest

Mari kita terapkan LIME pada dataset load_breast_cancer dari sklearn.datasets. Dataset ini berisi 569 sampel dengan 30 fitur numerik yang menggambarkan karakteristik sel tumor, dengan label biner malignant atau benign. Kita akan melatih RandomForestClassifier sebagai model black-box, lalu menjelaskan satu prediksi menggunakan LimeTabularExplainer.

python
!pip install scikit-learn lime numpy

import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from lime.lime_tabular import LimeTabularExplainer

data = load_breast_cancer()
X, y = data.data, data.target
feature_names = data.feature_names
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

explainer = LimeTabularExplainer(
    training_data=X_train,
    feature_names=feature_names,
    class_names=data.target_names,
    mode="classification"
)

sample_idx = 0
exp = explainer.explain_instance(
    X_test[sample_idx], model.predict_proba, num_features=10
)

pred = model.predict(X_test[sample_idx].reshape(1, -1))[0]
print(f"Prediksi: {data.target_names[pred]}")
print(f"Probabilitas: {model.predict_proba(X_test[sample_idx].reshape(1, -1))}")
exp.show_in_notebook(show_table=True)

Output:

text
Prediksi: benign
Probabilitas: [[0.03 0.97]]
516.45 < worst area <= 686.60: 0.0733
84.25 < worst perimeter <= 97.67: 0.0412
13.05 < worst radius <= 14.97: 0.0372
0.23 < worst concavity <= 0.39: -0.0200
11.71 < mean radius <= 13.30: 0.0188
16.17 < mean texture <= 18.68: 0.0147
0.06 < mean concavity <= 0.13: -0.0121
21.05 < worst texture <= 25.22: 0.0119
0.09 < mean compactness <= 0.13: 0.0110
420.30 < mean area <= 551.70: 0.0102

Alur kode di atas membangun pipeline interpretability secara lengkap. Kita memuat dataset, memisahkan data latih dan data uji, lalu melatih Random Forest sebagai model black-box. Langkah kunci berikutnya adalah membuat LimeTabularExplainer dengan training data sebagai background, sehingga LIME mengetahui rentang nilai setiap fitur saat melakukan perturbasi.

Untuk menjelaskan satu prediksi, kita memanggil explain_instance dengan sampel uji pertama dan fungsi model.predict_proba. LIME kemudian melakukan perturbasi di sekitar sampel tersebut, memprediksi setiap sampel perturbasi dengan model asli, dan melatih model surrogate. Parameter num_features=10 membatasi jumlah fitur yang ditampilkan agar penjelasan tetap ringkas.

Output yang dihasilkan berisi prediksi kelas, probabilitas, dan daftar fitur dengan nilai kontribusinya. Fitur dengan bobot positif mendorong prediksi ke kelas tertentu, sedangkan bobot negatif menjauhkan prediksi dari kelas tersebut. Dari output ini, kita bisa langsung melihat fitur mana yang paling menentukan keputusan model untuk satu sampel spesifik.

Implementasi SHAP untuk Local dan Global Explanation

SHAP memanfaatkan struktur internal model untuk menghitung kontribusi fitur secara eksak. shap.TreeExplainer dirancang khusus untuk model berbasis tree seperti Random Forest, sehingga komputasi nilai Shapley berjalan jauh lebih cepat dibandingkan pendekatan umum yang mencoba semua kombinasi fitur.

python
!pip install shap scikit-learn matplotlib

import shap
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

data = load_breast_cancer()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)

shap.force_plot(explainer.expected_value[1], shap_values[1][0, :],
                X_test[0, :], feature_names=data.feature_names, matplotlib=True)
plt.show()
shap.summary_plot(shap_values[1], X_test, feature_names=data.feature_names)

Output:

Output dari kode di atasOutput dari kode di atas

Setelah explainer dibuat, kita menghitung shap_values untuk seluruh data uji sekaligus. Hasilnya adalah array dengan dua dimensi kelas, karena dataset ini adalah klasifikasi biner. Untuk menampilkan penjelasan satu sampel, kita menggunakan force_plot dengan expected_value sebagai baseline dan shap_values[1][0, :] sebagai kontribusi fitur untuk sampel pertama pada kelas positif.

force_plot menampilkan visualisasi berbentuk panah. Fitur yang mendorong prediksi ke arah kelas positif digambar ke kanan dengan warna merah, sedangkan fitur yang mendorong ke arah sebaliknya digambar ke kiri dengan warna biru. Panjang panah menunjukkan besarnya kontribusi, sehingga kita langsung melihat fitur dominan dalam satu prediksi.

Untuk gambaran global, summary_plot menampilkan seluruh data uji sekaligus. Setiap titik mewakili satu sampel, posisi horizontal menunjukkan nilai SHAP, dan warna menunjukkan nilai fitur asli. Plot ini merangking fitur dari yang paling berpengaruh di bagian atas hingga yang paling kecil di bagian bawah.

Menariknya, ketika kita membandingkan hasil SHAP dengan LIME pada sampel yang sama, fitur utama yang teridentifikasi biasanya konsisten. Perbedaan kecil tetap mungkin terjadi karena LIME menggunakan perturbasi acak, sedangkan SHAP menghitung secara eksak.

Memilih Antara SHAP dan LIME serta Best Practices untuk Interpretability di Produksi

Keputusan memilih antara SHAP dan LIME bergantung pada jenis model dan kebutuhan. Untuk model berbasis tree seperti Random Forest, XGBoost, atau LightGBM, SHAP adalah pilihan utama. TreeExplainer menghitung nilai Shapley secara eksak dengan cepat, dan sifat consistency-nya menjamin penjelasan yang stabil. LIME lebih berguna ketika model bukan berbasis tree, misalnya neural network atau SVM, dan kita membutuhkan penjelasan cepat tanpa komputasi berat.

Trade-off komputasi perlu dipertimbangkan. SHAP dengan komputasi eksak sangat mahal untuk model non-tree, karena harus mengevaluasi banyak kombinasi fitur. Sebaliknya, TreeExplainer menyelesaikan perhitungan dalam waktu singkat berkat struktur tree. LIME menawarkan kecepatan yang konsisten untuk semua jenis model, tetapi dengan harga kestabilan yang lebih rendah.

Interpretability lokal tidak selalu cukup. Penjelasan satu prediksi tidak menggambarkan perilaku model secara keseluruhan. Praktik terbaik adalah menggabungkan local explanation dengan global feature importance, sehingga kita memahami alasan satu keputusan sekaligus pola umum model.

Ada tiga best practices yang perlu dipegang di produksi. Pertama, validasi penjelasan dengan domain expert, karena model tidak bisa menilai apakah penjelasannya masuk akal secara bisnis. Kedua, dokumentasikan batasan alat yang digunakan, termasuk kemungkinan variasi hasil pada LIME. Ketiga, jangan menyajikan penjelasan sebagai kausalitas, karena kontribusi fitur menunjukkan korelasi dalam model, bukan hubungan sebab-akibat di dunia nyata.

Setelah memahami SHAP dan LIME, langkah selanjutnya adalah menerapkan model interpretability dalam proyek machine learning yang bertanggung jawab. Bergabunglah dengan bootcamp atau kursus Machine Learning di Rumah Coding untuk mempelajari cara membangun, mengevaluasi, dan menjelaskan model secara end-to-end, dari data preparation hingga deployment.

Artikel Terkait