Tutorial SHAP: Explainable AI dan Interpretasi Model

# SHAP - Panduan Praktis Explainable AI dan Interpretabilitas Model Model machine learning makin sering dipakai untuk mengambil keputusan yang berdampak pada orang: persetujuan pinjaman, triase medis...

By Ruby Abdullah · · tutorial
SHAPExplainable AIInterpretabilityMachine LearningXAIPython

SHAP - Panduan Praktis Explainable AI dan Interpretabilitas Model

Model machine learning makin sering dipakai untuk mengambil keputusan yang berdampak pada orang: persetujuan pinjaman, triase medis, penandaan fraud, hingga intervensi churn. Ketika model menjawab "tidak", para pemangku kepentingan wajar bertanya mengapa. SHAP (SHapley Additive exPlanations) memberikan jawaban yang berdasar dan konsisten dengan mengatribusikan setiap prediksi ke fitur-fitur yang menghasilkannya.

Tutorial ini adalah pembahasan mendalam khusus tentang SHAP: teori di baliknya, API modern, explainer yang tepat untuk tiap tipe model, setiap plot inti beserta cara membacanya, dan jebakan yang sering menyandung tim di produksi.

Daftar Isi

  • Mengapa Interpretabilitas Penting
  • Penjelasan Global vs Lokal
  • Intuisi di Balik Nilai Shapley
  • Apa Arti Sebuah Nilai SHAP
  • Instalasi
  • API Terpadu dan Explainer Khusus
  • Contoh Tabular Lengkap
  • Membaca Plot-Plot Inti
  • Mengagregasi Tampilan Lokal Menjadi Global
  • Nilai Interaksi
  • Menjelaskan Model Regresi
  • Menjelaskan Model Teks dan NLP
  • Mengoperasikan SHAP di Produksi
  • Jebakan Umum
  • Praktik Terbaik
  • Kesimpulan dan Poin Utama
  • Mengapa Interpretabilitas Penting

    Model yang mencetak skor bagus pada data uji belum tentu otomatis layak dipercaya. Interpretabilitas menjawab empat kebutuhan konkret yang muncul di proyek nyata.

    • Kepercayaan dan adopsi. Pakar domain lebih cepat mengadopsi model bila mereka bisa melihat bahwa model bertumpu pada sinyal yang masuk akal, bukan korelasi semu. Seorang analis kredit lebih nyaman menindaklanjuti skor ketika pendorongnya cocok dengan model pikir mereka.
    • Debugging. Penjelasan membongkar kebocoran data (leakage) dan pembelajaran jalan pintas. Bila kolom timestamp "masa depan" mendominasi model fraud, penjelasan akan menampakkannya jauh sebelum postmortem.
    • Keadilan (fairness). Dengan memeriksa bagaimana atribut terlindungi atau proxy-nya berkontribusi pada prediksi, tim bisa mendeteksi dan mengukur perilaku yang tidak diinginkan.
    • Regulasi. Kerangka seperti hak penjelasan (right-to-explanation) GDPR Uni Eropa, EU AI Act, dan panduan pengawas keuangan makin menuntut alasan yang terdokumentasi dan dapat direproduksi di balik keputusan otomatis.

    SHAP sendiri tidak membuat model menjadi adil atau benar. Ia adalah alat ukur yang memberi tahu, secara setia, apa yang sedang dilakukan model sehingga Anda bisa memutuskan apakah perilaku itu dapat diterima.

    Penjelasan Global vs Lokal

    Pertanyaan interpretabilitas hadir dalam dua bentuk, dan SHAP menjawab keduanya dengan besaran yang sama di bawahnya.

    • Penjelasan lokal: "Mengapa model menghasilkan prediksi ini untuk pelanggan ini?" Jawabannya adalah kontribusi per fitur untuk satu baris.
    • Penjelasan global: "Fitur mana yang paling berpengaruh di seluruh dataset, dan ke arah mana?" Jawabannya diperoleh dengan menggabungkan penjelasan lokal dari banyak baris.

    Sifat berguna dari SHAP adalah tampilan global secara harfiah merupakan rangkuman dari tampilan lokal. Rata-rata nilai SHAP absolut per fitur memberi tingkat kepentingan global; tanda dan sebaran nilai per baris menggambarkan arah dan keragaman. Tidak ada metrik "kepentingan global" terpisah yang tidak konsisten yang harus didamaikan.

    Intuisi di Balik Nilai Shapley

    Nilai Shapley berasal dari teori permainan kooperatif (Lloyd Shapley, 1953). Bayangkan sebuah permainan di mana beberapa pemain bekerja sama menghasilkan hadiah, dan Anda perlu membagi hadiah itu secara adil. Nilai Shapley seorang pemain adalah rata-rata kontribusi marginalnya di seluruh urutan kemungkinan pemain bergabung ke koalisi.

    Petakan ini ke prediksi: "pemain" adalah fitur input, "hadiah" adalah keluaran model untuk satu baris, dan nilai Shapley sebuah fitur adalah seberapa besar, rata-rata, memasukkan fitur itu mengubah prediksi ketika fitur ditambahkan dalam setiap urutan kemungkinan.

    Alasan ini penting: nilai Shapley adalah satu-satunya metode atribusi yang memenuhi sekumpulan aksioma keadilan secara bersamaan:

    • Efisiensi: kontribusi fitur dijumlahkan persis sama dengan selisih antara prediksi dan nilai dasar (baseline).
    • Simetri: dua fitur yang berkontribusi identik memperoleh kredit yang sama.
    • Dummy: fitur yang tidak pernah mengubah keluaran mendapat nol.
    • Aditivitas: kontribusi tergabung secara konsisten lintas ensembel model.

    Perhitungan Shapley yang eksak mempertimbangkan seluruh himpunan bagian fitur, yang bersifat eksponensial. Kontribusi SHAP adalah serangkaian algoritma efisien yang menghitung atau memperkirakan nilai-nilai ini untuk kelas model tertentu, terutama algoritma waktu polinomial yang eksak untuk ensembel pohon.

    Apa Arti Sebuah Nilai SHAP

    Sebuah nilai SHAP adalah kontribusi aditif yang diukur terhadap sebuah nilai dasar. Untuk satu prediksi:

    prediksi = nilaidasar + jumlah(nilaishapi untuk setiap fitur i)
    

    nilaidasar (disebut juga expected value) adalah rata-rata keluaran model atas dataset latar (background). Setiap nilaishapi adalah besaran bertanda yang mendorong prediksi naik atau turun dari baseline itu. Nilai positif mendorong keluaran naik; nilai negatif mendorong turun.

    Dekomposisi aditif inilah yang membuat SHAP sekaligus dapat ditafsirkan dan diverifikasi: Anda selalu bisa menjumlahkan kembali kontribusi ke nilai dasar dan memperoleh keluaran model yang persis. Satuannya cocok dengan keluaran model. Untuk model regresi, nilai SHAP berada dalam satuan target; untuk klasifikasi, biasanya dalam ruang log-odds (margin) kecuali Anda secara eksplisit menjelaskan probabilitas.

    Instalasi

    SHAP tersedia di PyPI dan bekerja dengan NumPy, pandas, scikit-learn, XGBoost, LightGBM, serta framework deep learning utama.

    pip install shap
    

    Untuk tutorial ini kita juga memakai beberapa pustaka standar:

    pip install scikit-learn xgboost pandas matplotlib
    

    SHAP merender force plot interaktif menggunakan JavaScript. Di notebook Jupyter, inisialisasi JS sekali per sesi:

    import shap
    

    shap.initjs()

    Plot statis berbasis Matplotlib bekerja tanpa initjs() dan lebih disukai untuk menyimpan gambar ke disk atau menyematkannya di laporan.

    API Terpadu dan Explainer Khusus

    SHAP modern berpusat pada satu titik masuk, shap.Explainer, yang memeriksa model dan data lalu memilih algoritma yang sesuai secara otomatis.

    import shap
    
    

    explainer = shap.Explainer(model, masker)

    explanation = explainer(X)

    Pemanggilan ini mengembalikan objek Explanation. Inilah wadah yang direkomendasikan: ia membungkus .values (nilai SHAP), .basevalues, dan .data (nilai fitur yang dijelaskan) menjadi satu, ditambah nama fitur. Sebagian besar fungsi plot modern menerima Explanation langsung, sehingga Anda jarang perlu memanipulasi array mentah.

    masker mengontrol bagaimana fitur "dihilangkan" saat menghitung kontribusi. Untuk data tabular, masker biasanya berupa dataset latar (ia mendefinisikan distribusi baseline); untuk teks berupa tokenizer; untuk citra berupa strategi penutupan wilayah (region masking).

    Di balik layar, shap.Explainer mengarahkan ke explainer khusus. Anda juga bisa membuat instans ini langsung saat menginginkan kontrol eksplisit:

    • TreeExplainer - cepat dan eksak untuk ensembel pohon: XGBoost, LightGBM, CatBoost, RandomForest dan gradient boosting scikit-learn. Ini adalah andalan untuk ML tabular dan sebaiknya menjadi pilihan default untuk model pohon.
    • LinearExplainer - untuk regresi linear dan logistik. Ia memperhitungkan korelasi fitur dalam data latar dan pada dasarnya berbentuk tertutup (closed-form).
    • KernelExplainer - model-agnostik. Bekerja untuk model apa pun yang menyediakan fungsi prediksi, namun memakai regresi linear lokal berbobot dan lambat, dengan skala buruk terhadap jumlah fitur. Pakai hanya bila tidak ada explainer lebih cepat yang berlaku.
    • DeepExplainer / GradientExplainer - untuk jaringan saraf (TensorFlow/Keras, PyTorch). DeepExplainer mengadaptasi DeepLIFT; GradientExplainer memakai expected gradients. Keduanya memanfaatkan backpropagation untuk efisiensi.
    • PartitionExplainer dan masker - untuk input terstruktur seperti teks dan citra, di mana fitur saling berkorelasi dan terkelompok secara hierarkis. shap.Explainer terpadu memakainya secara otomatis dengan masker teks atau citra.

    Aturan praktis: cocokkan explainer dengan model. Pakai TreeExplainer untuk pohon, LinearExplainer untuk model linear, explainer deep untuk jaringan saraf, dan jadikan KernelExplainer pilihan terakhir.

    Contoh Tabular Lengkap

    Kita akan memakai satu contoh yang koheren di sepanjang tutorial: memprediksi churn pelanggan dari dataset tabular. Agar tutorial mandiri dan dapat direproduksi, kita membuat dataset sintetis yang realistis dengan fitur bernama dan dapat ditafsirkan.

    import numpy as np
    

    import pandas as pd

    from sklearn.modelselection import traintestsplit

    import xgboost as xgb

    rng = np.random.defaultrng(42)

    n = 4000

    tenuremonths = rng.integers(1, 72, n)

    monthlycharges = rng.normal(70, 25, n).clip(15, 150)

    supporttickets = rng.poisson(1.2, n)

    isfiber = rng.integers(0, 2, n)

    hascontract = rng.integers(0, 2, n)

    Bangun sinyal churn: tenure pendek, tagihan tinggi, banyak tiket,

    dan tanpa kontrak (bulanan) meningkatkan risiko churn.

    logit = (

    -0.04 tenuremonths

    • 0.015 monthlycharges
    • 0.35 supporttickets
    • 1.2 hascontract
    • 0.3 isfiber
    • 0.5
    )

    prob = 1 / (1 + np.exp(-logit))

    churn = (rng.random(n) < prob).astype(int)

    X = pd.DataFrame({

    "tenuremonths": tenuremonths,

    "monthlycharges": monthlycharges,

    "supporttickets": supporttickets,

    "isfiber": isfiber,

    "hascontract": hascontract,

    })

    y = pd.Series(churn, name="churn")

    Xtrain, Xtest, ytrain, ytest = traintestsplit(

    X, y, testsize=0.25, randomstate=42, stratify=y

    )

    Latih classifier XGBoost:

    model = xgb.XGBClassifier(
    

    nestimators=300,

    maxdepth=4,

    learningrate=0.05,

    subsample=0.9,

    colsamplebytree=0.9,

    evalmetric="logloss",

    randomstate=42,

    )

    model.fit(Xtrain, ytrain)

    Bangun explainer dan hitung nilai SHAP. Untuk model pohon, shap.Explainer otomatis memilih TreeExplainer:

    import shap
    
    

    explainer = shap.Explainer(model, Xtrain)

    shapvalues = explainer(Xtest)

    print(type(shapvalues)) # explanation.Explanation'>

    print(shapvalues.shape) # (ntest, nfeatures)

    print(shapvalues.basevalues[0])

    Verifikasi sifat aditivitas, sebuah pemeriksaan kewarasan yang baik bahwa explainer terpasang benar. Nilai SHAP untuk classifier biner XGBoost berada di ruang margin (log-odds), jadi ia merekonstruksi margin mentah, bukan probabilitas:

    margin = model.predict(Xtest, outputmargin=True)
    

    reconstructed = shapvalues.basevalues + shapvalues.values.sum(axis=1)

    print(np.allclose(margin, reconstructed, atol=1e-4)) # True

    Bila Anda lebih suka mengatribusikan probabilitas secara langsung, lewatkan keluaran model dalam ruang probabilitas beserta dataset latar:

    probexplainer = shap.Explainer(
    

    model.predictproba, Xtrain, featurenames=X.columns

    )

    Ini memakai jalur model-agnostik dan lebih lambat; sampel data latarnya.

    Untuk model pohon, tetap di ruang margin adalah default yang cepat, eksak, dan direkomendasikan.

    Membaca Plot-Plot Inti

    Setiap plot menjawab pertanyaan yang berbeda. Mengetahui mana yang harus dipakai adalah sebagian besar keahliannya.

    Beeswarm Summary Plot - Kepentingan Global dan Arah

    Plot beeswarm adalah tampilan global paling informatif. Setiap titik adalah nilai SHAP satu baris untuk satu fitur; warna mengkodekan nilai fitur (merah tinggi, biru rendah).

    shap.plots.beeswarm(shapvalues)
    

    Cara membacanya: fitur diurutkan dari atas ke bawah berdasarkan rata-rata nilai SHAP absolut (kepentingan). Untuk tiap fitur, perhatikan sebaran horizontal dan gradien warna. Pada model churn kita, tenuremonths biasanya menampilkan titik merah (tenure tinggi) di kiri (SHAP negatif, churn lebih rendah) dan titik biru (tenure rendah) di kanan (SHAP positif) - menegaskan bahwa tenure pendek menaikkan risiko churn, sesuai arah yang kita rancang.

    Bar Plot - Rata-Rata SHAP Absolut

    Untuk peringkat kepentingan yang bersih tanpa arah, gunakan bar plot. Panjang bar adalah rata-rata nilai SHAP absolut di seluruh baris yang dijelaskan.

    shap.plots.bar(shapvalues)
    

    Pakai bar plot untuk slide dan ringkasan eksekutif; pakai beeswarm ketika arah dan interaksi penting.

    Waterfall - Satu Prediksi Tunggal

    Plot waterfall menguraikan satu prediksi. Ia mulai dari nilai dasar dan menambahkan kontribusi tiap fitur hingga mencapai keluaran model untuk baris tersebut.

    shap.plots.waterfall(shapvalues[0])
    

    Inilah plot yang ditunjukkan saat seseorang bertanya "mengapa pelanggan ini ditandai?" Setiap bar adalah dorongan bertanda sebuah fitur; bar positif menaikkan risiko churn, bar negatif menurunkannya, dan semuanya dijumlahkan menjadi margin akhir.

    Force Plot - Prediksi Tunggal yang Ringkas

    Force plot menyampaikan dekomposisi satu baris yang sama seperti waterfall, tetapi sebagai visualisasi keseimbangan dorongan horizontal.

    shap.initjs()
    

    shap.plots.force(shapvalues[0])

    Force plot bersifat interaktif di notebook dan bisa ditumpuk untuk banyak baris guna memberi gambaran "force global". Untuk laporan statis, waterfall biasanya lebih jelas.

    Dependence / Scatter - Efek Fitur dan Interaksi

    Plot scatter menunjukkan bagaimana nilai SHAP sebuah fitur berubah seiring nilainya, mengungkap bentuk efek yang dipelajari dan, lewat pewarnaan, interaksi dengan fitur kedua.

    shap.plots.scatter(shapvalues[:, "monthlycharges"],
    

    color=shapvalues[:, "hascontract"])

    Tren menaik berarti tagihan lebih tinggi meningkatkan kontribusi churn. Bila awan titik terbelah menjadi dua pita berwarna, efek monthlycharges bergantung pada apakah pelanggan memiliki kontrak - sebuah interaksi.

    Decision Plot - Jalur Kumulatif

    Decision plot menggambar jalur SHAP kumulatif untuk satu atau banyak baris, dari nilai dasar ke keluaran, baris demi baris lintas fitur.

    shap.decisionplot(
    

    shapvalues.basevalues[0],

    shapvalues.values[:20],

    featurenames=list(X.columns),

    )

    Plot ini berguna untuk membandingkan beberapa kasus serupa sekaligus dan untuk mengamati di mana prediksi mulai menyimpang.

    Heatmap - Pola pada Level Instance

    Plot heatmap menata banyak instance berdampingan, dengan fitur pada sumbu vertikal dan baris pada sumbu horizontal, mewarnai tiap sel berdasarkan nilai SHAP-nya. Sebuah garis di atas menelusuri keluaran model per baris.

    shap.plots.heatmap(shapvalues[:200])
    

    Plot ini efektif untuk mengamati kluster pelanggan yang diperlakukan serupa oleh model dan untuk melihat fitur mana yang menggerakkan segmen yang berbeda. Urutkan baris berdasarkan kemiripan (clustering hierarkis bawaan) agar blok-bloknya terlihat.

    Mengagregasi Tampilan Lokal Menjadi Global

    Karena tampilan global hanyalah agregasi nilai SHAP lokal, Anda bisa menghitungnya langsung dengan NumPy saat membutuhkan laporan khusus alih-alih plot bawaan. Ini berguna untuk mencatat kepentingan dari waktu ke waktu atau untuk memberi masukan ke dasbor pemantauan.

    import numpy as np
    
    

    Rata-rata SHAP absolut per fitur = peringkat kepentingan global.

    globalimportance = (

    pd.Series(np.abs(shapvalues.values).mean(axis=0), index=X.columns)

    .sortvalues(ascending=False)

    )

    print(globalimportance)

    Rata-rata SHAP bertanda per fitur = dorongan arah rata-rata.

    meansigned = pd.Series(shapvalues.values.mean(axis=0), index=X.columns)

    print(meansigned)

    Peringkat rata-rata absolut cocok persis dengan bar plot; rata-rata bertanda memberi tahu apakah sebuah fitur, secara rata-rata, mendorong prediksi naik atau turun. Mencatat globalimportance pada tiap pelatihan ulang memberi sinyal drift yang sederhana dan model-agnostik: bila peringkat kepentingan berubah tajam antara dua proses pelatihan pada data serupa, ada sesuatu di hulu yang berubah.

    Nilai Interaksi

    Nilai interaksi SHAP memperluas atribusi dari fitur tunggal ke pasangan fitur, memecah kontribusi tiap fitur menjadi efek utama dan efek interaksi berpasangan. Untuk model pohon, ini eksak:

    interaction = explainer.shapinteractionvalues(Xtest[:500])
    

    print(interaction.shape) # (500, nfeatures, nfeatures)

    Diagonal menyimpan efek utama; entri di luar diagonal adalah kontribusi interaksi yang simetris. Nilai interaksi mahal (kuadratik terhadap jumlah fitur) sehingga hitunglah pada sampel. Ia menjawab pertanyaan seperti "apakah efek tiket dukungan bergantung pada tipe kontrak?" melampaui apa yang disiratkan scatter berwarna.

    Menjelaskan Model Regresi

    SHAP bekerja identik untuk regresi; satu-satunya perbedaan adalah nilai berada dalam satuan target dan aditivitas merekonstruksi nilai prediksi secara langsung.

    from sklearn.ensemble import RandomForestRegressor
    
    

    Pakai ulang matriks fitur yang sama; buat target kontinu: pendapatan bulanan.

    revenue = (

    20

    • 0.8 X["monthlycharges"]
    • 1.5 X["tenuremonths"] 0.1
    • rng.normal(0, 5, len(X))
    )

    Xrtrain, Xrtest, yrtrain, yrtest = traintestsplit(

    X, revenue, testsize=0.25, randomstate=0

    )

    reg = RandomForestRegressor(nestimators=300, maxdepth=8, randomstate=0)

    reg.fit(Xrtrain, yrtrain)

    regexplainer = shap.Explainer(reg, Xrtrain)

    regshap = regexplainer(Xrtest)

    shap.plots.bar(regshap)

    shap.plots.waterfall(regshap[0])

    Karena nilai dasar ditambah kontribusi sama dengan pendapatan yang diprediksi, sebuah waterfall di sini terbaca sebagai "prediksi rata-rata adalah X dolar; pelanggan ini +Y karena tagihan tinggi dan -Z karena tenure pendek."

    Menjelaskan Model Teks dan NLP

    Untuk pipeline transformer, shap.Explainer memasangkan PartitionExplainer dengan masker teks yang dibangun dari tokenizer, mengatribusikan keluaran ke rentang token. Berikut ilustrasi singkatnya.

    from transformers import pipeline
    

    import shap

    classifier = pipeline(

    "sentiment-analysis",

    model="distilbert-base-uncased-finetuned-sst-2-english",

    topk=None,

    )

    explainer = shap.Explainer(classifier)

    shaptext = explainer(["The support team was slow but the product is excellent."])

    shap.plots.text(shaptext[0])

    Plot text menyorot token yang mendorong prediksi ke tiap kelas, dengan intensitas sebanding dengan nilai SHAP. Karena token saling berkorelasi, partition masker mengelompokkannya secara hierarkis alih-alih menghilangkannya secara independen, yang memberi atribusi lebih masuk akal untuk bahasa.

    Mengoperasikan SHAP di Produksi

    Penjelasan paling bernilai ketika menjadi bagian dari sistem, bukan sekadar notebook sekali pakai. Beberapa pola membuat SHAP siap produksi.

    Hitung penjelasan saat scoring untuk model pohon, karena TreeExplainer cukup cepat sehingga menambah latensi yang dapat diabaikan. Simpan explainer bersama model agar dataset latar dan urutan fitur tetap.

    import joblib
    
    

    Simpan model dan latar representatif yang tetap bersama-sama.

    joblib.dump(

    {"model": model, "background": Xtrain.sample(200, randomstate=0)},

    "churnmodelbundle.joblib",

    )

    Saat serving, bangun explainer sekali dan pakai ulang lintas permintaan.

    bundle = joblib.load("churnmodelbundle.joblib")

    servingexplainer = shap.Explainer(bundle["model"], bundle["background"])

    def explainone(row: pd.DataFrame) -> dict:

    expl = servingexplainer(row)

    contributions = dict(zip(row.columns, expl.values[0].round(4)))

    return {

    "basevalue": float(expl.basevalues[0]),

    "contributions": contributions,

    }

    Kembalikan kontributor teratas bersama tiap prediksi di API Anda sehingga konsumen hilir bisa menampilkan "alasan" tanpa menjalankan ulang apa pun. Untuk pemantauan batch, agregasikan nilai SHAP tersimpan per fitur pada jendela bergulir dan beri peringatan ketika rata-rata kontribusi absolut fitur kunci bergeser melampaui ambang; ini menangkap data drift yang bisa terlewat oleh metrik akurasi sampai label tiba.

    Jaga pembuatan penjelasan tetap terversi: catat versi model, hash latar, dan versi pustaka SHAP pada tiap batch agar penjelasan mana pun dapat direproduksi persis.

    Jebakan Umum

    • Fitur berkorelasi. Ketika dua fitur sangat berkorelasi, model bisa memakai salah satunya, dan SHAP mungkin membagi atau menggeser kredit di antara keduanya dengan cara yang tampak tidak stabil. Kurangi redundansi sebelum menjelaskan, atau tafsirkan kelompok fitur berkorelasi bersama-sama, bukan satu per satu.
    • Atribusi bukan kausalitas. Nilai SHAP memberi tahu seberapa besar sebuah fitur memengaruhi keluaran model, bukan apa yang akan terjadi di dunia nyata bila Anda mengubah fitur itu. Sebuah fitur bisa punya nilai SHAP besar karena ia menjadi proxy bagi sesuatu yang kausal di hulu. Jangan baca plot SHAP sebagai estimasi efek kausal.
    • Pilihan latar / masker penting. Nilai dasar dan kontribusi didefinisikan relatif terhadap dataset latar. Latar berisi semua-nol, sampel acak, atau sampel berimbang kelas bisa menghasilkan penjelasan berbeda. Pakai sampel data latih yang representatif dan dokumentasikan. Untuk KernelExplainer, ringkas latar dengan shap.sample atau shap.kmeans untuk mengontrol biaya.
    • Kinerja pada data besar. KernelExplainer dan nilai interaksi berskala buruk. Jelaskan sampel representatif (beberapa ratus hingga beberapa ribu baris) alih-alih seluruh data; ringkasan global cepat konvergen. TreeExplainer cukup cepat untuk dijalankan langsung pada data uji besar.
    • Ruang probabilitas vs margin. Untuk classifier, nilai SHAP mentah biasanya dalam log-odds. Mencampur nilai ruang margin dengan intuisi ruang probabilitas menyebabkan salah baca magnitudo. Tentukan ruang yang Anda inginkan dan konsisten di sana.
    • Penjelasan usang. SHAP menjelaskan model sebagaimana dilatih. Setelah pelatihan ulang, hasilkan ulang penjelasannya; jangan pakai ulang plot lama terhadap model baru.

    Praktik Terbaik

    • Jadikan TreeExplainer default untuk ensembel pohon dan LinearExplainer untuk model linear; cadangkan KernelExplainer untuk model yang benar-benar kotak hitam.
    • Selalu lewatkan dan simpan dataset latar yang representatif, serta catat bersama penjelasan demi reproduktibilitas.
    • Pakai objek Explanation dan API shap.plots.* alih-alih array mentah; ia sudah membawa nama fitur dan nilai dasar untuk Anda.
    • Pasangkan tampilan global (beeswarm atau bar) dengan beberapa tampilan lokal (waterfall) saat presentasi ke pemangku kepentingan - salah satu tanpa yang lain tidak lengkap.
    • Periksa kewarasan aditivitas (basevalues + values.sum(axis=1) sama dengan keluaran model) setiap kali Anda menyiapkan pipeline baru.
    • Validasi bahwa fitur teratas adalah sinyal domain yang masuk akal; fitur teratas yang mengejutkan sering kali kebocoran, bukan wawasan.
    • Cache nilai SHAP untuk explainer yang mahal; nilainya deterministik untuk model dan latar yang tetap.

    Kesimpulan dan Poin Utama

    SHAP mengubah model yang buram menjadi dapat diaudit dengan mengatribusikan setiap prediksi ke fiturnya, dengan kontribusi yang dijumlahkan persis sama dengan keluaran dikurangi sebuah baseline. Besaran tunggal yang berlandaskan teori ini menggerakkan baik penjelasan lokal ("mengapa prediksi ini?") maupun global ("apa yang penting secara keseluruhan?").

    Poin utama:

    • Interpretabilitas mendukung kebutuhan kepercayaan, debugging, keadilan, dan regulasi; SHAP mengukur perilaku secara setia tetapi tidak memperbaikinya.
    • Sebuah nilai SHAP adalah kontribusi aditif relatif terhadap nilai dasar, dan kontribusinya merekonstruksi keluaran model secara persis.
    • Pakai shap.Explainer terpadu, tetapi pahami explainer khusus - TreeExplainer (cepat dan eksak untuk pohon), LinearExplainer, KernelExplainer (lambat, model-agnostik), explainer deep, serta explainer berbasis partisi untuk teks dan citra.
    • Pilih plot yang tepat: beeswarm dan bar untuk global, waterfall dan force untuk lokal, scatter untuk efek fitur dan interaksi, decision plot untuk jalur kumulatif.
    • Perhatikan jebakannya: fitur berkorelasi, atribusi versus kausalitas, pilihan latar, kinerja, dan ruang margin versus probabilitas.

    Dengan fondasi ini Anda dapat mengintegrasikan SHAP ke dalam tinjauan model, dasbor pemantauan, dan dokumentasi kepatuhan, serta menjelaskan bukan sekadar apakah sebuah model bekerja, melainkan mengapa.

    Artikel Terkait

    Tutorial XGBoost & LightGBM: Gradient Boosting Masterclass

    XGBoost & LightGBM - Masterclass Gradient Boosting Daftar Isi Pendahuluan Prasyarat Memahami Gradient Boosting [Pelatiha...

    Tutorial Lengkap Comet ML: Platform MLOps untuk Experiment Tracking dan Model Management

    Tutorial Lengkap Comet ML: Platform MLOps untuk Experiment Tracking dan Model Management Dalam dunia machine learning mo...

    Tutorial MLX: Framework Machine Learning Apple untuk Apple Silicon

    Tutorial MLX: Framework Machine Learning Apple untuk Apple Silicon MLX adalah framework machine learning open-source dar...

    Tutorial PyOD: Deteksi Anomali dan Outlier dengan Python

    Deteksi Anomali di Python dengan PyOD: Panduan Praktis Sebagian besar dataset di dunia nyata mengandung sebagian kecil d...