IA-2023-2-SHAP
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Write
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Help
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Write
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # Proyecto SHAP **Autores:** - Mateo Alejandro Diaz Munoz - maadiazmu@unal.edu.co - Fredy Andres Rosero Cristancho - faroseroc@unal.edu.co - Samuel Camilo Burgos Rojas - sburgos@unal.edu.co **Fecha:** November 2023 ## Introducción En el contexto de inteligencia artificial, la falta de transparencia en los modelos de predicción presenta un desafío significativo. En este documento se explora la libreria de SHAP, sus aplicaciones y una pequeña explicación a cómo funciona por dentro. Abordaremos las matemáticas detras de los valores de Shapley con una implementación *Sympy* para hacer el cáculo paso a paso de los valores de Shapley del juego de guantes. Identificaremos los origenes de los datos de las gráficas que nos arroja SHAP con un modelo de regresión del Avaluo vivienda de california del dataset de StatLib. Finalmente haremos una aplicación para los modelos de clasificación con los conjuntos de datos de Iris y Diabetes de NCSU Statistics Department. ## Identificación del problema Los modelos de aprendizaje automático, a pesar de su alta precisión, enfrentan una barrera significativa en términos de interpretación. La dificultad para entender su funcionamiento y mejorar sus resultados se acentúa debido a la complejidad propia a estos modelos. El problema se intensifica cuando consideramos que los modelos de inteligencia artificial suelen depender de grandes conjuntos de datos, lo que complica la identificación de las características individuales que ejercen una mayor influencia en las predicciones. La opacidad o falta de transparencia no solo afecta la comprensión del modelo, sino que también limita la capacidad para realizar mejoras específicas basadas en la relevancia de las características del modelo. En este contexto, la falta de transparencia se convierte en un obstáculo central. Modelos como las redes neuronales y las máquinas de soporte vectorial, consideradas "cajas negras", dificultan la comprensión de cómo cada característica de entrada contribuye a las decisiones del modelo. Esta falta de visibilidad no solo genera desconfianza en los resultados del modelo, sino que también complica la detección de posibles sesgos o problemas de equidad. Superar esta opacidad se vuelve esencial para fortalecer la confianza en los modelos y abordar cuestiones críticas de sesgo y equidad en los modelos de inteligencia artificial. ![encabezado shap](https://shap.readthedocs.io/en/latest/_images/shap_header.png) Caja negra vs. Caja blanca. Imagen tomada de [shap.readthedocs.io](https://shap.readthedocs.io) La librería SHAP (SHapley Additive exPlanations) en Python nos brinda una solución efectiva para abordar la opacidad en los modelos de aprendizaje automático. Proporciona una herramienta integral para la interpretación de modelos, permitiendo la asignación de contribuciones individuales de cada característica a las predicciones del modelo. Al utilizar los valores Shapley de la teoría de juegos cooperativos, SHAP facilita la comprensión de la importancia relativa de cada característica, ayudando así en la identificación de patrones, la validación del modelo y la detección de sesgo. En resumen, SHAP se presenta como una herramienta esencial para mejorar la transparencia y la interpretabilidad en el desarrollo y la aplicación de modelos de aprendizaje automático. [^8] ## Estado del arte Para analizar el estado del arte utilizamos el siguiente *query string* ~~~plaintdext TITLE-ABS-KEY ( ( "SHAP" AND "python" ) AND ( "Shapley Additive exPlanation" OR "detection" OR "shap" OR "Explainability" OR "Explainable" OR "exploitation" ) ) AND ( LIMIT-TO ( DOCTYPE , "ar" ) ) AND ( LIMIT-TO ( OA , "all" ) ) ~~~ El cual nos arrojó 22 artículos consignados en [SHAP.bib](https://github.com/IA-2023-2-SHAP/proyecto-shap/blob/main/state-of-art/SHAP.bib) los cuales se analizaron con pyBibx en el notebook [pyBibX_shap.ipynb](https://github.com/IA-2023-2-SHAP/proyecto-shap/blob/main/state-of-art/pyBibX_shap.ipynb) de nuestro repositorio. La información a resaltar es la siguiente ### Documentos |index|ID|Document| |---|---|---| |0|0|Li, Liangbo and Pu, Cheng and Jin, Nenghao and Zhu, Liang and Hu, Yanchun and Cascone, Piero and Tao, Ye and Zhang, Haizhong \(2023\)\. Prediction of 5-year overall survival of tongue cancer based machine learning\. UNKNOW\. doi:10\.1186/s12903-023-03255-w\. | |1|1|Hang, Hoang Thi Thanh and Huy, Tran Trong and Phung, Nguyen Thi Kim and Uyen, Nguyen Thi Huynh \(2022\)\. IMPACT OF CAPITAL STRUCTURE ON BUSINESS PERFORMANCE OF ENERGY COMPANIES LISTED ON VIETNAM STOCK MARKET\. UNKNOW\. doi:10\.24874/PES04\.04\.006\. | |2|2|Knitza, Johannes and Janousek, Lena and Kluge, Felix and von der Decken, Cay Benedikt and Kleinert, Stefan and Vorbrüggen, Wolfgang and Kleyer, Arnd and Simon, David and Hueber, Axel J\. and Muehlensiepen, Felix and Vuillerme, Nicolas and Schett, Georg and Eskofier, Bjoern M\. and Welcker, Martin and Bartz-Bazzanella, Peter \(2022\)\. Machine learning-based improvement of an online rheumatology referral and triage system\. UNKNOW\. doi:10\.3389/fmed\.2022\.954056\. | |3|3|Scavuzzo, Carlos Matias and Scavuzzo, Juan Manuel and Campero, Micaela Natalia and Anegagrie, Melaku and Aramendia, Aranzazu Amor and Benito, Agustín and Periago, Victoria \(2022\)\. Feature importance: Opening a soil-transmitted helminth machine learning model via SHAP\. UNKNOW\. doi:10\.1016/j\.idm\.2022\.01\.004\. | |4|4|Eder, Matthias and Moser, Emanuel and Holzinger, Andreas and Jean-Quartier, Claire and Jeanquartier, Fleur \(2022\)\. Interpretable Machine Learning with Brain Image and Survival Data\. UNKNOW\. doi:10\.3390/biomedinformatics2030031\. | |5|5|Shi, Songchang and Pan, Xiaobin and Zhang, Lihui and Wang, Xincai and Zhuang, Yingfeng and Lin, Xingsheng and Shi, Songjing and Zheng, Jianzhang and Lin, Wei \(2022\)\. An application based on bioinformatics and machine learning for risk prediction of sepsis at first clinical presentation using transcriptomic data\. UNKNOW\. doi:10\.3389/fgene\.2022\.979529\. | |6|6|Gashi, Milot and Vuković, Matej and Jekic, Nikolina and Thalmann, Stefan and Holzinger, Andreas and Jean-Quartier, Claire and Jeanquartier, Fleur \(2022\)\. State-of-the-Art Explainability Methods with Focus on Visual Analytics Showcased by Glioma Classification\. UNKNOW\. doi:10\.3390/biomedinformatics2010009\. | |7|7|Li, Richard and Shinde, Ashwin and Liu, An and Glaser, Scott and Lyou, Yung and Yuh, Bertram and Wong, Jeffrey and Amini, Arya \(2020\)\. Machine learning–Based interpretation and visualization of nonlinear interactions in prostate cancer survival\. UNKNOW\. doi:10\.1200/CCI\.20\.00002\. | |8|8|Kang, Danbee and Kim, Hyunsoo and Cho, Juhee and Kim, Zero and Chung, Myungjin and Lee, Jeong Eon and Nam, Seok Jin and Kim, Seok Won and Yu, Jonghan and Chae, Byung Joo and Ryu, Jai Min and Lee, Se Kyung \(2023\)\. Prediction Model for Postoperative Quality of Life Among Breast Cancer Survivors Along the Survivorship Trajectory From Pretreatment to 5 Years: Machine Learning-Based Analysis\. UNKNOW\. doi:10\.2196/45212\. | |9|9|Assegie, Tsehay Admassu \(2023\)\. Evaluation of Local Interpretable Model-Agnostic Explanation and Shapley Additive Explanation for Chronic Heart Disease Detection\. UNKNOW\. doi:10\.46604/peti\.2023\.10101\. | |10|10|Mc Cord—De Iaco, Kimberly A\. and Gesualdo, Francesco and Pandolfi, Elisabetta and Croci, Ileana and Tozzi, Alberto Eugenio \(2023\)\. Machine learning clinical decision support systems for surveillance: a case study on pertussis and RSV in children\. UNKNOW\. doi:10\.3389/fped\.2023\.1112074\. | |11|11|Talkhi, Nasrin and Nooghabi, Mehdi Jabbari and Esmaily, Habibollah and Maleki, Saba and Hajipoor, Mojtaba and Ferns, Gordon\. A\. and Ghayour-Mobarhan, Majid \(2023\)\. Prediction of serum anti-HSP27 antibody titers changes using a light gradient boosting machine \(LightGBM\) technique\. UNKNOW\. doi:10\.1038/s41598-023-39724-z\. | |12|12|Amparore, Elvio and Perotti, Alan and Bajardi, Paolo \(2021\)\. To trust or not to trust an explanation: using LEAF to evaluate local linear XAI methods\. UNKNOW\. doi:10\.7717/peerj-cs\.479\. | |13|13|Guo, Le and Li, Xijun and Zhang, Chao and Xu, Yang and Han, Lujun and Zhang, Ling \(2023\)\. Radiomics Based on Dynamic Contrast-Enhanced Magnetic Resonance Imaging in Preoperative Differentiation of Combined Hepatocellular-Cholangiocarcinoma from Hepatocellular Carcinoma: A Multi-Center Study\. UNKNOW\. doi:10\.2147/JHC\.S406648\. | |14|14|Kiss, Szabolcs and Pintér, József and Molontay, Roland and Nagy, Marcell and Farkas, Nelli and Sipos, Zoltán and Fehérvári, Péter and Pecze, László and Földi, Mária and Vincze, Áron and Takács, Tamás and Czakó, László and Izbéki, Ferenc and Halász, Adrienn and Boros, Eszter and Hamvas, József and Varga, Márta and Mickevicius, Artautas and Faluhelyi, Nándor and Farkas, Orsolya and Váncsa, Szilárd and Nagy, Rita and Bunduc, Stefania and Hegyi, Péter Jenő and Márta, Katalin and Borka, Katalin and Doros, Attila and Hosszúfalusi, Nóra and Zubek, László and Erőss, Bálint and Molnár, Zsolt and Párniczky, Andrea and Hegyi, Péter and Szentesi, Andrea and Kiss, Szabolcs and Földi, Mária and Vincze, Áron and Takács, Tamás and Czakó, László and Izbéki, Ferenc and Halász, Adrienn and Boros, Eszter and Varga, Márta and Nagy, Rita and Márta, Katalin and Doros, Attila and Erőss, Bálint and Molnár, Zsolt and Párniczky, Andrea and Szentesi, Andrea and Bajor, Judit and Gódi, Szilárd and Sarlós, Patrícia and Czimmer, József and Szabó, Imre and Pár, Gabriella and Illés, Anita and Hágendorn, Roland and Németh, Balázs Csaba and Kui, Balázs and Illés, Dóra and Gajdán, László and Dunás-Varga, Veronika and Fejes, Roland and Papp, Mária and Vitális, Zsuzsanna and Novák, János and Török, Imola and Macarie, Melania and Ramírez-Maldonado, Elena and Sallinen, Ville and Galeev, Shamil and Bod, Barnabás and Ince, Ali Tüzün and Pécsi, Dániel and Varjú, Péter and Juhász, Márk Félix and Ocskay, Klementina and Mikó, Alexandra and Szakács, Zsolt \(2022\)\. Early prediction of acute necrotizing pancreatitis by artificial intelligence: a prospective cohort-analysis of 2387 cases\. UNKNOW\. doi:10\.1038/s41598-022-11517-w\. | |15|15|Patel, Sharad and Singh, Gurkeerat and Zarbiv, Samson and Ghiassi, Kia and Rachoin, Jean-Sebastien \(2021\)\. Mortality Prediction Using SaO2/FiO2 Ratio Based on eICU Database Analysis\. UNKNOW\. doi:10\.1155/2021/6672603\. | |16|16|Booth, Adam L\. and Abels, Elizabeth and McCaffrey, Peter \(2021\)\. Development of a prognostic model for mortality in COVID-19 infection using machine learning\. UNKNOW\. doi:10\.1038/s41379-020-00700-x\. | |17|17|Ege, Duygu and Sertturk, Seda and Acarkan, Berk and Ademoglu, Ahmet \(2023\)\. Machine learning models to predict the relationship between printing parameters and tensile strength of 3D Poly \(lactic acid\) scaffolds for tissue engineering applications\. UNKNOW\. doi:10\.1088/2057-1976/acf581\. | |18|18|Shao, Jiakang and Liu, Feng and Ji, Shuaifei and Song, Chao and Ma, Yan and Shen, Ming and Sun, Yuntian and Zhu, Siming and Guo, Yilong and Liu, Bing and Wu, Yuanbin and Qin, Handai and Lai, Shengwei and Fan, Yunlong \(2023\)\. Development, External Validation, and Visualization of Machine Learning Models for Predicting Occurrence of Acute Kidney Injury after Cardiac Surgery\. UNKNOW\. doi:10\.31083/j\.rcm2408229\. | |19|19|Bachoc, François and Gamboa, Fabrice and Halford, Max and Loubes, Jean-Michel and Risser, Laurent \(2023\)\. Explaining machine learning models using entropic variable projection\. UNKNOW\. doi:10\.1093/imaiai/iaad010\. | |20|20|Chen, Haifei and Yang, Liping and Wu, Qiusheng \(2023\)\. Enhancing Land Cover Mapping and Monitoring: An Interactive and Explainable Machine Learning Approach Using Google Earth Engine\. UNKNOW\. doi:10\.3390/rs15184585\. | |21|21|Cassar, Daniel R\. \(2023\)\. GlassNet: A multitask deep neural network for predicting many glass properties\. UNKNOW\. doi:10\.1016/j\.ceramint\.2023\.08\.281\. | ### Top 15 palaabras clave |index|ID|KWP| |---|---|---| |0|p\_0|machine learning| |1|p\_1|human| |2|p\_2|article| |3|p\_3|support vector machine| |4|p\_4|male| |5|p\_5|female| |6|p\_6|controlled study| |7|p\_7|retrospective study| |8|p\_8|receiver operating characteristic| |9|p\_9|humans| |10|p\_10|artificial intelligence| |11|p\_11|sensitivity and specificity| |12|p\_12|risk assessment| |13|p\_13|random forest| |14|p\_14|prediction| |15|p\_15|middle aged| ### Nube de palabras asociadas ![Nube de palabras](https://raw.githubusercontent.com/IA-2023-2-SHAP/proyecto-shap/main/state-of-art/word-cloud.png) ## Metodología 1. Contexto y definicion de los valores de shapley 2. Valores de shapley aplicados en situaciones cotidianas. 3. Analisis visual y matematico de los valores de shapley de un modelo de regresion lineal. 4. Planteamiento de casos de estudio, descripcion y analisis matematico en python. 5. Aplicación de SHAP, definicion de datasets, datos de entrada y herramientas. 6. Entrenamiento del Modelo: se aplica un tipo de modelo, en nuestros casos de estudio regresion lineal, random forest y KNN. 7. Visualización de Resultados y analisis, que describe las gráficas que entrega shap. ## Marco teórico ### Juegos cooperativos TU Un juego se puede pensar como una secuencia de movimientos. En cada uno de ellos, uno de los jugadores decide su actuación entre distintas posibilidades. Al final del juego se asigna un pago a los jugadores que depende de las decisiones que todos ellos hayan tomado. Podemos, por tanto, describir un juego como una función que asigna un pago a cada "posición final" posible en el mismo. En el caso de los juegos **utilidad transferible** o **TU** por sus siglas en ingles, se pueden formar grupos de jugadores (que denominaremos **coaliciones**) que fuercen determinados repartos. Así pues, un juego TU puede ser definido mediante una función que asigna a cada coalición posible un número real que indica el pago asociado a dicha coalición[^2]. > Un juego TU es un par $(N, v)$ donde $N$ es el conjunto finito de jugadores y $v : \mathcal{P}(N) \to \mathbb{R}$ es una función que cumple que $v(∅) = 0$. Un juegos TU también es conocido como un **juego cooperativo** o **juego de coalición**. Uno de los principales problemas que plantea la teoría de juegos cooperativos TU es cómo repartir la ganancia total $v(N)$ entre todos los jugadores de manera equitativa y acorde con la participación individual de cada jugador. Una de las técnicas más utilizadas para dar solución a este problema es el valor de Shapley[^3]. #### Función característica La función $v$ se llama función característica. La función $v$ tiene el siguiente significado: si $S$ es una coalición de jugadores, entonces $v(S)$, llamado el **valor de la coalición** $S$, describe la suma total esperada de pagos que los miembros de $S$ pueden obtener mediante la cooperación. > La función característica $v$ de un juego TU es una función $v : \mathcal{P}(N) \to \mathbb{R}$ que cumple que $v(∅) = 0$. Su dominio es el conjunto de partes de $N$, es decir, conjunto de todos los subconjuntos de $N$, que denotamos por $\mathcal{P}(N)$ ó $2^N$. Dada una coalición $S ⊂ N$, $v(S)$ representa el pago asegurado por los jugadores de $S$, independientemente de las estrategias del resto de jugadores. Se denotará por $G(N)$ el conjunto de todos los **juegos TU** con conjunto de jugadores $N$, y por $n$ la cardinalidad de $N$. Por simplicidad, en general identificaremos $(N, v)$ con su función característica $v$. #### Coalición Se denomina Coalición a cualquier subconjunto no vacío de $N$. Para cada coalición $S ⊂ N$ está asociado un número $v(S)$ el cual representa el pago que se puede asegurar a los jugadores que forman parte de $S$, independientemente de lo que hagan los demás jugadores. El **valor de una coalición** se puede considerar como la cantidad mínima que puede obtener una coalición si todos los jugadores que forman parte de ella se asocian y juegan en equipo. ### Valor de Shapley El valor de Shapley es una forma de distribuir las ganancias totales a los jugadores, suponiendo que todos colaboran. Es una distribución "justa" en el sentido de que es la única distribución con ciertas propiedades deseables que se enumeran a continuación. Shapley, analizó durante mucho tiempo los juegos cooperativos y en 1953 propuso el concepto de valor de un juego $(N, v)$ dado para cada jugador $i ∈ N$ a través de la siguiente expresión [^4]: $$ \varphi_i(N,v)=\sum_{S \subseteq N \setminus \{i\}} \frac{s!\;(n-s-1)!}{n!}(v(S\cup\{i\})-v(S)) $$ donde $n$ es el número total de jugadores $N$, $s$ es el numero de jugadores en la coalición $S$ y la suma se extiende sobre todos los subconjuntos $S$ de $N$ que no contienen al jugador $i$. $$ \varphi_i(N,v)= \sum_{S \subseteq N \setminus \{i\}} {n \choose 1, s, n - s - 1}^{-1} (v(S\cup\{i\})-v(S)) $$ También tenga en cuenta que ${n \choose a, b, c}$ es el coeficiente multinomial. Aquí, los términos clave son: - $\varphi_i(v)$: Es el Shapley value del jugador $i$ en el juego representado por la función de valor $v$. - $N$: Es el conjunto de todos los jugadores (en nuestro caso, todas las características). - $S \subseteq N \setminus \{i\}$: $S$ es una coalición que no contiene al jugador $i$ [^1]. - $|S|$ o $s$: Representa el número de jugadores en la coalición $S$. - $|N|$ ó $n$: Es el número total de jugadores (características). - $v(S \cup \{i\})$: Es el valor de la función $v$ cuando la coalición es ampliada para incluir al jugador $i$. - $v(S)$: Es el valor de la función $v$ cuando solo consideramos la coalición $S$. Muchas veces un juego TU denotado como $(N,v)$ se expresa tan solo como $v$ por practicidad. por lo que podemos tambien encontrar $\varphi_i(N,v)$ que seria equivalente a $\varphi_i(v)$ Esta fórmula puede parecer compleja, pero es esencialmente una suma ponderada de las diferencias en la contribución de la característica $i$ cuando se agrega a diferentes coaliciones. El término $\frac{s!(n - s - 1)!}{n!}$ representa la ponderación de las diferentes permutaciones posibles de las coaliciones. Una fórmula equivalente alternativa para el valor de Shapley es: $$ \varphi _{i}(v)={\frac {1}{n!}}\sum _{R}\left[v(P_{i}^{R}\cup \left\{i\right\})-v(P_{i}^{R})\right] $$ donde la suma recorre todos los órdenes posibles de $n!$ jugadores $R$ y $P_i^R$ es el conjunto de jugadores en $N$ que preceden (estan antes de) a $i$ en el orden $R$. Finalmente, también se puede expresar como $$ \varphi _{i}(v)={\frac {1}{n}}\sum _{S\subseteq N\setminus \{i\}}{\binom {n-1}{s}}^{-1}(v(S\cup \{i\})-v(S)) $$ que se puede interpretar como $$ \varphi _{i}(v)={\frac {1}{\text{número de jugadores}}}\sum _{{\text{coalitions incluyendo }}i}{\frac {{\text{contribución marginal de }}i{\text{ a la coalición}}}{{\text{número de coaliciones excluyendo }}i{\text{ de este tamaño}}}} $$ #### Contribución marginal El valor de Shapley, puede interpretarse como la contribución marginal esperada del jugador $i$ o como un promedio de las contribuciones marginales $[v(S) − v(S − i)]$ de dicho jugador a todas las coaliciones no vacías $S ∈ \mathcal{P}(N)$, considerando que la coalición del jugador sea equiprobable en tamaño $(1 ≤ s ≤ n)$ y que todas las coaliciones de tamaño $S$ tienen la misma probabilidad. #### Propiedades del valor de Shapley El valor de Shapley tiene las siguientes propiedades deseables: **1. Eficiencia**: La ganancia total se distribuye: $$ \sum_{i\in N}\varphi _i(v) = v(N) $$ **2. Simetría**: si i y j son dos actores que son equivalentes en el sentido de que: $$ v(S\cup\{i\}) = v(S\cup\{j\}) $$ para cada subconjunto $S$ de $N$ que no contiene $i$ ni $j$, entonces $\varphi _i(v) = \varphi _j(v)$. **3. Linealidad**: Si dos juegos cooperativos descritos por las funciones de ganancia $v$ y $w$ son combinados, entonces la ganancia distribuida debería corresponder a la ganancia derivada de $v$ y $w$: $$ \varphi _i(v+w) = \varphi _i(v) + \varphi _i(w) $$ por cada $i$ en $N$. También, por cada número real $a$: $$ \varphi _i(a v) = a \varphi _i(v) $$ por cada $i$ en $N$. **4. Zero Player** (Jugador Nulo): El valor de Shapley $\varphi _i(v)$ de un jugador nulo $i$ en un juego v es cero. Un jugador $i$ es nulo en v si $v$ if $v(S\cup \{i\}) = v(S)$ para todas las coaliciones $S$. De hecho, dado un conjunto de $N$ jugadores, el valor de Shapley es el único mapa a partir del conjunto de todos los juegos de vectores de ganancias que satisface todas las cuatro propiedades aquí mencionadas. #### Dividendos Harsanyi La fórmula del valor de Shapley utiliza los Dividendos Harsanyi para calcular la contribución promedio de cada jugador a la sinergia de todas las coaliciones de las que es miembro. John Charles Harsanyi, en colaboración con John Forbes Nash and Reinhard Selten, propusieron en 1959 [^6] la formula alternativa: $$ \varphi_i(v) = \sum_{i \in S \subseteq N }{\frac{d_v(S)}{s}} $$ donde $d_v(T)$ son los llamados **dividendos Harsanyi** $d_v \colon \mathcal{P}(N) \to \mathbb{R}$ el cual se define como[^7]: $$ \begin{aligned} d_{v}(\{i\})&=v(\{i\})\\ d_{v}(\{i,j\})&=v(\{i,j\})-d_{v}(\{i\})-d_{v}(\{j\})\\ d_{v}(\{i,j,k\})&=v(\{i,j,k\})-d_{v}(\{i,j\})-d_{v}(\{i,k\})-d_{v}(\{j,k\})-d_{v}(\{i\})-d_{v}(\{j\})-d_{v}(\{k\})\\ &\vdots \\ d_{v}(S)&=v(S)-\sum _{T\subsetneq S}d_{v}(T) \end{aligned} $$ El dividendo Harasanyi identifica el excedente que se crea por una coalición de jugadores en un juego cooperativo. Para especificar este superávit, el valor de esta coalición se corrige por el superávit que ya crean las subcoaliciones. Una formula explicita para $d_v(T)$ es: $$ d_v(T) = \sum_{T \subseteq S }{(-1)^{|S| - |T|} v(T)} $$ Podemos recuperar $v$ de $d_v$ con la ayuda de la formula $$ v(S) = d_v(S) + \sum_{T \subseteq S }{d_v(T)} $$ > En otras palabras, el "valor total" de la coalición $S$ proviene de sumar las *divisiones* de cada subconjunto posible de $S$. **Nota:** Los dividendos de Harsanyi pueden encontrarse en algunas literaturas como **sinergia**. ## Casos de estudio Para este proyecto se realizaron cuatro casos de estudio, dos de ellos que se analizan teoricamente y analiticamente, los cuales son el avaluo de vivienda en california y el juego de los guantes, por otro lado se tienen dos conjuntos de datos que se analizaran directamente con la herramienta shap los cuales son Iris y diabetes, dos datasets perfectos para modelarse y analizarlos como modelos de caja negra para ponerlos en la herramienta shap. ### Explicación de cálculo de valores de Shapley con el ejemplo del juego de los guantes El desarrollo del ejemplo fue tomado de [artículo de Wikipedia de *Shapley value*](https://en.wikipedia.org/wiki/Shapley_value#Glove_game) para comprobar no solo el resultado sino su desarrollo. La implementación se realizó en el notebook [juego-guantes.ipynb](https://github.com/IA-2023-2-SHAP/proyecto-shap/blob/main/explanation/juego-guantes.ipynb) de nuestro repositorio. #### Dependencias Las dependencias mas destacadas para este desarollo fueron *Sympy* y *IPython*. ~~~python import sys import math import sympy as sy from IPython.display import Math, Latex, Markdown, HTML, display ~~~ #### Ejemplo de juego de los guantes ~~~python # Ejemlpo del juego de los guantes """_summary_ El juego de los guantes es un juego cooperativo en el que los jugadores tienen guantes de la mano izquierda y de la mano derecha y el objetivo es formar parejas """ N_sym, n_sym, S_sym, Sp_sym, s_sym, i_sym = sy.symbols("N n S S' s i") v_sym = sy.Function('v') # Crear jugadores del juego n = 3 N = sy.FiniteSet('A', 'B', 'C') display(Markdown(f'Tenemos $|N|=n={n}$ jugadores: $N={sy.latex(N)}$')) # Crear funcion caracteristica v = { sy.FiniteSet('A', 'C'): 1, sy.FiniteSet('B', 'C'): 1, sy.FiniteSet('A', 'B', 'C'): 1 } display(Markdown(f'Tenemos la funcion caracteristica es: $v={sy.latex(v)}$')) display(Markdown(f'Si $i={i}$, entonces, $N \\setminus \\{{ {i} \\}} = {sy.latex(N_sin_i)}$')) i = 'A' N_sin_i = N - sy.FiniteSet(i) display(Markdown(f'Las coaliciones $S \\subseteq N \\setminus \\{{ {i} \\}}$ son:')) R = sy.PowerSet(N_sin_i).rewrite(sy.FiniteSet) for S in R: display(S) ~~~ ![image](https://hackmd.io/_uploads/BJj90v8ST.png) #### Fórmula `phi_sym` representa la fórmula simbólica para calcular la contribución individual de un jugador en el juego. La fórmula sigue la definición matemática de los valores de Shapley expueta en el marco teórico, donde se considera la combinación de características de conjuntos y la diferencia en la función de valor (`v_sym`) entre el conjunto ampliado (`Sp_sym`) y el conjunto original (`S_sym`). ~~~python phi_sym = (sy.factorial(s_sym) * sy.factorial(n_sym-s_sym-1)) / sy.factorial(n_sym) * (v_sym(Sp_sym) - v_sym(S_sym)) display(phi_sym) ~~~ ![image](https://hackmd.io/_uploads/BJsa0v8Hp.png) La función `valor_shapley` toma como entrada un conjunto de jugadores `N` y una función de valor `v` que asigna un valor a cada conjunto de jugadores. Luego, para cada jugador `i` en `N`, calcula el valor de Shapley utilizando la fórmula definida anteriormente. La función itera sobre todos los subconjuntos posibles de jugadores, calcula las combinaciones y las contribuciones, y acumula el resultado en `phi`. Además, se muestra una visualización detallada de cada paso del cálculo para mayor claridad. ~~~python def valor_shapley(N,v): for i in N: display(Markdown(f"Para $i={i}$")) n = len(N) phi = 0 N_sin_i = N - sy.FiniteSet(i) R = sy.PowerSet(N_sin_i).rewrite(sy.FiniteSet) for S in R: s = len(S) combinations = (sy.factorial(s) * sy.factorial(n-s-1)) / sy.factorial(n) Sp = sy.FiniteSet(i).union(S) CM = (v.get(Sp, 0) - v.get(S, 0)) termino = combinations * CM phi += termino display(Markdown(f"* con $S={sy.latex(S)}$ y $S'={sy.latex(Sp)}$ tenemos ${sy.latex(phi_sym)} = {sy.latex(phi_sym.subs({s_sym: s, n_sym: n }))} = {sy.latex(combinations)} \\cdot {sy.latex(CM)}$ ")) display(Markdown(f'El valor de Shapley para el jugador $i={i}$ es: {phi}')) ~~~ #### Ejecución ~~~python valor_shapley(N,v) ~~~ ![image](https://hackmd.io/_uploads/HyoXx_IHa.png) ### Gráficas SHAP en el modelo de regresión lineal de Avaluo de Vivienda de California Antes de utilizar los valores de Shapley para explicar modelos complicados, es útil entender cómo funcionan para modelos simples. Uno de los tipos de modelos más simples es la regresión lineal estándar, y a continuación entrenamos un modelo de regresión lineal en el [conjunto de datos de viviendas de California](https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.html). Esta implementación se encuentra en los botebooks del repositorio del proyecto[^10] #### Conjunto de Datos de Viviendas en California Este conjunto de datos consta de 20,640 bloques de casas en California en 1990, donde nuestro objetivo es predecir el logaritmo natural del precio medio de la vivienda a partir de 8 características diferentes: 1. `MedInc` - ingreso medio en el grupo de bloques 2. `HouseAge` - edad media de la vivienda en el grupo de bloques 3. `AveRooms` - número medio de habitaciones por hogar 4. `AveBedrms` - número medio de dormitorios por hogar 5. `Población` - población del grupo de bloques 6. `AveOccup` - número medio de miembros por hogar 7. `Latitud` - latitud del grupo de bloques 8. `Longitud` - longitud del grupo de bloques > Datos de Cartas S&P > > Recopilamos información sobre las variables utilizando todos los grupos de bloques en California del Censo de 1990. En esta muestra, un grupo de bloques incluye en promedio a 1425.5 individuos que viven en un área geográficamente compacta. > * Naturalmente, el área geográfica incluida varía inversamente con la densidad de población. >* Calculamos distancias entre los centroides de cada grupo de bloques, medidas en latitud y longitud. >* Excluimos todos los grupos de bloques que informaron cero entradas para las variables independientes y dependientes. >* Los datos finales contenían 20,640 observaciones sobre 9 variables. >* La variable dependiente es el $ln((valor medio de la vivienda))$. > El archivo contiene todas las variables. Específicamente, incluye el valor medio de la vivienda, ingreso medio, edad media de la vivienda, total de habitaciones, total de dormitorios, población, hogares, latitud y longitud, en ese orden. [^9] #### Dependencias ~~~python from IPython.display import display, Math, Latex import numpy as np import pandas as pd import seaborn as sns ~~~ #### Conjunto de Datos ~~~python import shap X, y = shap.datasets.california(n_points=1000) ~~~ **`X` (Matriz de características):** Es una matriz que contiene información sobre las características o variables independientes del conjunto de datos. Cada fila de la matriz representa una observación, y cada columna representa una característica específica. En el contexto del conjunto de datos de California, las características podrían incluir información como ingreso medio, edad de la vivienda, número medio de habitaciones por hogar, etc. ~~~python X ~~~ ![image](https://hackmd.io/_uploads/BJVrNuUS6.png) #### Modelo de regresión lineal simple En modelos de regresión, especialmente cuando se trabaja con valores que abarcan un rango amplio, como los precios de las viviendas, es común aplicar transformaciones a la variable de respuesta para abordar problemas de sesgo o heterocedasticidad. En este caso, se está utilizando el **logaritmo natural** ($ln$) del precio medio de la vivienda como la variable objetivo. La transformación logarítmica se elige por varias razones: 1. **Estabilización de la Varianza:** La transformación logarítmica puede ayudar a estabilizar la varianza cuando esta aumenta con el nivel de la variable. 2. **Manejo de Sesgo:** Si la distribución de la variable objetivo está sesgada, la transformación logarítmica puede ayudar a reducir ese sesgo. 3. **Interpretación más Lineal:** La relación entre las variables predictoras y la variable objetivo puede volverse más lineal después de aplicar una transformación logarítmica. ~~~python import sklearn X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, test_size=0.2, random_state=0) X100 = shap.utils.sample(X_train, 100) model = sklearn.linear_model.LinearRegression() model.fit(X_train, y_train) ~~~ #### Examinando los coeficientes del modelo La forma más común de comprender un modelo lineal es examinar los coeficientes aprendidos para cada característica. Estos coeficientes nos indican cuánto cambia la salida del modelo cuando cambiamos cada una de las características de entrada: ~~~python print("Coeficientes del modelo:\\n") for i in range(X_train.shape[1]): print(X_train.columns[i], "=", model.coef_[i].round(5)) ~~~ ![image](https://hackmd.io/_uploads/HkH6NdUHT.png) Estos coeficientes indican cómo cada característica contribuye a la predicción del precio de la vivienda en el modelo de regresión lineal. Un coeficiente positivo sugiere una asociación positiva, mientras que un coeficiente negativo sugiere una asociación negativa. Es importante considerar la magnitud de los coeficientes para evaluar la fuerza de la influencia de cada característica en la predicción. Si bien los coeficientes son útiles para indicarnos qué sucederá cuando cambiamos el valor de una característica de entrada, por sí solos no son una excelente manera de medir la importancia general de una característica. Esto se debe a que el valor de cada coeficiente depende de la escala de las características de entrada. Por ejemplo, si midieramos la edad de una casa en minutos en lugar de años, entonces los coeficientes para la característica HouseAge se convertirían en 0.0115 / (365∗24∗60) = 2.18e-8. Claramente, el número de años desde que se construyó una casa no es más importante que el número de minutos, sin embargo, su valor de coeficiente es mucho mayor. Esto significa que la magnitud de un coeficiente no es necesariamente una buena medida de la importancia de una característica en un modelo lineal. #### Una imagen más completa mediante gráficos de dependencia parcial Para comprender la importancia de una característica en un modelo, es necesario entender tanto cómo el cambio en esa característica afecta la salida del modelo, como también la distribución de los valores de esa característica. Para visualizar esto en un modelo lineal, podemos construir un gráfico de dependencia parcial clásico y mostrar la distribución de los valores de la característica como un histograma en el eje x: ~~~python shap.partial_dependence_plot( "MedInc", model.predict, X_test, ice=False, model_expected_value=True, feature_expected_value=True, ) print("Valor en la muestra 20:",X.iloc[indice_muestra]["MedInc"]) ~~~ ![image](https://hackmd.io/_uploads/S1lBB_UBT.png) ~~~python shap.partial_dependence_plot( "AveOccup", model.predict, X_test, ice=False, model_expected_value=True, feature_expected_value=True, ) print("Valor en la muestra 20:",X.iloc[indice_muestra]["AveOccup"]) print("Promedio de MedInc: ",np.mean(X["AveOccup"])) ~~~ ![image](https://hackmd.io/_uploads/SJGPBd8r6.png) Estas expresiones están relacionadas con conceptos estadísticos y matemáticos. Aquí está el significado de cada una: 1. Línea gris horizontal **$E[f(x)]$:** En el gráfico, hay una línea horizontal gris que representa el valor esperado del modelo aplicado al conjunto de datos de viviendas de California. $E[f(x)]$ se refiere a la esperanza matemática o el valor esperado de la función de predicción del modelo $f(x)$. La esperanza matemática es una medida de tendencia central que representa el valor medio de una función ponderado por la probabilidad de cada valor en el dominio de la función. Matemáticamente, se define como: $$ E[f(x)] = \int_{-\infty}^{\infty} f(x) \cdot p(x) \,dx $$ Donde $p(x)$ es la función de densidad de probabilidad de la variable aleatoria $x$. En el contexto de modelos estadísticos o de aprendizaje automático, $f(x)$ podría ser la función de predicción del modelo para una variable de interés $x$. 2. Línea gris vertical **$E[\text(MedInc)]$:** La línea vertical gris representa el valor promedio de la característica "MedInc". En este caso, se está calculando el valor esperado de la variable $\text(MedInc)$, que representa el ingreso medio. La expresión se interpreta como el promedio ponderado del ingreso medio en el conjunto de datos, donde cada valor de ingreso se pondera por su probabilidad de ocurrencia. $$ E[\text(MedInc)] = \int_{-\infty}^{\infty} \text(MedInc) \cdot p(\text(MedInc)) \,d \text(MedInc) $$ 3. La intersección de estas dos líneas se considera el "centro" del gráfico de dependencia parcial con respecto a la distribución de datos. 4. Línea azul **$E[f(x) | \text(MedInc)]$:** La línea azul en el gráfico de dependencia parcial muestra el valor promedio de la salida del modelo cuando se fija la característica "MedInc" a un valor específico. $E[f(x) | \text(MedInc)]$ representa la esperanza condicional de la función $f(x)$ dado un valor específico de $\text(MedInc)$. En otras palabras, es el valor esperado de la función de predicción condicionado a que $\text(MedInc)$ tiene un valor particular. Matemáticamente, se define como: $$ E[f(x) | \text(MedInc)] = \int_{-\infty}^{\infty} f(x) \cdot p(x | \text(MedInc)) \,dx $$ Donde $p(x | \text(MedInc))$ es la función de densidad de probabilidad condicional de $x$ dado un valor específico de $\text(MedInc)$. #### Leyendo valores SHAP desde gráficos de dependencia parcial La idea central detrás de las explicaciones basadas en valores SHAP (Shapley) de modelos de aprendizaje automático es utilizar resultados de asignación justa de la teoría de juegos cooperativos para asignar crédito a la salida de un modelo entre sus características de entrada. Para evaluar un modelo existente cuando solo un subconjunto de características forma parte del modelo, integramos las otras características utilizando una formulación de valor esperado condicional. Esta formulación puede tomar dos formas: $$ E[f(x) | X_s = x_s] $$ o $$ E[f(x) | do(X_s = x_s)] $$ En la primera forma, conocemos los valores de las características en $S$ porque los *observamos*. En la segunda forma, conocemos los valores de las características en $S$ porque los *configuramos*. En general, la segunda forma suele ser preferible, tanto porque nos dice cómo se comportaría el modelo si interviniéramos y cambiáramos sus entradas, como porque es mucho más fácil de calcular. En este tutorial nos centraremos exclusivamente en la segunda formulación. También utilizaremos el término más específico "valores SHAP" para referirnos a los valores Shapley aplicados a una función de expectativa condicional de un modelo de aprendizaje automático. Los valores SHAP pueden ser muy complicados de calcular (en general, son NP-duros), pero los modelos lineales son tan simples que podemos leer los valores SHAP directamente de un gráfico de dependencia parcial. Cuando estamos explicando una predicción, el valor SHAP para una característica específica es simplemente la diferencia entre la salida esperada del modelo y el gráfico de dependencia parcial en el valor de esa característica: ~~~python # calcular los valores SHAP para el modelo lineal explainer = shap.Explainer(model.predict, X100) shap_values = explainer(X_train) ~~~ Valores de SHAP del `Explainer`: Notamos las valores SHAP para cada característica en cada una de las 1000 muestras ~~~python shap_values_values = pd.DataFrame(shap_values.values) shap_values_values.columns = X.columns shap_values_values ~~~ ![image](https://hackmd.io/_uploads/SJYC8uIST.png) Los valores de SHAP, el valor esperado y los datos reales de la característica "MedInc" para la muestra 20. ~~~python # Seleccionar la fila 20 y todas la columna de `MedInc` shap_values[indice_muestra : indice_muestra + 1, "MedInc"] ~~~ ![image](https://hackmd.io/_uploads/BkwzDuUSp.png) 1. **`.values`:** Este es el valor específico del SHAP para la característica "MedInc" en la muestra 20. Indica la contribución de la característica "MedInc" en la predicción del modelo para la observación 20. Un valor negativo sugiere que la presencia de "MedInc" en la muestra 20 ha disminuido la predicción del modelo. 2. **`.base_values`:** Este es el valor base o el valor de referencia para la salida del modelo. Es el valor esperado de la salida del modelo cuando no se considera ninguna característica específica. En este caso, es el valor esperado del modelo para la muestra 20 sin tener en cuenta la característica "MedInc". 3. **`.data`:** Este es el valor específico de la característica "MedInc" en la muestra 20. Indica el valor real de "MedInc" en la observación 20. Es lo mismo que `X.iloc[indice_muestra]["MedInc"]` #### La estrecha relación entre los valores Shapley y el gráfico de dependecia ~~~python shap.partial_dependence_plot( "MedInc", model.predict, X100, model_expected_value=True, feature_expected_value=True, ice=False, shap_values=shap_values[indice_muestra : indice_muestra + 1, :], ) ~~~ ![image](https://hackmd.io/_uploads/ryKDPd8Bp.png) La linea roja que vemos en la gráfica la podemos expresar como la distancia entre $E[f(x)]$ y valor SHAP para la muestra 20 ~~~python print("Valor independiente en la muestra 20 x:",shap_values[indice_muestra,"MedInc"].data) print("Valor real del precio en la muestra 20 f(x):",y_train[indice_muestra]) print("Espectativa de salida E[f(X)]:",shap_values.base_values[indice_muestra]) print("E[f(X)] + SHAP:",shap_values.base_values[indice_muestra] + shap_values[indice_muestra, "MedInc"].values) print("Valor SHAP:",shap_values[indice_muestra, "MedInc"].values) ~~~ ![image](https://hackmd.io/_uploads/rynM_OLr6.png) La estrecha correspondencia entre el clásico gráfico de dependencia parcial y los valores SHAP significa que si representamos gráficamente el valor SHAP para una característica específica en todo un conjunto de datos, trazaremos exactamente una versión centrada en la media del gráfico de dependencia parcial para esa característica: ~~~python Y_shap = shap_values.base_values[:] + shap_values[:, "MedInc"].values X_shap = shap_values[:,"MedInc"].data # Graficar plt.scatter(X_shap, Y_shap,color='r') plt.xlabel("MedInc") plt.ylabel("f(x)") plt.show() ~~~ ![image](https://hackmd.io/_uploads/BJOJYdIr6.png) #### La naturaleza aditiva de los valores Shapley y el gráfico cascada Una de las propiedades fundamentales de los valores Shapley es que siempre suman la diferencia entre el resultado del juego cuando todos los jugadores están presentes y el resultado del juego cuando ningún jugador está presente. Para los modelos de aprendizaje automático, esto significa que los valores SHAP de todas las características de entrada siempre sumarán la diferencia entre la salida del modelo de referencia (esperada) y la salida actual del modelo para la predicción que se está explicando. La forma más fácil de ver esto es a través de un gráfico de cascada que comienza en nuestra expectativa previa de fondo para el precio de una vivienda y luego agrega características una a una hasta llegar a la salida actual del modelo: ~~~python print("Valores SHAP en la muestra 20:") display(shap_values_values.iloc[indice_muestra]) ~~~ ![image](https://hackmd.io/_uploads/HkWXtuLr6.png) ~~~python fx=shap_values.base_values[indice_muestra] for i in shap_values_values.iloc[indice_muestra]: fxp = fx + i print(f"{i} + {fx} = {fxp}") fx=fxp ~~~ ![image](https://hackmd.io/_uploads/rkiHYO8B6.png) ~~~python shap.plots.waterfall(shap_values[indice_muestra]) ~~~ ![image](https://hackmd.io/_uploads/H15vFuIS6.png) ~~~python print("Valor real del precio en la muestra 20:",y_train[indice_muestra]) print("Valor predicho por f(x) en la muestra 20:",model.predict(X_train.iloc[indice_muestra:indice_muestra+1])) print("Espectativa de salida E[f(x)]:",shap_values.base_values[indice_muestra]) print("Valores reales en la muestra 20:") display(X_train.iloc[indice_muestra]) ~~~ ![image](https://hackmd.io/_uploads/SJkcKuUB6.png) #### Un gráfico de resumen simple tipo beeswarm El gráfico de resumen beeswarm está diseñado para mostrar un resumen densamente informativo de cómo las principales características en un conjunto de datos afectan la salida del modelo. Cada instancia de la explicación dada se representa con un único punto en cada fila de características. La posición x del punto está determinada por el valor SHAP (shap_values.value[instancia, característica]) de esa característica, y los puntos se "amontonan" a lo largo de cada fila de características para mostrar la densidad. El color se utiliza para mostrar el valor original de una característica (shap_values.data[instancia, característica]). ~~~python shap.plots.beeswarm(shap_values) ~~~ ![image](https://hackmd.io/_uploads/HJhbcOLBp.png) El gráfico al principio es confuso pero se puede explicar mejor simplemente como la dsitribución de valores de Shapley ~~~python sns.displot(shap_values[:, "Latitude"].values, bins=30, kde=True).set(title='Latitude') ~~~ ![image](https://hackmd.io/_uploads/ByhT9uIB6.png) ~~~python sns.displot(shap_values[:, "Longitude"].values, bins=30, kde=True).set(title='Longitude') ~~~ ![image](https://hackmd.io/_uploads/SkyyiO8Hp.png) ~~~python sns.displot(shap_values[:, "MedInc"].values, bins=30, kde=True).set(title='MedInc') ~~~ ![image](https://hackmd.io/_uploads/SykxodIHT.png) ### Aplicacion libreria shap dataset Irirs, modelacion Random Forest Iris es un conjunto clásico de datos que nos sirve en el ámbito de la aprendizaje automático y la estadística. Contiene 150 observaciones de iris (flor), cada una perteneciente a una de las tres especies: setosa, versicolor y virginica. Cada observación tiene cuatro características: longitud del sépalo, ancho del sépalo, longitud del pétalo y ancho del pétalo, todas medidas en centímetros. Para este conjunto de datos, dividimos los datos en conjuntos de entrenamiento y prueba, se puede entrenar a cualquier tipo de modelo, en este caso se utiliza KNN y random forest, con esto podemos realizar predicciones y evalúar la precisión del modelo utilizando métricas como el informe de clasificación y algunos sesgos de la muestra de datos. ![dataset_iris](https://hackmd.io/_uploads/HkKJ4_ISp.png) Para este conjunto de datos, se necesita las siguientes librerias. ~~~python import shap import time import numpy as np import sklearn from sklearn.model_selection import train_test_split ~~~ Desde sklearn importamos train test split que nos sirve para dividir matrices en subconjuntos especialmente 2 tipos, para pruebas y entrenamiento. Posteriormente se puede definir una funcion de exactitud, que nos sirve para mirar que tan exacto es el modelo. ~~~python X_train, X_test, Y_train, Y_test = train_test_split(*shap.datasets.iris(), test_size=0.2, random_state=0) def print_accuracy(f): print("Accuracy = {}%".format(100 * np.sum(f(X_test) == Y_test) / len(Y_test))) time.sleep(0.5) # to let the print get out before any progress bars shap.initjs() ~~~ Para el primer caso, vamos a utilizar random Forest, con esto podemos aproximar las predicciones y tambien connluir que tipo de modelacion es la mas precisa. from sklearn.ensemble import RandomForestClassifier ~~~python rforest = RandomForestClassifier( n_estimators=100, max_depth=None, min_samples_split=2, random_state=0 ) rforest.fit(X_train, Y_train) print_accuracy(rforest.predict) # explain all the predictions in the test set explainer = shap.KernelExplainer(rforest.predict_proba, X_train) shap_values = explainer.shap_values(X_test) shap.force_plot(explainer.expected_value[0], shap_values[0], X_test) ~~~ ![randomI](https://hackmd.io/_uploads/S1nxddISa.png) Con este gráfico tenemos los valores de shapley en el eje Y, en el eje X tenemos una muestra de 30 flores, los colores indican que tan fuerte es la caracteristica, rojo es mas fuerte, muestra las 4 caracteristicas de la flor iris y nos determina de que tipo de flor es la muestra de datos. ### Aplicacion libreria shap dataset Diabetes, modelacion con regresión lineal El conjunto de datos de diabetes contiene 442 muestras de pacientes. Cada muestra tiene 10 características las cuales son: 1. age age in years 2. sex 3. bmi body mass index 4. bp average blood pressure 5. s1 tc, total serum cholesterol 6. s2 ldl, low-density lipoproteins 7. s3 hdl, high-density lipoproteins 8. s4 tch, total cholesterol / HDL 9. s5 ltg, possibly log of serum triglycerides level 10. s6 glu, blood sugar level El objetivo con estas caracteristicas es determinar cual de ellas incide mas para que un paciente tenga diabetes. De manera concisa, utilizamos el mismo metodo del caso de estudio de iris, con las mismas librerias, para modelara los datos de este data set vamos a usar regresion lineal. ~~~python from sklearn import linear_model lin_regr = linear_model.LinearRegression() lin_regr.fit(X_train, y_train) print_accuracy(lin_regr.predict) Root mean squared test error = 58.51717127731562 ex = shap.KernelExplainer(lin_regr.predict, X_train_summary) shap_values = ex.shap_values(X_test.iloc[0, :]) shap.force_plot(ex.expected_value, shap_values, X_test.iloc[0, :]) shap_values = ex.shap_values(X_test) shap.summary_plot(shap_values, X_test) ~~~ La grafica generada es la siguiente: ![diabetes](https://hackmd.io/_uploads/rJ8UlY8Bp.png) En este grafico tenemos los valores de shapley en el eje X y en el Y tenemos las caracteristicas de este conjunto, S1 colesterol sérico, es la caracteristica mas predominante, quiere decir que los pacientes con colesterol sérico alto tienden a tener diabetes. ## ¿Y ahora qué? ### Explotación de modelos de intelegincia artificial Una forma de utilizar SHAP para auditar la seguridad es identificar las características que tienen un impacto significativo en las predicciones del modelo. Estas características pueden ser objetivos para los atacantes, ya que pueden ser manipuladas para alterar las predicciones del modelo. Por ejemplo, si un modelo de clasificación se utiliza para predecir si una persona es elegible para un préstamo, las características que tienen un impacto significativo en las predicciones podrían ser la edad, el historial crediticio y los ingresos. Un atacante podría intentar manipular estas características para aumentar las posibilidades de que una persona sea aprobada para un préstamo. Otra forma de utilizar SHAP para auditar la explotabilidad es identificar las combinaciones de características que pueden conducir a predicciones incorrectas. Estas combinaciones pueden ser explotadas por atacantes para engañar al modelo para que haga predicciones falsas. Por ejemplo, si un modelo de clasificación se utiliza para diagnosticar una enfermedad, las combinaciones de características que pueden conducir a predicciones incorrectas podrían ser síntomas que son comunes a varias enfermedades. Un atacante podría intentar manipular estas características para que el modelo diagnostique incorrectamente a una persona con una enfermedad que no tiene. Otro ejemplo sería, si un modelo de clasificación de malware estático se utiliza para identificar archivos maliciosos en base a su contenido, las características que tienen un impacto significativo en las predicciones podrían ser la presencia de ciertas cadenas de caracteres, la estructura del archivo o el uso de ciertas funciones. Un atacante podría intentar manipular estas características para que el modelo clasifique incorrectamente un archivo malicioso como no malicioso. ## Conclusión Los valores SHAP son una herramienta de interpretación de modelos de aprendizaje automático que nos permiten comprender cómo las características individuales contribuyen a la salida del modelo. El informe aborda la aplicación de la teoría de juegos cooperativos, específicamente el valor de Shapley, en el contexto del "Juego de los Guantes". Proporciona un análisis detallado de cómo asignar valores de manera justa a los jugadores en un juego colaborativo. Luego, se exploran aplicaciones prácticas en el campo del aprendizaje automático. Se emplea un modelo de regresión lineal para el avalúo de viviendas en California, utilizando el enfoque SHAP para interpretar las predicciones del modelo. Se destacan las ventajas de SHAP, como la interpretación intuitiva y la visualización clara de la importancia de las características. El informe continúa presentando un modelo de clasificación Random Forest en el conjunto de datos Iris y un modelo de regresión lineal en el conjunto de datos Diabetes. En ambos casos, se utiliza SHAP para comprender las decisiones del modelo y se discuten las ventajas de esta metodología. Se enfatiza la importancia de la visualización de gráficos SHAP para simplificar la interpretación. Se concluye que, aunque SHAP es versátil y ofrece transparencia en modelos de inteligencia artificial, la interpretación puede volverse desafiante en modelos extremadamente complejos y no lineales. Pero también se conlcuyen las siguientes ventajas y desventajas: Los valores SHAP tienen una serie de ventajas, entre ellas: * **Son interpretables:** Los valores SHAP tienen un significado intuitivo, ya que representan la contribución marginal de cada característica a la salida del modelo. * **Son robustos:** Los valores SHAP son relativamente robustos a los cambios en los datos de entrenamiento. Sin embargo, los valores SHAP también tienen algunas desventajas, entre ellas: * **Pueden ser computacionalmente costosos de calcular.** * **Pueden ser engañosos en presencia de multicolinealidad.** ## Referencias [^1]: Colaboradores de los proyectos Wikimedia. (2022, March 04). Diferencia de conjuntos - Wikipedia, la enciclopedia libre. Retrieved from <https://es.wikipedia.org/w/index.php?title=Diferencia_de_conjuntos> [^2]: Bamio Martínez, D. (2023). El valor de Shapley. Trabajo Fin de Grao, Universidad de Santiago de Compostela. [En línea]. Disponible en: <https://minerva.usc.es/xmlui/bitstream/handle/10347/26022/Bamio%20Mart%C3%ADnez,%20David.pdf> [^3]: Vesga Ferreira, J. C., Granados Acuña, G., & Sierra Carrillo, J. E. (2015). El valor de shapley como estrategia de optimización de recursos sobre Power Line Communication (PLC). Disponible en: <http://www.scielo.org.co/pdf/ince/v11n22/v11n22a09.pdf> [^4]: L. S. Shapley, “A value for n-persons games in Contributions to the Theory of Games II,” Annals of Mathematics Studies, no. 28, pp. 307–317, 1953. [5^]: Handbook of the Shapley Value. (2019). United Kingdom: CRC Press. Retrived from: <http://rguir.inflibnet.ac.in/bitstream/123456789/16159/1/Handbook%20of%20the%20Shapley%20Value.pdf> [^6]: Harsanyi, J.C. (1959) A bargaining model for cooperative n-person games. In: Tucker, A.W., Luce, R.D. (eds) Contributions to the theory of games IV. Princenton University Press, Princenton, pp. 325-355 [^7]: Grabisch, M. (2016). Set Functions, Games and Capacities in Decision Making. Germany: Springer International Publishing. [^8]: Molnar, C. (2023, 30 de noviembre). SHAP: A Unified Approach to Explain the Output of Any Machine Learning Model. [En línea]. Recuperado de https://shap.readthedocs.io/en/latest/ [^9]: Torgo, L. (2023). California Housing Prices Dataset. Retrieved from https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.html [^10]: Rosero, F., Díaz, M., Burgos, S., (2023). Proyecto SHAP. Tomado de https://github.com/IA-2023-2-SHAP/proyecto-shap

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully