Más allá de la métrica

Este taller complementa a la mayoría de los cursos introductorios sobre aprendizaje automático (machine learning) supervisado, que a menudo se centran solamente en optimizar métricas de rendimiento. Si no has realizado un curso introductorio sobre aprendizaje automático supervisado, encontrarás un resumen en el Jupyter Notebook llamado Exploration_and_Classification.ipynb.

El análisis completo es una serie de 3 Jupyter Notebooks, en este orden:

  • Exploration_and_Classification.ipynb donde exploramos y preparamos los datos, probamos varios modelos de aprendizaje automático supervisado para clasificación, explicamos las métricas de rendimiento y el umbral de decisión, y elegimos el modelo que nos da mejor rendimiento,
  • XAI.ipynb donde aplicamos varios métodos de explicabilidad o XAI, y
  • UQ.ipynb donde aplicamos varios métodos de cuantificación de incertidumbre o UQ.

Para profundizar en la aplicación de la UQ, ver el cuarto Jupyter Notebook UQ_multiclass.ipynb donde se incluye el código para la explicación de este mini curso de Christoph Molnar y el quinto Jupyter Notebook UQ_TimeSeriesClassification.ipynb donde aplicamos UQ a la clasificación de series temporales.

Si prefieres solo mirar el contenido sin ejecutarlo, aquí tienes los enlaces a cada uno de los temas:

NBViewer Exploración de los datos y selección del modelo de aprendizaje supervisado para la Clasificación

NBViewer Herramientas de Explicabilidad (XAI)

NBViewer Herramientas de Cuantificación de Incertidumbre (UQ)

NBViewer Conformal Predictors (CP) para la UQ en ejemplo de clasificación multiclase

NBViewer Conformal Predictors (CP) para la UQ en un ejemplo de clasificación de series temporales

y el enlace a las diapositivas de las presentaciones introductorias (contienen animaciones, mejor verlas en modo presentación):

Como decíamos, ésta es una serie introductoria y no incluimos explicaciones exhaustivas ni demostraciones matemáticas (hay muchas otras fuentes, ver la lista de materiales en la intro de los Jupyter Notebooks), mejor mencionaremos algunas características intuitivas sobre la explicabiliad y la cuantificación de la incertidumbre y nos enfocaremos en su implementación en Scikit-learn (una de las librerías de Python más utilizadas en aprendizaje automático) y paquetes compatibles.

Exactitud con certidumbre

En inteligencia artificial, medimos la calidad de las predicciones de un modelo de aprendizaje automático supervisado a través de métricas de rendimiento. Por ejemplo, la métrica de exactitud (accuracy) en una tarea de clasificación cuenta cuántas veces el modelo nos dió la solución correcta y el error cuadrático medio (MSE) en una tarea de regresión mide a qué distancia se quedó el modelo de la solución correcta. Sin embargo, las métricas de rendimiento no nos ofrecen certeza sobre las predicciones del modelo y esto es un gran problema, sobre todo si es un modelo no interpretable por las personas, también llamados modelos de caja opaca (‘black box models’).

Un ejemplo típico son los grandes modelos de aprendizaje profundo (deep learning) fallando al intentar identificar una vaca en la playa. Esto sucede porque lo que en realidad aprendió el modelo durante su entrenamiento fue a reconocer la hierba en las imágenes del conjunto de entrenamiento (training set). Son modelos muy exactos (puede que hasta obtengamos más de un 95% de aciertos (accuracy) en su validación y testado), pero en una tarea distinta, no deseada (queríamos detectar vacas, no hierba). El modelo simplemente encontró una correlación espúrea y cogió el atajo. Y sin poder avisarnos, arroja predicciones sesgadas.

