Gráficos de Dependencia Parcial y Curvas ICE: Descubre cómo tu modelo realmente usa cada característica
1. El problema: tu modelo funciona, pero ¿por qué?
La última vez, el equipo comparó LIME y SHAP para explicar la denegación individual de Maria — sopesando la velocidad frente a la consistencia. El Sr. Owens vio cómo ambas herramientas explicaban por qué el modelo le dijo que no a Maria específicamente, pero luego hizo clic en la columna Income y planteó una pregunta más amplia: «Puedo ver por qué el modelo le dijo que no a Maria. Pero, ¿cómo afectan los ingresos, en general, a las probabilidades de aprobación de todos nuestros solicitantes? ¿La relación sube? ¿Se nivela? Quiero ver la forma de la relación, no solo el número de una persona».
Podrías mostrarle un gráfico de barras de importancia de características. Income ocupa el primer lugar — excelente. Pero eso aún no responde a su pregunta. ¿La probabilidad de aprobación aumenta linealmente con los ingresos? ¿Se nivela después de algún umbral? ¿Podría el modelo realmente tratar unos ingresos extremadamente altos como una señal de riesgo que perjudica las probabilidades de alguien?
La importancia de características te dice cuáles características importan, no cómo importan. Para ver dentro de la caja negra, necesitamos una forma de visualizar la relación entre una única característica y la predicción del modelo. Los gráficos de dependencia parcial (PDP) nos brindan eso. Nos permiten preguntar: si cambio esta única característica, manteniendo todo lo demás constante, ¿cómo cambia la predicción?
2. Gráficos de Dependencia Parcial: la idea principal
Piensa en un Gráfico de Dependencia Parcial (PDP) como una forma de mostrar el comportamiento promedio de una sola característica. Digamos que tienes 1,000 filas de datos. Para ver cómo ‘Ingreso’ afecta a ‘Precio de la vivienda’, realizas un pequeño experimento:
- Elige un valor de ingreso específico — por ejemplo, $50,000.
- Recorre cada fila del conjunto de datos y establece el ingreso en $50,000, dejando la ubicación, la edad y el resto intactos.
- Pide al modelo que prediga el precio de la vivienda para cada fila modificada.
- Promedia esas predicciones. Ese único número es un punto en el gráfico.
- Repite para $60,000, $70,000, y así sucesivamente.
Conecta los puntos y obtendrás una curva. Este es el efecto marginal del ingreso en el resultado predicho — la lógica del modelo colapsada en una dimensión.
La dependencia parcial de la predicción del modelo en un subconjunto de características se define (Friedman, 2001) como:
En términos simples: mantén las características de interés () en valores fijos, promedia la predicción del modelo sobre la distribución observada de todas las demás características (), y ese promedio es un punto en la curva del PDP. En la práctica, no podemos integrar analíticamente, por lo que lo estimamos mediante el método de Monte Carlo — simplemente promediamos sobre los datos que ya tenemos:
Una curva ICE para una sola fila es simplemente evaluada en cada valor de la cuadrícula de — sin el paso de promediar.
| En términos simples | Símbolo estadístico | Equivalente en Python |
|---|---|---|
| Las características que estamos recorriendo (mantenidas en valores de cuadrícula) | (el subconjunto ) | features=['MedInc'] |
| Todas las demás características (mantenidas en sus valores originales) | (el conjunto complementario) | Todas las columnas en X excepto MedInc |
| La función de predicción del modelo entrenado | model.predict | |
| Dependencia parcial (predicción promedio en un dado) | El valor de y en la curva del PDP | |
| Distribución de las características “demás” | Aproximada por la distribución empírica de X | |
| Estimación de Monte Carlo (promedio sobre filas de datos) | Calculado internamente por PartialDependenceDisplay.from_estimator | |
| La predicción de una fila a medida que varía (una curva ICE) | para un fijo | Una línea en el gráfico kind='both' |
Distinción clave: El PDP promedia sobre ; la curva ICE no. Por eso el PDP es una línea suave, mientras que ICE es un enredo de trayectorias individuales.
3. Código: cálculo y trazado de la dependencia parcial
Apliquemos esto al conjunto de datos California Housing. Entrenaremos un Random Forest —un modelo clásico de “caja negra”— y luego usaremos Scikit-Learn para visualizar lo que aprendió sobre el ingreso.
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import RandomForestRegressor
from sklearn.inspection import PartialDependenceDisplay
# 1. Load data
data = fetch_california_housing()
X, y = data.data, data.target
feature_names = data.feature_names
# 2. Train a black-box model
model = RandomForestRegressor(n_estimators=50, random_state=42)
model.fit(X, y)
# 3. Compute and plot PDP for 'MedInc' (Median Income)
fig, ax = plt.subplots(figsize=(8, 6))
display = PartialDependenceDisplay.from_estimator(
model, X, features=['MedInc'],
feature_names=feature_names,
ax=ax
)
plt.title("Partial Dependence of House Value on Median Income")
plt.show()
fetch_california_housing()— Carga el conjunto de datos California Housing incluido con scikit-learn. Devuelve un objetoBunchcon.data(la matriz de características, ~20,600 filas × 8 características),.target(valores medianos de las viviendas) y.feature_names(etiquetas de columnas como'MedInc','HouseAge','AveRooms', etc.).RandomForestRegressor(n_estimators=50, random_state=42)— Crea (pero aún no entrena) un regresor de bosque aleatorio con 50 árboles de decisión.random_state=42fija la semilla del bootstrapping para que el bosque sea idéntico en cada ejecución.model.fit(X, y)— Entrena el bosque con el conjunto de datos completo (no hay división train/test aquí porque nos interesa interpretar la lógica aprendida por el modelo, no evaluar la generalización).PartialDependenceDisplay.from_estimator(model, X, features=['MedInc'], ...)— La llamada clave. Internamente construye una cuadrícula de valores deMedInc(por ejemplo, 0.5, 1.0, 1.5, … hasta ~15), reemplaza la columnaMedIncen cada fila deXcon cada valor de la cuadrícula, le pide al modelo que prediga, y promedia las predicciones en todas las filas. La curva resultante se dibuja en el eje proporcionado.feature_names=feature_names— Pasa los nombres de las columnas para que el eje x del gráfico se etiquete como'MedInc'en lugar de'Feature 0'.ax=ax— Dirige el gráfico al eje de Matplotlib que creamos conplt.subplots, para que se dibuje dentro de nuestra figura en lugar de crear una nueva.display = ...— El valor de retorno (un objetoPartialDependenceDisplay) se almacena endisplaypero nunca se usa después; el gráfico ya está dibujado enax, por lo que la variable no es necesaria. Podría usarse para llamardisplay.plot()nuevamente más adelante si se desea.
4. El significado real de la curva: interpretación de la dependencia parcial
Observa la gráfica que acabamos de generar. El ingreso mediano se ubica en el eje x; el valor de vivienda predicho por el modelo se ubica en el eje y.
La curva probablemente asciende pronunciadamente al principio y luego se nivela. Así, a medida que el ingreso aumenta de 2 a 6, el precio predicho se dispara significativamente. A partir de 8, el ingreso adicional apenas mueve la predicción.
- Una curva ascendente pronunciada significa que la característica tiene un fuerte efecto positivo.
- Una línea plana significa que la característica no cambia la predicción en absoluto (en promedio).
- Una curva descendente significa que la característica tiene un efecto negativo.
5. El inconveniente: la dependencia parcial asume que las características son independientes
Aquí está la parte complicada de PDP: asume que tus características no se mueven juntas. En la práctica, a menudo lo hacen. En nuestros datos de viviendas, ‘Habitaciones promedio’ y ‘Dormitorios promedio’ están estrechamente relacionadas.
Cuando PDP aumenta ‘Habitaciones promedio’ manteniendo ‘Dormitorios promedio’ bajos, puede crear una casa “Frankenstein”: una mansión de 10 habitaciones con 0.5 dormitorios. El modelo nunca ha visto una casa así. Su predicción podría carecer de sentido. Antes de confiar en un PDP, siempre verifica si tus características están fuertemente correlacionadas.
import pandas as pd
# Check correlation between rooms and bedrooms
df = pd.DataFrame(X, columns=feature_names)
print(f"Correlation: {df['AveRooms'].corr(df['AveBedrms']):.2f}")
# A correlation of 0.85 means these features are tightly linked!
pd.DataFrame(X, columns=feature_names)— Envuelve el arreglo de NumPyXen un DataFrame de pandas con nombres de columnas legibles por humanos a partir defeature_names. Esto nos permite seleccionar columnas por nombre (p. ej.,df['AveRooms']) en lugar de por índice entero.df['AveRooms'].corr(df['AveBedrms'])— Calcula el coeficiente de correlación de Pearson entre las columnasAveRoomsyAveBedrms. Devuelve un valor de punto flotante entre −1 y 1: 1 significa perfectamente correlacionadas positivamente, 0 significa que no hay relación lineal, −1 significa perfectamente correlacionadas negativamente.:.2f— Formatea la correlación a dos decimales (p. ej.,0.85).- La salida (≈ 0.85) confirma que estas dos características se mueven juntas estrechamente — una bandera roja para PDP, ya que el algoritmo creará combinaciones irreales de ambas cuando recorre una mientras mantiene la otra constante.
6. Curvas de Expectativa Condicional Individual (ICE): una fila a la vez
El PDP muestra el efecto promedio. Pero los promedios pueden engañar. Imagina una característica que ayuda a la mitad de tus filas y perjudica a la otra mitad. El promedio se aplana hasta formar una línea recta, y la característica parece inerte.
Las curvas de Expectación Condicional Individual (ICE) abordan esto. En lugar de una sola línea promediada, un gráfico ICE dibuja una línea para cada una de las filas de tus datos. Puedes ver cómo se mueve la predicción de una casa específica a medida que recorres el valor de la característica.
7. Código: cálculo y trazado de las curvas ICE
Misma función de Scikit-Learn, solo con un parámetro diferente. Cambia kind a 'both' y obtendrás las líneas individuales y la línea PDP promedio juntas en una sola vista.
fig, ax = plt.subplots(figsize=(8, 6))
# 'kind="both"' plots both individual (ICE) and average (PDP) lines
PartialDependenceDisplay.from_estimator(
model, X, features=['MedInc'],
feature_names=feature_names,
kind='both',
subsample=50, # Plot 50 individual lines to keep it clean
ax=ax
)
plt.title("ICE Curves and PDP for Median Income")
plt.show()
kind='both'— Le indica a scikit-learn que superponga tanto la línea PDP promedio (generalmente mostrada en un color distinto o con un trazo más grueso) como las líneas ICE individuales (una por fila) en los mismos ejes. Otros valores válidos:'individual'(solo líneas ICE) o'average'(solo PDP, el valor predeterminado).subsample=50— Selecciona aleatoriamente 50 filas deXpara dibujar las líneas ICE, en lugar de todas las ~20,600. Sin submuestreo, el gráfico sería un enredo ilegible de miles de líneas superpuestas; 50 mantiene el gráfico visualmente manejable y aún muestra la dispersión.features=['MedInc']— Igual que antes: la característica cuyo efecto estamos visualizando. Las líneas ICE muestran cómo cambia la predicción de cada fila individual a medida queMedIncse recorre de bajo a alto, mientras que las otras características de la fila se mantienen en sus valores originales.ax=ax— Renderiza el gráfico en nuestro eje de Matplotlib precreado.
8. Las curvas ICE revelan interacciones: cuando las características trabajan juntas
Aquí está el beneficio. Las líneas ICE paralelas indican que la característica afecta a cada fila de la misma manera. Cuando las líneas se cruzan o divergen, has encontrado una interacción.
Por ejemplo, ‘Ingreso’ podría tener un gran efecto en el precio de la vivienda en San Francisco, pero apenas importar en una zona rural. Las curvas ICE de la ciudad serían pronunciadas; las rurales, planas. El PDP simplemente promedia ambos casos y oculta la diferencia. Las curvas ICE te muestran esta heterogeneidad (una palabra elegante para “diferencias”) que el PDP no detecta.
9. Comparación de PDP e ICE: cuándo usar cada uno
¿Qué significa esto en la práctica?
- Usa PDP cuando necesites explicar la tendencia general a un stakeholder. Es claro y fácil de leer.
- Usa ICE cuando estés depurando el modelo. Muestra si el modelo se comporta de manera inconsistente o si hay interacciones ocultas que pasaste por alto.
Casi siempre los grafico juntos. El PDP te da la historia principal. La dispersión de las curvas ICE te indica cuánto confiar en esa historia para cualquier caso individual.
PDP / ICE vs. gráficos de dependencia SHAP
Tanto los gráficos de dependencia PDP/ICE como los de SHAP visualizan cómo se relaciona una sola característica con la salida del modelo, pero responden a preguntas sutilmente diferentes y conllevan distintos compromisos.
| Aspecto | Curvas PDP / ICE | Gráficos de dependencia SHAP |
|---|---|---|
| Lo que muestra | Valor predicho por el modelo (eje y) vs. valor de la característica (eje x) | Valor SHAP para esa característica (eje y) vs. valor de la característica (eje x) |
| Pregunta que responde | “¿Cómo cambia la predicción a medida que cambia esta característica?” | “¿Cuánto empujó esta característica cada predicción individual?” |
| Granularidad | PDP = promedio; ICE = líneas por fila | Cada punto es una predicción — sin promedios |
| Interacciones | El abanico/cruce de ICE insinúa interacciones, pero no identifica qué característica | Colorea automáticamente los puntos según la segunda característica con mayor interacción |
| Características correlacionadas | Crea filas irreales tipo “Frankenstein” (variar una, mantener la otra) — puede inducir a error | Cada punto es una predicción real a partir de datos reales — sin combinaciones sintéticas |
| Velocidad | Rápido; integrado en scikit-learn, sin bibliotecas adicionales | Requiere calcular primero los valores SHAP (rápido con TreeExplainer, más lento con KernelExplainer) |
| Legibilidad para los stakeholders | Alta — un gráfico de líneas simple es intuitivo | Media — los diagramas de dispersión con gradientes de color necesitan explicación |
Cuándo usar PDP / ICE
- ✅ Quieres ver la forma general del efecto de una característica (lineal, saturante, no monótono) — la pregunta del “cómo”.
- ✅ Estás explicándoselo a una parte interesada no técnica que quiere un gráfico limpio de una sola línea.
- ✅ Quieres revisar si hay heterogeneidad (ICE): ¿las diferentes filas responden de manera distinta a la misma característica?
- ✅ No tienes calculados los valores SHAP y quieres una visualización rápida sin dependencias adicionales.
Cuándo usar los gráficos de dependencia SHAP
- ✅ Ya calculaste los valores SHAP y quieres visualizarlos.
- ✅ Quieres resaltar interacciones automáticamente — la codificación de color ubica la segunda característica que más importa.
- ✅ Te preocupan las características correlacionadas y quieres evitar por completo el problema del “Frankenstein”.
- ✅ Quieres conectar la tendencia global con las predicciones individuales — cada punto está vinculado a la descomposición SHAP de una fila específica.
En resumen
Utiliza PDP/ICE cuando quieras ver la forma del efecto de una característica (la pregunta de “¿cómo se curva?”). Utiliza los gráficos de dependencia SHAP cuando quieras ver cómo una característica impulsa las predicciones individuales y detectar interacciones (la pregunta de “quién y por qué”). Son complementarios — PDP muestra el bosque, la dependencia SHAP muestra tanto el bosque como los árboles, con cada árbol etiquetado según lo que es.
10. Errores comunes y cómo evitarlos
- Extrapolación: No confíes en los extremos del gráfico. Si tus datos solo contienen ingresos entre 2 y 10, la predicción del modelo para un ingreso de 50 es una suposición — nada más.
- La trampa de la curva plana: Un PDP plano no siempre significa que una característica sea inútil. Puede importar muchísimo, pero solo cuando se combina con otra característica. Eso es una interacción, y las curvas ICE te ayudan a detectarla.
- Correlación: Como se mencionó, cuando las características están altamente correlacionadas, la lógica de “mantener todo lo demás constante” deja de funcionar.
11. Integrando todo: un ejemplo del mundo real
Un último ejemplo: ‘Antigüedad de la casa’ y ‘Ocupación promedio’.
fig, ax = plt.subplots(1, 2, figsize=(12, 5))
PartialDependenceDisplay.from_estimator(model, X, ['HouseAge'], kind='both', subsample=50, ax=ax[0])
PartialDependenceDisplay.from_estimator(model, X, ['AveOccup'], kind='both', subsample=50, ax=ax[1])
plt.tight_layout()
plt.show()
plt.subplots(1, 2, figsize=(12, 5))— Crea una cuadrícula de 1×2 subgráficas (dos paneles lado a lado).figes la figura general;axes ahora un arreglo de dos objetos de ejes (ax[0]yax[1]).['HouseAge']and['AveOccup']— Cada llamada especifica una característica diferente para la cual calcular el PDP/ICE. Cuando la característica se pasa como un argumento posicional (no a través defeatures=), scikit-learn la infiere correctamente; el mismo comportamiento, solo un estilo de llamada más compacto.ax=ax[0]/ax=ax[1]— Dirige la primera gráfica de PDP/ICE al panel izquierdo y la segunda al panel derecho.plt.tight_layout()— Ajusta el espaciado entre las dos subgráficas para evitar que las etiquetas de los ejes y los títulos se superpongan. Siempre llama a esto antes deplt.show()al renderizar múltiples paneles.
Las líneas de ‘HouseAge’ se mantienen en su mayoría planas. En promedio, el modelo no depende mucho de la antigüedad de la casa. La gráfica de ‘AveOccup’ muestra una fuerte caída en su lugar. A medida que la ocupación aumenta, el valor predicho disminuye: las viviendas con alta ocupación suelen ser alquileres pequeños y abarrotados, lo que probablemente explica la caída.
12. Próximos pasos: de la interpretación a la explicación
Ahora puedes ver la “forma” de la lógica de tu modelo. No solo que una característica es importante, sino cómo afecta el resultado.
- PDP te ofrece la vista promedio del bosque.
- ICE te ofrece la vista individual del árbol.
Así, el equipo tiene tres herramientas, cada una respondiendo a una pregunta diferente. Los valores SHAP explican una sola predicción. LIME ofrece una aproximación rápida. Las curvas PDP e ICE muestran la forma general del efecto de una característica. El Sr. Owens mira la creciente colección de gráficos y dice: “Esto es exhaustivo, pero necesito una explicación que realmente pueda darle a Maria y al regulador. No tres gráficos diferentes. Una sola historia.” Eso es lo que aborda el artículo final: convertir estas herramientas en una sola explicación legible para humanos.
Comprueba tu comprensión
Las preguntas a continuación avanzan desde el recuerdo simple hasta el diseño abierto, siguiendo aproximadamente la Taxonomía de Bloom.
Recordar ¿Cuáles son los cinco pasos que describe el artículo para calcular manualmente un punto en un Gráfico de Dependencia Parcial (PDP)?
Comprender Con sus propias palabras, explique el escenario de “la mitad de las personas ayudadas, la mitad perjudicadas” que el artículo utiliza para mostrar por qué un PDP plano puede ser engañoso, y cómo las curvas ICE revelan lo que el PDP oculta en ese caso.
Aplicar Usando las reglas de interpretación del artículo (pendiente pronunciada hacia arriba = fuerte efecto positivo, plano = sin efecto, hacia abajo = efecto negativo), ¿qué concluiría sobre una característica cuya curva PDP se eleva pronunciadamente desde x=0 hasta x=5 y luego se mantiene completamente plana desde x=5 hasta x=10?
Analizar El artículo explica que el PDP crea filas “Frankenstein” cuando las características están correlacionadas (una casa de 10 habitaciones con 0.5 dormitorios). Explique paso a paso por qué este problema específico no ocurre cuando se traza la curva ICE para una sola fila variando solo una característica — ¿se elimina el problema de correlación, o sigue aplicándose a los valores “modificados” dentro del barrido de esa única fila?
Evaluar
El artículo recomienda verificar la correlación de las características antes de confiar en un PDP (usando .corr()) pero no especifica un umbral para cuándo la correlación es “demasiado alta para confiar en ella”. Critique el ejemplo del artículo (AveRooms/AveBedrms en 0.85) — ¿qué haría usted de manera diferente con la interpretación del PDP una vez que sabe que dos características están tan correlacionadas, además de simplemente notar el número?
Crear
Diseñe una investigación de PDP/ICE para un nuevo escenario: un modelo de reingresos hospitalarios en el que sospecha que medication_count importa de manera diferente para los pacientes menores de 65 frente a los mayores de 65. Describa cómo usaría las curvas ICE (no solo el PDP promedio) para probar esta hipótesis específica y qué patrón en las líneas ICE lo confirmaría.
Artículos relacionados
- Valores SHAP: Por qué su modelo predijo eso
- LIME vs SHAP: Elegir el traductor adecuado para usted
- ¿Por qué el modelo dijo que no? Explicando las decisiones de caja negra al negocio
Referencias y lecturas adicionales
- Friedman, J. H. (2001). “Greedy Function Approximation: A Gradient Boosting Machine.” Annals of Statistics, 29(5), 1189–1232. https://projecteuclid.org/euclid.aos/1013203451 — El artículo fundamental que introdujo las Gráficas de Dependencia Parcial (Partial Dependence Plots) como parte del marco de trabajo de Gradient Boosting Machine. La definición de PDP y el procedimiento de estimación de Monte Carlo utilizados por
sklearn.inspectionse originan aquí. - Documentación del módulo de inspección de
scikit-learn. https://scikit-learn.org/stable/modules/partial_dependence.html — Referencia oficial de la API paraPartialDependenceDisplay,partial_dependence, y el parámetrokindque alterna entre gráficos de PDP, ICE y combinados. - Kaggle: competencia “House Prices: Advanced Regression Techniques”. https://www.kaggle.com/c/house-prices-advanced-regression-techniques — Un conjunto de datos inmobiliarios del mundo real con 79 características (metros cuadrados, vecindario, año de construcción, etc.) donde las curvas de PDP e ICE se utilizan ampliamente en los notebooks con mejores puntuaciones para visualizar cómo cada característica influye en el precio de venta predicho: un excelente entorno de pruebas para practicar las técnicas de este artículo.
Esta traducción fue generada automáticamente y puede contener errores. Si el idioma inglés es tu preferencia, puedes leer el artículo original en inglés .
«Aplica lo que aprendiste» es para suscriptores Supporter e Insider.
Suscríbete para desbloquear los ejercicios de este artículo.
Ver planesArtículos relacionados
- Explicabilidad En revisión
¿Por qué el modelo dijo que no? Explicando decisiones de caja negra a tu jefe sin matemáticas
Aprende a traducir las decisiones de modelos de caja negra en explicaciones listas para los stakeholders utilizando gráficos de fuerza y de resumen de SHAP, generando confianza sin matemáticas complejas.
- Explicabilidad En revisión
Referencia: Técnicas de explicabilidad de modelos
Una referencia comparativa que aplica PDP, ICE, importancia de permutación, LIME y SHAP al mismo modelo para que puedas ver qué te indica cada uno y en qué divergen.
- Aprendizaje Automático En revisión
Curvas de aprendizaje: Cómo leer la mente de tu modelo para corregir el sobreajuste y el subajuste
Aprende a leer las curvas de aprendizaje para diagnosticar el sobreajuste y el subajuste, distinguir entre el alto sesgo y la alta varianza, y elegir la solución correcta para potenciar tu modelo.
- Aprendizaje Automático En revisión
P02: Cómo funciona realmente el descenso de gradiente — y las variantes que lo hacen práctico
Aprende cómo el descenso de gradiente minimiza el error del modelo al sentir la pendiente de tu función de pérdida, y compara Batch, SGD, Mini-Batch y Adam con Python puro.
¿Buscas otra cosa?
Busca en todos los artículos por título, resumen o tema.