Interpretabilidad con DALEX y vip
Por qué interpretabilidad
Un modelo con AUC = 0.92 que es una caja negra te deja sin defensa frente a tres situaciones inevitables:
- Auditoría o regulador te pide explicar por qué el modelo niega un crédito.
- Equipo médico quiere saber qué características del paciente justifican una recomendación.
- Tu jefe pregunta “¿qué predice este modelo, exactamente?” en lenguaje natural.
Modelos lineales son intrínsecamente interpretables: el coeficiente te dice cuánto cambia Y por unidad de X. Modelos no lineales (random forest, gradient boosting, redes neuronales) no, ganan precisión a cambio de opacidad.
Interpretabilidad post-hoc son técnicas que explican un modelo ya entrenado sin convertirlo en lineal. No es magia: tiene límites reales que conviene conocer.
vip: importancia de variables
La pregunta más simple: “¿qué variables son más importantes para el modelo?”. El paquete vip (Variable Importance Plots) responde:
library(vip)
# Sobre un workflow ya ajustado
extract_fit_parsnip(wf_fit) |>
vip(num_features = 15)Devuelve un gráfico de barras ordenadas por importancia. Útil para una vista panorámica.
Métodos de importancia (configurables con method =):
"model": el método nativo del modelo (impurity en árboles, |coef| en lineales). Rápido pero sesgado en árboles."permute": permutation importance: mide cuánto degrada la métrica al barajar la variable. Más robusto, computacionalmente caro."firm": feature importance robust to multicollinearity (cuando hay variables correlacionadas).
Para usar permutation:
extract_fit_parsnip(wf_fit) |>
vi(method = "permute",
train = train,
target = "outcome",
metric = "auc",
pred_wrapper = predict)Permutation importance: el método robusto
La idea: si una variable es importante, barajar sus valores aleatoriamente debería degradar la métrica del modelo. Cuanto más degrada, más importante es.
Ventajas frente al método nativo:
- Independiente del modelo: funciona con cualquier modelo entrenado.
- No sesgado hacia variables continuas o de alta cardinalidad (el método de impurity en árboles tiene este sesgo).
- Mide importancia real, no estructural, refleja cuánto pierde el modelo cuando esa variable no es informativa.
Desventaja: cuesta computación. Cada variable requiere re-evaluar el modelo con esa variable permutada.
Implementación robusta en DALEX:
library(DALEX)
explainer <- explain(
model = extract_fit_engine(wf_fit),
data = train |> select(-outcome),
y = train$outcome,
label = "Random Forest"
)
importance <- model_parts(explainer)
plot(importance)DALEX calcula permutation importance con muestreo (no permuta cada variable solo una vez), dando IC. Si la barra de importancia incluye cero, la variable no aporta significativamente.
Partial Dependence Plots (PDP)
Importancia te dice qué variables importan. PDP te dice cómo influye cada una.
Un PDP para la variable X muestra: “si fijara X en cada valor del rango y promediara las predicciones sobre todos los datos, ¿qué obtendría?”. Da una visión marginal del efecto de X.
library(DALEX)
pdp <- model_profile(explainer, variables = "age")
plot(pdp)Lectura: si el PDP de age sube con la edad, el modelo predice mayor probabilidad de outcome con mayor edad, controlando por las demás variables en promedio.
Limitación seria del PDP: promedia sobre todos los individuos. Si el efecto de age depende de otra variable (interacción), el PDP la oculta. Una variable puede tener efecto positivo en jóvenes y negativo en mayores, el PDP muestra una curva plana y miente por agregación.
ICE: lo que esconde el PDP
Individual Conditional Expectation muestra una curva por individuo en lugar de la media:
ice <- model_profile(explainer, variables = "age", type = "conditional")
plot(ice)Si todas las curvas ICE son paralelas y suben juntas, el PDP es honesto. Si hay curvas en direcciones opuestas, hay interacción que el PDP esconde.
Regla práctica: siempre acompaña PDP con ICE. Si las curvas ICE divergen, ten cuidado al interpretar el efecto marginal.
SHAP values: el estándar moderno
SHAP (SHapley Additive exPlanations) descompone cada predicción individual en contribuciones por variable, basándose en valores de Shapley de teoría de juegos. La idea: cada variable es un “jugador” y SHAP asigna crédito justo a cada una por la predicción final.
Ventajas:
- Explicación a nivel individuo: “para este paciente concreto, el modelo predijo X porque…”.
- Aditividad: las contribuciones suman al diferencial entre predicción y media (de las predicciones).
- Estándar de facto en explicabilidad, papers, regulación (GDPR’s “right to explanation”), comunicación con audiencia técnica.
En R:
library(DALEX)
# SHAP para una observación concreta
nueva_obs <- train[1, ]
shap_obs <- predict_parts(explainer, new_observation = nueva_obs, type = "shap")
plot(shap_obs)Devuelve un gráfico tipo waterfall mostrando cómo cada variable empuja la predicción de la media hacia el valor predicho final.
Trampa de SHAP: con muchas variables, calcular Shapley exactos es O(2ⁿ). Las implementaciones (TreeSHAP, KernelSHAP) aproximan. La aproximación es razonable pero no exacta.
Los límites honestos de la interpretación post-hoc
Esta sección la salta la mayoría, pero es la más importante.
La interpretación post-hoc explica el modelo, NO la realidad subyacente. Tres limitaciones que conviene comunicar al consumir o reportar estos análisis:
No es causalidad. PDP, SHAP o permutation importance te dicen qué el modelo usa, no qué causa el outcome. Un modelo puede dar alta importancia a una variable que es solo un proxy de la causa real. “Tomar paracetamol” puede predecir enfermedad porque la gente con dolores la toma, el modelo es válido predictivamente pero no causalmente.
Depende del modelo. PDP de la misma variable en un random forest y en un XGBoost puede dar curvas distintas, porque cada modelo aprendió relaciones distintas. No hay un “PDP verdadero”.
Correlación entre features distorsiona. Permutation importance permuta una variable independientemente de las demás. Si la variable está correlacionada con otras, la permutación crea combinaciones imposibles (paciente con altura 1.50 y peso 200 kg, por ejemplo), el modelo predice mal y la importancia se infla artificialmente. Para datos con correlaciones, usa conditional permutation o grouped importance.
Comunicar interpretabilidad sin estas advertencias es vender humo. Comunicarla con los límites es lo que la convierte en herramienta útil de comunicación, no en cargo cult.
Trampas habituales
- Usar importancia nativa de árboles (
method = "model") sin entender el sesgo. Enrand_forest, la importancia por impurity favorece variables continuas o de alta cardinalidad. Para reporte público, usamethod = "permute". - PDP plano = “sin efecto”. Puede ser falso si hay interacción. Comprueba con ICE antes de concluir.
- SHAP a una sola observación interpretado como “explicación general”. El SHAP de una observación es específico de ella. La importancia “global” se calcula promediando los valores absolutos de SHAP sobre muchas observaciones.
- Reportar interpretación de un modelo malo. Si el modelo tiene AUC = 0.55, su importancia de variables refleja ruido, no información. Interpretabilidad solo tiene sentido sobre modelos que funcionan bien.
En la siguiente entrega
Has cubierto todas las piezas: división, preprocesado, modelos, workflows, CV, tuning, métricas, comparación, interpretación. El último tutorial las junta en un caso completo end-to-end sobre un dataset realista, con todas las decisiones documentadas. Es el cierre.