Python Data Science Program
📓 Abrir notebook en GitHub

Clase 087 — SHAP en profundidad: TreeExplainer, KernelExplainer, DeepExplainer

Parte: 1 — Machine Learning Clásico · Fuente: Lundberg & Lee (2017) + shap docs. ⏱️ Duración estimada: 90 min.

🎯 Objetivo

Dominar SHAP (SHapley Additive exPlanations) en profundidad: teoría de Shapley values (teoría de juegos cooperativos), TreeExplainer (rápido y exacto para árboles), KernelExplainer (model-agnostic, lento), DeepExplainer (para NN), y los plots clave: summary_plot, waterfall_plot, force_plot, dependence_plot, decision_plot.

📚 Resultados de aprendizaje

Al finalizar, el estudiante podrá:

🗺️ Temas

📖 Definiciones y características

📂 Dataset / recursos

🧪 Ejercicios

  1. TreeExplainer: XGBoost en California Housing → explainer = shap.TreeExplainer(model); shap_values = explainer(X_test).
  2. Summary plot: shap.summary_plot(shap_values, X_test). Identificar las 3 features más importantes y su dirección.
  3. Waterfall: elegir 1 muestra concreta → shap.waterfall_plot(shap_values[0]). Sumar contribuciones y verificar que reconstruye la predicción.
  4. Dependence plot: shap.dependence_plot('MedInc', shap_values.values, X_test). Detectar non-linearity.
  5. Interaction values: shap_interaction = explainer.shap_interaction_values(X_test). Identificar par de features con mayor interacción.

📝 Homework verificable

XGBoost sobre California Housing + análisis SHAP completo:

  1. Modelo entrenado.
  2. SHAP values con TreeExplainer.
  3. Summary plot + force_plot de 3 predicciones (alta, media, baja).
  4. Dependence plots para top-3 features.
  5. Reporte de 1 página: insights de qué mueve el precio (en lenguaje no técnico).

Criterio de aceptación: el reporte identifica correctamente las features dominantes; las explicaciones individuales suman al valor del modelo (±0.01).

⚠️ Errores comunes

Síntoma / mensaje Causa y cómo arreglar
KernelExplainer sobre tree → muy lento Usa el equivocado. Fix: TreeExplainer.
Asumir SHAP es causal No lo es — atribución es estadística, no causal. Fix: clase 156 para causalidad.
Interpretar SHAP sobre train data Sesgo por overfit. Fix: explicar sobre val/test.
force_plot no renderiza en Jupyter Sin shap.initjs(). Fix: ejecutar al inicio del notebook.
Features muy correlacionadas → SHAP distribuye arbitrario Limitación inherente. Fix: agrupar correlacionadas o usar clustering=.

❓ Preguntas frecuentes

❓ SHAP vs LIME?

SHAP: fundamento teórico, exacto en tree-based, determinista. LIME: model-agnostic, rápido pero inestable. SHAP gana hoy.

❓ ¿explainer(X) o explainer.shap_values(X)?

API moderna (≥ 0.40): explainer(X) devuelve Explanation object. Compatible con todos los plots. Recomendado.

❓ ¿SHAP para clasificación multiclase?

shap_values es lista/tensor con valores por clase. Plot por clase con shap.summary_plot(shap_values[class_idx]).

❓ ¿SHAP en LLM?

Existe pero costoso por la combinatoria. Para LLMs se usan otras técnicas (attention rollout, integrated gradients).

❓ ¿En producción reporto SHAP por predicción?

Sí — para decisiones high-stake (crédito, medicina), el SHAP por predicción ayuda al human-in-the-loop a entender qué pasó.

🔗 Referencias

📥 Material descargable

➡️ Siguiente clase

Clase 088 — Boosting: AdaBoost y Gradient Boosting