Explicabilidad de modelos de ML: LIME 🍋
Te has encontrado alguna vez ante la necesidad de entender cómo funciona un modelo de Machine Learning (ML)? ¿Qué hace exactamente cuando procesa los datos y produce sus predicciones o recomendaciones? En este artículo, exploraremos el método LIME (Local Interpretable Model-agnostic Explanations), una herramienta poderosa para la explicabilidad de los modelos de ML.
LIME, o Local Interpretable Model-Agnostic Explanations, es un algoritmo que puede explicar las predicciones de cualquier clasificador o regresor de una manera fiel, aproximándolo localmente con un modelo interpretable. Modifica una sola muestra de datos ajustando los valores de la variable estudiada y observa el impacto resultante en la salida. Desempeña el papel de un “explicador” para explicar las predicciones de cada muestra de datos. El resultado de LIME es un conjunto de explicaciones que representan la contribución de cada característica a una predicción para una sola muestra, que es lo que significa, interpretabilidad local.
¿Cómo lo hace?
Primero, olvídate de los datos de entrenamiento e imagina que solo tienes el modelo del que no entiendes lo que te están diciendo tus variables y donde puedes ingresar puntos de datos y obtener las predicciones del modelo. Tu objetivo es comprender por qué el modelo de ML hace una determinada predicción. LIME prueba lo que sucede con las predicciones cuando se varían los datos en el modelo de aprendizaje automático. LIME genera un nuevo conjunto de datos que consiste en muestras “modificadas” y las predicciones correspondientes del modelo . En este nuevo conjunto de datos, LIME entrena un modelo interpretable, que se pondera por la proximidad de las instancias muestreadas a la instancia de tu modelo inicial, del que no sabias nada de las variables, es decir, una mayor proximidad de los datos a tu modelo actual tendrá más peso que una menor proximidad. El modelo interpretable puede ser un árbol de decisión o regresión.
La receta de implementación 📖
- Selección de la variable de interés: Elige la instancia específica cuya predicción quieres explicar. Por ejemplo, si estás intentando predecir el precio de una casa, podrías elegir una casa específica como tu instancia de interés.
- Modificación del conjunto de datos: Modifica algunos valores en el conjunto de datos para crear nuevos puntos de entrada. Esto se hace para ver cómo afecta la perturbación a la predicción de la instancia de interés.
- Obtención de predicciones de caja negra: Usa el modelo de ML para predecir el valor de la instancia de interés y también para los nuevos puntos generados en el paso anterior.
- Ponderación de las nuevas muestras: Asigna un peso a cada nueva muestra basándote en su proximidad a la instancia de interés. Las muestras más cercanas tendrán un mayor peso, mientras que las menos cercanas tendrán un menor peso.
- Entrenamiento de un modelo ponderado e interpretable: Utiliza el conjunto de datos modificado y las predicciones de caja negra para entrenar un modelo de ML que sea tanto ponderado como interpretable. Esto significa que el modelo debe ser capaz de darte resultados precisos y fácilmente comprensibles.
- Interpretación de la predicción: Analiza el modelo entrenado para entender cómo contribuyen las diferentes características al resultado final. Esto te permitirá identificar las variables más importantes para la predicción de la instancia de interés.
Aquí tienes un ejemplo de código de Python 🐍 en el que se entiende de manera clara el concepto de proximidad y pesos respectivamente
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import mean_squared_error
# Cargar datos
X = ... # Características de los datos
y = ... # Etiquetas de los datos
# Seleccionar instancia de interés
instance_of_interest = X[np.random.choice(len(X))]
# Perturbar datos
n_perturbations = 100
noise = np.random.normal(size=(n_perturbations, len(X))) * 0.1
perturbed_X = X + noise
# Obtener predicciones de caja negra para los nuevos puntos
clf = RandomForestClassifier().fit(X, y)
predicted_labels = clf.predict(perturbed_X)
# Ponderar nuevas muestras según su proximidad a la instancia de interés
distances = np.linalg.norm(perturbed_X - instance_of_interest, axis=1)
weights = 1 / distances ** 2
weighted_predicted_labels = predicted_labels * weights
# Entrenar modelo ponderado e interpretable
clf_ponderated = RandomForestClassifier().fit(X, weighted_predicted_labels)
# Explicar predicción interpretando el modelo local
local_model = clf_ponderated.get_local_model(instance_of_interest)
feature_importance = local_model.feature_importances_
plt.figure(figsize=(8, 6))
plt.barh(range(len(feature_importance)), feature_importance, align='center')
plt.yticks(range(len(feature_importance)), feature_names)
plt.xlabel('Importancia de la característica')
plt.title('Características más importantes para la predicción de la instancia de interés')
plt.show()
Y dirás, ¿Qué es todo este código? Es una explicación de lo que por detrás haría la librería LIME, aquí está el código simplificado de implementación.
import pandas as pd
import lime
import lime.lime_tabular
# Preparar el dataset y la instancia de interés
dataset = pd.read_csv("tu_dataset.csv")
instancia_de_interes = dataset.iloc[[0]]
# Crear un objeto LimeTabularExplainer para analizar el dataset
explainer = lime.lime_tabular.LimeTabularExplainer(dataset)
# Utilizar el método explain_instance() para obtener la importancia de cada característica en la predicción de la instancia de interés
explanation = explainer.explain_instance(instancia_de_interes, top_labels=5)
print(explanation)
# Utilizar el método most_important_features() para obtener las características más importantes para la predicción de la instancia de interés
most_important_features = explanation.most_important_features()
print(most_important_features)
A modo de resumen, hemos visto la necesidad y utilidad de obtener métodos de explicabilidad de cara a presentar y poner en producción nuestros modelos de ML de manera efectiva y tener palancas de acción sobre los resultados obtenidos. Después hemos visto la receta para obtener los valores LIME de manera teórica, lo hemos implementado en Python de manera “más manual” y luego finalmente directamente aplicando la librería de Python lime.
Do you identify as Latinx and are working in artificial intelligence or know someone who is Latinx and is working in artificial intelligence?
- Get listed on our directory and become a member of our member’s forum: https://forum.latinxinai.org/
- Become a writer for the LatinX in AI Publication by emailing us at publication@latinxinai.org
- Learn more on our website: http://www.latinxinai.org/
Don’t forget to hit the 👏 below to help support our community — it means a lot!