Otro ejemplo clásico es el del modelo clasificador entrenado con imágenes de gatos y perros que, por ejemplo, etiquetamos como clase 1 y clase 0, respectivamente. Si cuando lo ponemos en producción el resultado de una imagen es “0.8”, muchos libros, cursos,… concluyen que eso significa que “hay un 80% de probabilidad de que la imagen sea de un gato y un 20% de probabilidad de que sea de un perro”. Sin embargo, esos resultados no están calibrados, es decir, no tiene en cuenta cuántos perros y gatos hay de verdad, y por tanto no son verdaderas probabilidades. Pero la cosa empeora, ¿qué ocurre si lo que le mostramos al modelo es la imagen de un pájaro? El modelo no tiene manera de decirnos “no tengo ni idea de qué es esto”, simplemente arrojará un resultado, que en el mejor de los casos estará cerca de “0.5” pero no hay ninguna garantía de que así sea. Y se quedará tan pancho, porque no le hemos dado herramientas para mostrar la incertidumbre.

Al automatizar predicciónes, si solamente nos fijamos en las métricas de rendimiento, estos problemas puede pasar fácilmente desapercibidos y aumentar el tamaño del training set no necesariamente los soluciona. Podemos cerciorarnos de que esto no nos pasa incorporando a nuestro modelo ya entrenado ciertas herramientas sencillas para que pueda indicarnos cuándo su predicción es fiable y cuándo no. Estas herramientas matemáticas (ya desarrolladas como librerías de Python y R) explican en qué se fijó el modelo para producir sus predicciones (gracias a métodos de explicabilidad o “XAI”, como los SHAP values, LIME,…) o nos proveen de probabilidades calibradas y intervalos de predicción que incluyen con certeza el valor verdadero para que el modelo pueda avisarnos cuando no debemos confiar en su predicción (gracias a métodos de cuantificación de incertidumbre o “UQ”, como los Conformal Predictors). Y todas son herramientas post-hoc (no hay que volver a entrenar el modelo), model-agnóstic (sirven para cualquier modelo y tarea), y muy ligeras (se implementan con pocas líneas de código y se ejecutan muy rápido).

👍🤓

Instrucciones

  1. Clona este repositorio en el ordenador o nube donde vayas a trabajar. Si no tienes el paquete git instalado, aquí explica cómo hacerlo. Para clonar el repositorio, pincha en el botón verde que dice 'Code', copia al portapapeles la dirección htpps, y pégala en una terminal donde vayas a trabajar, escribiendo git clone, un espacio, y la dirección htpps de este repositorio, tardará unos segundos en descargarse.

  2. Si no tienes el administrador de paquetes conda instalado, puedes simplemente instalar miniconda siguiendo las instrucciones para tu sistema operativo aquí. Al instalar miniconda se instala Python también, viene incluido. Después, abre una terminal (de Bash si estás en Linux o Mac, Anaconda Prompt si estás en Windows) y escribe:

  • conda env create -f environment.yml

    ⚠️ Crear el entorno por primera vez puede tardar unos 10 minutos pero puede que más, porfa, tráelo ya hecho cuando vengas al taller.

  1. Activa el entorno escribiendo en la terminal:
  • conda activate intro_UQ_XAI

    Cuando acabes con este proyecto, desactiva el entorno escribiendo en la terminal:

  • conda deactivate

  1. Con el entorno activo, vamos a instalar los paquetes de XAI LIME y SHAP y el paquete de UQ MAPIE que es mejor instalarlos via pip en lugar de usar conda, tardarán unos pocos minutos en instalarse, para ello escribe en la terminal
  • python3 -m pip install lime shap MAPIE
  1. Siempre con el entorno activo, abre la aplicación de Jupyter para editar y ejecutar el código en Jupyter Notebooks escribiendo en la terminal:
  • jupyter notebook

Jupyter se abrirá en el browser que tengas por defecto (Firefox, Chrome,...). Los Jupyter Notebooks son los ficheros con extensión .ipynb, se abren clicando en ellos. Sigue las instrucciones escritas allí. Aconsejamos empezar por Exploration_and_Classification.ipynb.

📝 Este taller se realizó por primera vez en la PyConES22 viernes 30 de Septiembre de 2022 de 15:30h a 17:30h. En el taller de la PyConES22 damos este Jupyter Notebook por sabido y empezamos directamente con XAI.ipynb. Todas las charlas de la PyConES 2022 que se mencionan como material complementario en los Jupyter Notebooks pueden encontrarse en la lista de reprodución del canal de youtube de Python Espana.