Introducción
se encuentran entre las herramientas más populares para explicar los modelos de aprendizaje automático (ML) y aprendizaje profundo (DL). Sin embargo, para los datos de series temporales, estos métodos a menudo se quedan cortos porque no tienen en cuenta las dependencias temporales inherentes a dichos conjuntos de datos. En un artículo reciente, nosotros (Ángel Luis Perales Gómez, Lorenzo Fernández Maimó y yo) presentamos ShaTS, un novedoso método de explicabilidad basado en Shapley diseñado específicamente para modelos de series temporales. ShaTS aborda las limitaciones de los métodos tradicionales de Shapley incorporando estrategias de agrupación que mejoran tanto la eficiencia computacional como la explicabilidad.
Valores de Shapley: la base
Los valores de Shapley se originan en la teoría de juegos cooperativos y distribuyen de manera justa la ganancia total entre los jugadores en función de sus contribuciones individuales a un esfuerzo colaborativo. El valor de Shapley para un jugador se calcula considerando todas las coaliciones posibles de jugadores y determinando la contribución marginal de ese jugador a cada coalición.
Formalmente, el valor de Shapley φi para el jugador i es:
\[ \varphi_i(v) = \sum_{S \subseteq N \setminus {i}}
\frac{|S|! (|N| – |S| – 1)!}{|N|!} (v(S \cup {i}) – v(S)) \]
dónde:
N es el conjunto de todos los jugadores. S es una coalición de jugadores que no incluye a i. v(S) es la función de valor que asigna un valor a cada coalición (es decir, la ganancia total que la coalición S puede lograr).
Esta fórmula promedia las contribuciones marginales del jugador i en todas las coaliciones posibles, ponderadas por la probabilidad de que se forme cada coalición.
De la teoría de juegos a la xAI: los valores de Shapley en el aprendizaje automático
En el contexto de la IA explicable (xAI), los valores de Shapley atribuyen el resultado de un modelo a sus características de entrada. Esto es particularmente útil para comprender modelos complejos, como redes neuronales profundas, donde la relación entre entrada y salida no siempre es clara.
Los métodos basados en Shapley pueden ser computacionalmente costosos, especialmente a medida que aumenta el número de características, porque el número de coaliciones posibles crece exponencialmente. Sin embargo, los métodos de aproximación, particularmente los implementados en la popular biblioteca SHAP, los han hecho viables en la práctica. Estos métodos estiman los valores de Shapley muestreando un subconjunto de coaliciones en lugar de evaluar todas las combinaciones posibles, lo que reduce significativamente la carga computacional.
Considere un escenario industrial con tres componentes: un tanque de agua, un termómetro y un motor. Supongamos que tenemos un modelo ML/DL de detección de anomalías (AD) que detecta actividad maliciosa en función de las lecturas de estos componentes. Usando SHAP, podemos determinar cuánto contribuye cada componente a la predicción del modelo sobre si la actividad es maliciosa o benigna.
Sin embargo, en escenarios más realistas, el modelo utiliza no sólo la lectura actual de cada sensor sino también lecturas anteriores (una ventana temporal) para hacer predicciones. Este enfoque permite que el modelo capture patrones y tendencias temporales, mejorando así su rendimiento. Aplicar SHAP en este escenario para asignar responsabilidad a cada componente físico se vuelve más desafiante porque ya no existe un mapeo uno a uno entre funciones y sensores. Cada sensor ahora aporta múltiples funciones asociadas con diferentes pasos de tiempo. El enfoque común aquí es calcular el valor de Shapley de cada característica en cada paso de tiempo y luego agregar estos valores post hoc.
Este enfoque tiene dos inconvenientes principales:
Complejidad computacional: el costo computacional aumenta exponencialmente con la cantidad de características, lo que lo hace poco práctico para grandes conjuntos de datos de series temporales. Ignorar las dependencias temporales: los explicadores SHAP están diseñados para datos tabulares sin dependencias temporales. La agregación post hoc puede dar lugar a explicaciones inexactas porque no logra capturar las relaciones temporales entre características.
El enfoque ShaTS: agrupar antes de la importancia informática
En el marco de Shapley, el valor de un jugador se determina únicamente comparando el desempeño de una coalición con y sin ese jugador. Aunque el método se define a nivel individual, nada impide aplicarlo a grupos de jugadores y no a individuos individuales. Por lo tanto, si consideramos un conjunto de jugadores N divididos en p grupos G = {G1,…, Gp}, podemos calcular el valor de Shapley para cada grupo Gi evaluando la contribución marginal de todo el grupo a todas las posibles coaliciones de los grupos restantes. Formalmente, el valor de Shapley para el grupo Gi se puede expresar como:
\[ \varphi(G_i) = \sum_{T \subseteq G \setminus G_i} \frac{|T|! (|G| – |T| – 1)!}{|G|!} \left( v(T \cup G_i) – v(T) \right) \]
dónde:
G es el conjunto de todos los grupos. T es una coalición de grupos que no incluye a Gi. v(T) es la función de valor que asigna un valor a cada coalición de grupos.
Partiendo de esta idea, ShaTS opera en ventanas de tiempo y proporciona tres niveles distintos de agrupación, según el objetivo explicativo:
Temporal
Cada grupo contiene todas las mediciones registradas en un instante específico dentro de la ventana de tiempo. Esta estrategia es útil para identificar instantes críticos que influyen significativamente en la predicción del modelo.
Característica
Cada grupo representa las medidas de una característica individual durante la ventana de tiempo. Esta estrategia aísla el impacto de características específicas en las decisiones del modelo.
Multifunción
Cada grupo incluye las mediciones combinadas durante la ventana de tiempo de características que comparten una relación lógica o representan una unidad funcional cohesiva. Este enfoque analiza el impacto colectivo de las características interdependientes, asegurando que se capture su influencia combinada.
Una vez definidos los grupos, los valores de Shapley se calculan exactamente como en el caso individual, pero utilizando contribuciones marginales a nivel de grupo en lugar de contribuciones por característica.
Visualización personalizada de ShaTS
ShaTS incluye una visualización diseñada específicamente para datos secuenciales y para las tres estrategias de agrupación anteriores. El eje horizontal muestra ventanas consecutivas. El eje vertical izquierdo enumera los grupos y el eje vertical derecho superpone la puntuación de anomalía del modelo para cada ventana. Cada celda del mapa de calor en (i, Gj) representa la importancia del grupo Gj para la ventana i. Los rojos más cálidos indican una contribución positiva más fuerte a la anomalía, los azules más fríos indican una contribución negativa más fuerte y el casi blanco significa una influencia insignificante. Una línea discontinua violeta traza la puntuación de anomalía en las ventanas, y una línea discontinua horizontal en 0,5 marca el umbral de decisión entre ventanas anómalas y normales.
Para ilustrar, imagine un modelo que procesa ventanas de longitud 10 construidas a partir de tres características, X, Y y Z. Cuando un operador recibe una alerta y quiere saber qué señal la activó, inspecciona los resultados de la agrupación de características. En la siguiente figura, alrededor de las ventanas 10 y 11, la puntuación de anomalía aumenta por encima del umbral, mientras que la atribución de X se intensifica. Este patrón indica que la decisión está siendo impulsada principalmente por X.
Si la siguiente pregunta es cuándo, dentro de cada ventana, ocurre la anomalía, el operador cambia a la vista de agrupación temporal. La siguiente figura muestra que el instante final de cada ventana (t9) conlleva consistentemente la atribución positiva más fuerte, lo que revela que el modelo ha aprendido a confiar en el último paso de tiempo para clasificar la ventana como anómala.
Resultados experimentales: prueba de ShaTS en el conjunto de datos SWaT
En nuestra publicación reciente, validamos ShaTS en el banco de pruebas Secure Water Treatment (SWaT), una instalación de agua industrial con 51 sensores/actuadores organizados en seis etapas de planta (P1-P6). Un Bi-LSTM apilado entrenado en señales de ventana sirvió como detector, y comparamos ShaTS con KernelSHAP post hoc usando tres puntos de vista: Temporal (qué instante en la ventana importa), Sensor/Actuador (qué dispositivo) y Proceso (cuál de las seis etapas).
En todos los ataques, ShaTS produjo bandas estrechas e interpretables que señalaron la verdadera fuente (hasta la etapa de sensor/actuador o planta), mientras que SHAP post hoc tendió a difundir la importancia entre muchos grupos, complicando el análisis de la causa raíz. ShaTS también era más rápido y escalable: la agrupación reduce el conjunto de jugadores, por lo que el espacio de coalición cae dramáticamente; el tiempo de ejecución permanece casi constante a medida que crece la longitud de la ventana porque el número de grupos no cambia; y la ejecución de GPU acelera aún más el método, haciendo práctico su uso casi en tiempo real.
Ejemplo práctico: integración de ShaTS en su flujo de trabajo
Este tutorial muestra cómo conectar ShaTS a un flujo de trabajo típico de Python: importe la biblioteca, elija una estrategia de agrupación, inicialice el explicador con su modelo entrenado y datos de fondo, calcule valores de Shapley grupales en un conjunto de prueba y visualice los resultados. El ejemplo supone un modelo de serie temporal de PyTorch y que sus datos están en ventanas (por ejemplo, forma [window_len, n_features] por muestra).
1. Importe ShaTS y configure el Explicador
En su script o cuaderno de Python, comience importando los componentes necesarios de la biblioteca ShaTS. Mientras el repositorio expone la clase ShaTS abstracta, normalmente creará una instancia de una de sus implementaciones concretas (por ejemplo, FastShaTS).
importar shats de shats.grouping importar TimeGroupingStrategy de shats.grouping importar FeaturesGroupingStrategy de shats.grouping importar MultifeaturesGroupingStrategy
2. Inicializar el modelo y los datos
Suponga que tiene un modelo PyTorch de serie temporal previamente entrenado y un conjunto de datos de fondo, que debería ser una lista de tensores que representen muestras de datos típicas que el modelo ha visto durante el entrenamiento. Si desea comprender mejor el conjunto de datos de fondo, consulte este blog de Cristoph Molnar.
modelo = MyTrainedModel() muestras_aleatorias = muestra.aleatoria(rango(len(trainDataset)), 100) fondo = [trainDataset[idx] para idx en muestras_aleatorias]shapley_class = shats.FastShaTS(modelo, support_dataset=antecedentes, grouping_strategy= FeaturesGroupingStrategy(nombres=nombres_variables)
3. Calcular los valores de Shapley
Una vez que se inicialice el explicador, calcule los valores de ShaTS para su conjunto de datos de prueba. El conjunto de datos de prueba debe tener un formato similar al conjunto de datos de fondo.
shats_values = shaTS.compute(testDataset)
4. Visualice los resultados
Finalmente, utilice la función de visualización incorporada para trazar los valores de ShaTS. Puede especificar qué clase (por ejemplo, anómala o normal) desea explicar.
shaTS.plot(shats_values, test_dataset=testDataset, class_to_explain=1)
Conclusiones clave
Atribución enfocada: ShaTS proporciona atribuciones más enfocadas que SHAP post hoc, lo que facilita la identificación de la causa raíz en modelos de series de tiempo. Eficiencia: al reducir la cantidad de jugadores en grupos, ShaTS reduce significativamente las coaliciones a evaluar, lo que lleva a tiempos de cálculo más rápidos. Escalabilidad: ShaTS mantiene un rendimiento constante incluso cuando aumenta el tamaño de la ventana, gracias a su estructura de grupo fijo. Aceleración de GPU: ShaTS puede aprovechar los recursos de la GPU, mejorando aún más su velocidad y eficiencia.
Pruébalo tú mismo
Demostración interactiva
Compare ShaTS con SHAP post hoc en series de tiempo sintéticas aquí. Puedes encontrar un tutorial en el siguiente vídeo.
Código abierto
El módulo ShaTS está completamente documentado y listo para conectarse a su proceso ML/DL. Encuentra el código en Github.
Espero que os haya gustado! Le invitamos a ponerse en contacto conmigo si tiene preguntas, desea compartir comentarios o simplemente desea mostrar sus propios proyectos.