“Al igual que muchos otros métodos de interpretación basados en permutaciones, el método de valores de Shapley adolece de la inclusión de instancias de datos poco realistas cuando las características están correlacionadas. Para simular que falta un valor de característica en una coalición, marginamos la característica… Cuando las características son dependientes, entonces podemos muestrear valores de características que no tienen sentido para esta instancia”. Libro de ML interpretable.
Los valores SHAP (explicaciones aditivas de SHApley) están diseñados para asignar de manera justa la contribución de cada característica a la predicción realizada por un modelo de aprendizaje automático, basándose en el concepto de valores de Shapley de la teoría de juegos cooperativos. El marco de valores de Shapley tiene varias propiedades teóricas deseables y, en principio, puede manejar cualquier modelo predictivo. Sin embargo, los valores SHAP pueden ser potencialmente engañosos, especialmente cuando se utiliza el método KernelSHAP para la aproximación. Cuando los predictores están correlacionados, estas aproximaciones pueden ser imprecisas e incluso tener el signo opuesto.
En esta publicación del blog, demostraré cómo los valores SHAP originales pueden diferir significativamente de las aproximaciones realizadas por el Marco SHAPespecialmente KernalSHAP y analicemos las razones detrás de estas discrepancias.
Consideremos un escenario en el que pretendemos predecir la tasa de rotación de contratos de alquiler en un edificio de oficinas, en función de dos factores clave: la tasa de ocupación y la tasa de problemas notificados.
La tasa de ocupación afecta significativamente la tasa de abandono. Por ejemplo, si la tasa de ocupación es demasiado baja, los inquilinos pueden irse debido a que la oficina está infrautilizada. Por el contrario, si la tasa de ocupación es demasiado alta, los inquilinos pueden irse debido al hacinamiento y buscar mejores opciones en otro lugar.
Además, supongamos que la tasa de problemas reportados está altamente correlacionada con la tasa de ocupación, específicamente que la tasa de problemas reportados es el cuadrado de la tasa de ocupación.
Definimos la función de tasa de abandono de la siguiente manera:
Esta función con respecto a las dos variables se puede representar mediante las siguientes ilustraciones:
Valores SHAP calculados mediante Kernel SHAP
Ahora usaremos el siguiente código para calcular los valores SHAP de los predictores:
# Define the dataframe
churn_df=pd.DataFrame(
{
"occupancy_rate":occupancy_rates,
"reported_problem_rate": reported_problem_rates,
"churn_rate":churn_rates,
}
)
X=churn_df.drop(["churn_rate"],axis=1)
y=churn_df["churn_rate"]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = 42)
# append one speical point
X_test=pd.concat(objs=[X_test, pd.DataFrame({"occupancy_rate":[0.8], "reported_problem_rate":[0.64]})])
# Define the prediction
def predict_fn(data):
occupancy_rates = data[:, 0]
reported_problem_rates = data[:, 1]
churn_rate= C_base +C_churn*(C_occ* occupancy_rates-reported_problem_rates-0.6)**2 +C_problem*reported_problem_rates
return churn_rate
# Create the SHAP KernelExplainer using the correct prediction function
background_data = shap.sample(X_train,100)
explainer = shap.KernelExplainer(predict_fn, background_data)
shap_values = explainer(X_test)
El código anterior realiza las siguientes tareas:
- Preparación de datos: un marco de datos llamado
churn_dfse crea con columnasoccupancy_rate,reported_problem_rateychurn_rate. Variables y objetivo (churn_rate) se crean a partir de y los datos se dividen en conjuntos de entrenamiento y prueba, con un 80 % para entrenamiento y un 20 % para prueba. Tenga en cuenta que un punto de datos especial con datos específicosoccupancy_rateyreported_problem_rateSe añaden valores al conjunto de prueba.X_test. - Definición de función de predicción: Una función
predict_fnSe define para calcular la tasa de abandono utilizando una fórmula específica que involucra constantes predefinidas. - Análisis SHAP: Un análisis SHAP
KernelExplainerse inicializa utilizando la función de predicción ybackground_datamuestras deX_train.Valores SHAP paraX_testse calculan utilizando elexplainer.
A continuación, puede ver un gráfico de barras SHAP de resumen, que representa los valores SHAP promedio para X_test :
En particular, vemos que en el punto de datos (0,8, 0,64), los valores SHAP de las dos características son 0,10 y -0,03, ilustrados por el siguiente gráfico de fuerza:
Valores SHAP por definición original
Retrocedamos un paso y calculemos los valores SHAP exactos paso a paso según su definición original. La fórmula general para los valores SHAP viene dada por:
donde: S es un subconjunto de todos los índices de características excluyendo i, |S| es el tamaño del subconjunto S, M es el número total de características, f(XS∪{xi}) es la función evaluada con las características en S con xi presente, mientras que f(XS) es la función evaluada con la característica en S con xi ausente.
Ahora, calculemos los valores SHAP para dos características: tasa de ocupación (indicada como x1x_1x1) y tasa de problemas informados (indicada como x2x_2x2) en el punto de datos (0,8, 0,64). Recordemos que x1x_1x1 y x2x_2x2 están relacionados por x_1 = x_2².
Tenemos el valor SHAP para la tasa de ocupación en el punto de datos:
y, de manera similar, para la característica tasa de problemas reportados:
Primero, calculemos el valor SHAP para la tasa de ocupación en el punto de datos:
- El primer término es la expectativa del resultado del modelo cuando X1 se fija en 0,8 y X2 se promedia a lo largo de su distribución. Dada la relación xx_1 = x_2², esta expectativa lleva al resultado del modelo en el punto específico (0,8, 0,64).
- El segundo término es la expectativa incondicional del resultado del modelo, donde tanto X1 como X2 se promedian sobre sus distribuciones. Esto se puede calcular promediando los resultados sobre todos los puntos de datos en el conjunto de datos de fondo.
- El tercer término es la salida del modelo en el punto específico (0,8, 0,64).
- El término final es la expectativa del resultado del modelo cuando X1 se promedia sobre su distribución, dado que X2 está fijado en el punto específico 0,64. Nuevamente, debido a la relación x_1 = x_2², esta expectativa coincide con el resultado del modelo en (0,8, 0,64), de manera similar al primer paso.
Por lo tanto, los valores SHAP calculados a partir de la definición original para las dos características, la tasa de ocupación y la tasa de problemas informados en el punto de datos (0,8, 0,64), son -0,0375 y -0,0375, respectivamente, lo que es bastante diferente de los valores dados por Kernel SHAP.
¿Dónde surgen las discrepancias?
Como habrás notado, la discrepancia entre los dos métodos surge principalmente de los pasos segundo y cuarto, donde necesitamos calcular la expectativa condicional. Esto implica calcular la expectativa del resultado del modelo cuando X1X_1X1 está condicionado a 0,8.
- Forma exacta:Al calcular valores SHAP exactos, se tienen en cuenta explícitamente las dependencias entre las características (como x1=x_2² en nuestro ejemplo). Esto garantiza cálculos precisos al considerar cómo las interacciones entre características afectan el resultado del modelo.
- Núcleo SHAP:De manera predeterminada, Kernel SHAP asume la independencia de las características, lo que puede generar valores SHAP inexactos cuando las características en realidad son dependientes. Según el artículo Un enfoque unificado para interpretar las predicciones de los modelos, Esta suposición es una simplificación. En la práctica, las características suelen estar correlacionadas, lo que dificulta lograr aproximaciones precisas al utilizar Kernel SHAP.
Lamentablemente, calcular valores SHAP directamente en función de su definición original puede resultar costoso en términos computacionales. A continuación, se presentan algunos enfoques alternativos que se pueden considerar:
Forma de árbol
- Diseñado específicamente para modelos basados en árboles, como bosques aleatorios y máquinas de refuerzo de gradiente, TreeSHAP calcula de manera eficiente los valores SHAP y al mismo tiempo administra de manera eficaz las dependencias de las características.
- Este método está optimizado para conjuntos de árboles, lo que lo hace más rápido y escalable en comparación con los cálculos SHAP tradicionales.
- Al utilizar TreeSHAP dentro del marco SHAP, configure el parámetro
feature_perturbation = "interventional"para tener en cuenta las dependencias de características con precisión.
Ampliación de SHAP del núcleo para funciones dependientes
- Para abordar las dependencias de características, Este documento Implica la extensión de Kernel SHAP. Un método consiste en suponer que el vector de características sigue una distribución gaussiana multivariante. En este enfoque:
- Las distribuciones condicionales se modelan como distribuciones gaussianas multivariadas.
- Se generan muestras a partir de estas distribuciones gaussianas condicionales utilizando estimaciones de los datos de entrenamiento.
- La integral en la aproximación se calcula basándose en estas muestras.
- Este método supone una distribución gaussiana multivariada para las características, lo que puede no ser siempre aplicable en escenarios del mundo real donde las características pueden exhibir diferentes estructuras de dependencia.
Mejorar la precisión SHAP del kernel
- Descripción:Mejore la precisión de Kernel SHAP al garantizar que el conjunto de datos de fondo utilizado para la aproximación sea representativo de la distribución de datos real con características independientes.
Al utilizar estos métodos, puede abordar los desafíos computacionales asociados con el cálculo de valores SHAP y mejorar su precisión en aplicaciones prácticas. Sin embargo, es importante tener en cuenta que no existe una solución única que sea universalmente óptima para todos los escenarios.
En esta entrada del blog, hemos explorado cómo los valores SHAP, a pesar de su sólida base teórica y versatilidad en varios modelos predictivos, pueden sufrir problemas de precisión cuando se correlacionan los predictores, en particular cuando se emplean aproximaciones como KernelSHAP. Comprender estas limitaciones es crucial para interpretar de manera eficaz los valores SHAP. Al reconocer las posibles discrepancias y seleccionar los métodos de aproximación más adecuados, podemos lograr una atribución de características más precisa y confiable en nuestros modelos.