Cómo usar el paquete SHAP-IQ para descubrir y visualizar las interacciones de características en modelos de aprendizaje automático utilizando los índices de interacción Shapley (SII)

En este tutorial, exploramos cómo usar el paquete SHAP-IQ para descubrir y visualizar interacciones de características en modelos de aprendizaje automático utilizando índices de interacción Shapley (SII), basándose en la base de los valores tradicionales de Shapley.

Los valores de Shapley son excelentes para explicar las contribuciones de características individuales en los modelos de IA, pero no pueden capturar las interacciones de características. Las interacciones de Shapley van un paso más allá al separar los efectos individuales de las interacciones, ofreciendo ideas más profundas, como la longitud y la latitud juntos influyen en los precios de la vivienda. En este tutorial, comenzaremos con el paquete Shapiq para calcular y explorar estas interacciones Shapley para cualquier modelo. Mira el Códigos completos aquí

Instalación de las dependencias

!pip install shapiq overrides scikit-learn pandas numpy

Carga de datos y preprocesamiento

En este tutorial, utilizaremos el conjunto de datos para compartir bicicletas desde OpenML. Después de cargar los datos, los dividiremos en conjuntos de entrenamiento y prueba para prepararlos para el entrenamiento y evaluación de modelos. Mira el Códigos completos aquí

import shapiq
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
import numpy as np

# Load data
X, y = shapiq.load_bike_sharing(to_numpy=True)

# Split into training and testing
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Capacitación modelo y evaluación del desempeño

# Train model
model = RandomForestRegressor()
model.fit(X_train, y_train)

# Predict
y_pred = model.predict(X_test)

# Evaluate
mae = mean_absolute_error(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
r2 = r2_score(y_test, y_pred)

print(f"R² Score: {r2:.4f}")
print(f"Mean Absolute Error: {mae:.4f}")
print(f"Root Mean Squared Error: {rmse:.4f}")

Configurar un explicador

Configuramos un TabUreXPlainer utilizando el paquete SHAPIQ para calcular los valores de interacción Shapley basados en el método K-SII (Índice de interacción K-Order Shapley). Al especificar max_order = 4, permitimos que el explicador considere las interacciones de hasta 4 características simultáneamente, lo que permite obtener una visión más profunda sobre cómo los grupos de características afectan colectivamente las predicciones del modelo. Mira el Códigos completos aquí

# set up an explainer with k-SII interaction values up to order 4
explainer = shapiq.TabularExplainer(
    model=model,
    data=X,
    index="k-SII",
    max_order=4
)

Explicando una instancia local

Seleccionamos una instancia de prueba específica (índice 100) para generar explicaciones locales. El código imprime los valores verdaderos y predichos para este caso, seguido de un desglose de sus valores de características. Esto nos ayuda a comprender las entradas exactas pasadas al modelo y establece el contexto para interpretar las explicaciones de interacción Shapley que siguen. Mira el Códigos completos aquí

from tqdm.asyncio import tqdm
# create explanations for different orders
feature_names = list(df[0].columns)  # get the feature names
n_features = len(feature_names)

# select a local instance to be explained
instance_id = 100
x_explain = X_test[instance_id]
y_true = y_test[instance_id]
y_pred = model.predict(x_explain.reshape(1, -1))[0]
print(f"Instance {instance_id}, True Value: {y_true}, Predicted Value: {y_pred}")
for i, feature in enumerate(feature_names):
    print(f"{feature}: {x_explain[i]}")

Analizar valores de interacción

Utilizamos el método Expleter.Explan () para calcular los valores de interacción Shapley para una instancia de datos específica (x[100]) con un presupuesto de 256 evaluaciones del modelo. Esto devuelve un objeto de Valorización de Interacción, que captura cómo las características individuales y sus combinaciones influyen en la salida del modelo. Max_order = 4 significa que consideramos interacciones que involucran hasta 4 características. Mira el Códigos completos aquí

interaction_values = explainer.explain(X[100], budget=256)
# analyse interaction values
print(interaction_values)

Valores de interacción de primer orden

Para mantener las cosas simples, calculamos los valores de interacción de primer orden: valores de Shapley estándar que capturan solo contribuciones de características individuales (sin interacciones).

Al configurar max_order = 1 en TreeExPlainer, estamos diciendo:

“Dígame cuánto contribuye individualmente cada característica a la predicción, sin considerar ningún efecto de interacción”.

Estos valores se conocen como valores estándar de Shapley. Para cada característica, estima la contribución marginal promedio a la predicción en todas las permutaciones posibles de inclusión de características. Mira el Códigos completos aquí

feature_names = list(df[0].columns)
explainer = shapiq.TreeExplainer(model=model, max_order=1, index="SV")
si_order = explainer.explain(x=x_explain)
si_order

Trazando una tabla de cascada

Una tabla de cascada desglosa visualmente la predicción de un modelo en contribuciones de características individuales. Comienza desde la predicción de línea de base y agrega/resta el valor de Shapley de cada característica para alcanzar la salida predicha final.

En nuestro caso, utilizaremos la salida de TreeExPlainer con max_order = 1 (es decir, solo contribuciones individuales) para visualizar la contribución de cada característica. Mira el Códigos completos aquí

si_order.plot_waterfall(feature_names=feature_names, show=True)

En nuestro caso, el valor de referencia (es decir, la salida esperada del modelo sin ninguna información de características) es 190.717.

A medida que agregamos las contribuciones de las características individuales (valores de Shapley de Order-1), podemos observar cómo cada uno empuja la predicción hacia arriba o la baja:

  • Características como el clima y la humedad tienen una contribución positiva, aumentando la predicción por encima de la línea de base.
  • Características como la temperatura y el año tienen un fuerte impacto negativo, reduciendo la predicción en −35.4 y -45, respectivamente.

En general, la tabla de cascada nos ayuda a comprender qué características están impulsando la predicción y en qué dirección, proporcionando una visión valiosa de la toma de decisiones del modelo.


Mira el Códigos completos aquí. No dude en ver nuestro Página de Github para tutoriales, códigos y cuadernos. Además, siéntete libre de seguirnos Gorjeo Y no olvides unirte a nuestro Subreddit de 100k+ ml y suscribirse a Nuestro boletín.


Soy un graduado de ingeniería civil (2022) de Jamia Millia Islamia, Nueva Delhi, y tengo un gran interés en la ciencia de datos, especialmente las redes neuronales y su aplicación en varias áreas.