Модели МО часто сравнивают с "черными ящиками" из-за их неспособности ясно объяснить свои решения. Проблема "черного ящика" возникает, когда внутренняя работа модели настолько сложна или неясна, что даже ее создатели не могут точно понять, как был получен тот или иной результат. Это создает серьезные проблемы, особенно в ситуациях, требующих строгой подотчетности и прозрачности.

Методы к LIME (Local Interpretable Model-agnostic Explanations) и SHAP (SHapley Additive exPlanations), позволяют получить понимание решений, принятых сложными моделями.

LIME

Метод LIME был разработан группой исследователей во главе с Марко Тулио Рибейро. Основная работа, описывающая LIME, была представлена в 2016 году в документе под названием "Why Should I Trust You?": Explaining the Predictions of Any Classifier". Развитие этой техники было частью более широких усилий сообщества ML, направленных на повышение прозрачности и понимания машинных алгоритмов.

С появлением LIME сообщество получило инструмент, который можно использовать с любой моделью машинного обучения, будь то простая логистическая регрессия или сложная глубокая нейронная сеть, для создания интерпретируемых объяснений её предсказаний. Это было важно в областях, требующих прозрачности и объяснимости, таких как здравоохранение, финансовые услуги и правоохранительная деятельность.

Принцип работы LIME

Выборка локальных данных

Исходная точка, для которой требуется интерпретация, выбирается из набора данных. Это может быть любой пример (например, строка данных для табличных данных, изображение, текст и т.д.), для которого было сделано предсказание сложной модели.

Эта точка служит центром локального анализа и основой для генерации новых, возмущенных примеров данных. Возмущения создаются путем внесения небольших изменений в исходные данные. Эти изменения могут быть реализованы различными способами, в зависимости от типа данных:

  1. Для табличных данных: Изменение значений признаков, добавление шума, использование техник, таких как бутстраппинг.

  2. Для текстовых данных: Удаление или замена слов, изменение частей текста.

  3. Для изображений: Изменение пикселей, применение фильтров, небольшие искажения.

Цель состоит в том, чтобы создать набор данных, который отражает возможные вариации вокруг выбранной исходной точки.

Каждый возмущенный пример получает вес, основанный на его близости к исходной точке. Это обеспечивает, что примеры, более близкие к исходной точке, будут иметь большее влияние на обучение интерпретируемой модели.

Взвешивание может быть выполнено с использованием различных методов, таких как ядерные функции. Обычно используется Гауссово (нормальное) распределение, где примеры, ближе расположенные к исходному, получают больший вес.

Используя этот взвешенный набор данных, обучается простая интерпретируемая модель (например, линейная модель). Эта модель стремится приблизить предсказания сложной модели в локальной области, окружающей исходную точку.

Важно, чтобы сгенерированные данные адекватно отражали разнообразие возможных сценариев вокруг исходной точки.

Слишком большое возмущение может привести к тому, что локальная модель не будет адекватно отражать поведение сложной модели в интересующей области.

Необходимо поддерживать баланс между достаточнымколичеством возмущений для надежной интерпретации и избежанием избыточного количества данных, что может привести к переобучению интерпретируемой модели.

Прогнозы сложной модели

Сложная модель, которую необходимо интерпретировать, может быть любого типа — от нейронной сети до сложного ансамбля моделей. Главное, чтобы эта модель была уже обучена и способна делать предсказания.

LIME не требует изменений в самой сложной модели или ее внутренней структуре, что делает метод универсальным и применимым к широкому спектру моделей.

Сложная модель применяется к каждому возмущенному примеру данных, сгенерированному на предыдущем шаге. Для каждого примера записывается предсказание сложной модели. Эти предсказания покажут, как модель реагирует на изменения в данных.

Анализируя, как меняются предсказания в ответ на возмущения, можно получить представление о том, какие факторы влияют на решения модели. Определенные изменения в данных могут сильно изменять предсказания модели, указывая на важность этих факторов в процессе принятия решений.

Результаты предсказаний вместе с соответствующими весами и исходными данными возмущенных примеров используются для обучения интерпретируемой модели на следующем этапе процесса LIME.

Качество и точность предсказаний сложной модели напрямую влияют на качество интерпретации LIME.

Важно, чтобы возмущенные данные соответствовали области применимости сложной модели, чтобы предсказания были релевантными и точными.

Взвешивание примеров

Взвешивание примеров направлено на обеспечение того, чтобы интерпретируемая модель фокусировалась на данных, наиболее близких к точке интереса (исходному примеру, для которого мы хотим получить объяснение).

Веса определяют, насколько значим каждый пример для понимания поведения сложной модели в локальном контексте.

Обычно используются ядерные функции, такие как Гауссово (нормальное) ядро, для вычисления весов примеров. Эти функции уменьшают веса для примеров, которые находятся дальше от центральной точки интереса.

Вес каждого примем ядром, это расстояние обычно возводится в квадрат и умножается на отрицателра часто определяется на основе его расстояния до исходного примера. В случае с Гауссовыьное значение, что приводит к уменьшению веса с увеличением расстояния.

Вес для каждого примера wi​ может быть вычислен как

w_i = \exp(-\frac{d(x, x_i)^2}{2\sigma^2})

где d(x,xi​) - расстояние между исходным примером x и возмущенным примером xi а σ — параметр ширины ядра.

Параметр σ можно настраивать в зависимости от желаемого уровня локализации объяснений. Меньшие значения σ приводят к более узкому фокусу вокруг исходного примера.

Слишком большой вес близких примеров может привести к игнорированию важной информации в более далеких примерах, тогда как слишком маленький вес может размыть локальный контекст.

Взвешивание должно быть адаптировано к типу данных и особенностям задачи, чтобы обеспечить наиболее точное и полезное объяснение.

Обучение интерпретируемой модели

В качестве интерпретируемой модели обычно используются простые модели, такие как линейные регрессии или деревья решений. Выбор зависит от необходимости баланса между простотой интерпретации и способностью адекватно моделировать локальное поведение сложной модели.

Линейные модели предпочтительны за их прозрачность и понятность, ведь их коэффициенты могут быть напрямую интерпретированы как важность признаков.

Для обучения интерпретируемой модели используются данные, сгенерированные на предыдущих шагах, включая возмущенные примеры и их соответствующие веса. Данные должны быть представлены в форме, подходящей для выбранной модели, включая преобразование категориальных данных, нормализацию и т.д.

Обучение проводится с учетом весов примеров. Примеры с большим весом будут иметь большее влияние на формирование модели. Модель обучается таким образом, чтобы как можно лучше приблизить предсказания сложной модели для данного набора локальных данных.

Нужно тщательно подобрать гиперпараметры интерпретируемой модели, такие как степень регуляризации для линейных моделей, чтобы предотвратить переобучение и обеспечить хорошее обобщение.

Может быть использована кросс-валидация для оценки качества и стабильности модели на локальных данных.

В случае линейной модели, коэффициенты можно интерпретировать как важность признаков. Положительные коэффициенты указывают на увеличение вероятности прогноза с увеличением значения признака, и наоборот для отрицательных коэффициентов.

Важно оценить, насколько хорошо интерпретируемая модель приближает поведение исходной сложной модели в локальной области.

Сложность интерпретируемой модели должна быть достаточной для адекватного моделирования локального поведения, ноне слишком высокой, чтобы избежать потери интерпретируемости.

Необходимо найти баланс между точностью и простотой модели для обеспечения наилучшей интерпретируемости результатов.

Интерпретация результатов

LIME предоставляет интерпретируемые модели (обычно линейные), которые показывают, как изменение входных признаков влияет на предсказание модели.

Результаты LIME являются локальными, то есть они объясняют предсказание модели для конкретного примера или наблюдения, а не для всего набора данных.

В случае линейной модели коэффициенты могут быть положительными или отрицательными, указывая на то, как признак влияет на предсказание (положительно или отрицательно). Величина коэффициентов указывает на степень важности признаков. Большие абсолютные значения коэффициентов свидетельствуют о большем вкладе признака в предсказание.

Примеры применения

Интерпретация логистической регрессии на наборе данных ирисов Фишера

import lime
import lime.lime_tabular
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# Загрузка набора данных ирисов
iris = datasets.load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0)

# Обучение логистической регрессии
logistic_model = LogisticRegression(multi_class='auto', solver='liblinear')
logistic_model.fit(X_train, y_train)

# Создание объекта LIME для табличных данных
explainer = lime.lime_tabular.LimeTabularExplainer(X_train, feature_names=iris.feature_names, class_names=iris.target_names, discretize_continuous=True)

# Выбор примера из тестового набора для интерпретации
i = 25  # пример для интерпретации
exp = explainer.explain_instance(X_test[i], logistic_model.predict_proba, num_features=2)

exp.as_list()

Интерпретация решений случайного реса в задаче кредитного скоринга

import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# Загрузка и подготовка данных
data = pd.read_csv('credit_scoring_dataset.csv')
X = data.drop('target', axis=1)
y = data['target']

# Разделение данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Обучение модели случайного леса
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)

# Использование LIME
explainer = lime.lime_tabular.LimeTabularExplainer(X_train.values, feature_names=X.columns, class_names=['Rejected', 'Approved'], discretize_continuous=True)
i = 33  # пример для интерпретации
exp = explainer.explain_instance(X_test.iloc[i].values, rf_model.predict_proba, num_features=5)

exp.as_list()

Интерпретация нейронной сети для классификации изображений

import lime
import lime.lime_image
from keras.models import load_model
from keras.preprocessing import image
import matplotlib.pyplot as plt

# Загрузка предварительно обученной модели нейронной сети
model = load_model('my_cnn_model.h5')

# Загрузка изображения для интерпретации


img = image.load_img('test_image.jpg', target_size=(224, 224))
img = image.img_to_array(img)
img = np.expand_dims(img, axis=0)

# Использование LIME для изображений
explainer = lime.lime_image.LimeImageExplainer()
exp = explainer.explain_instance(img, model.predict, top_labels=5, hide_color=0, num_samples=1000)

# Визуализация результатов
image, mask = exp.get_image_and_mask(exp.top_labels[0], positive_only=True, num_features=5, hide_rest=True)
plt.imshow(image)
plt.show()

Интерпретация решений SVM в текстовой классификации

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
import lime
import lime.lime_text

# Предположим, что у нас есть текстовые данные для классификации
texts, labels = load_text_data()  # Загрузка данных

# Разделение данных
X_train, X_test, y_train, y_test = train_test_split(texts, labels, test_size=0.2, random_state=42)

# Создание и обучение модели SVM с использованием TfidfVectorizer
svm_pipeline = make_pipeline(TfidfVectorizer(), SVC(probability=True))
svm_pipeline.fit(X_train, y_train)

# Интерпретация с LIME
explainer = lime.lime_text.LimeTextExplainer(class_names=['Negative', 'Positive'])
i = 17  # пример для интерпретации
exp = explainer.explain_instance(X_test[i], svm_pipeline.predict_proba, num_features=6)

exp.as_list()

SHAP

SHAP (SHapley Additive exPlanations) — это метод интерпретации машинного обучения, который объясняет вклад каждого признака в предсказание конкретного наблюдения. Он основывается на концепции значений Шепли — методе из кооперативной теории игр, который распределяет "выигрыш" (или влияние) между всеми участниками игры (в контексте SHAP — между признаками модели).

Концепция значений Шепли взята из теории игр и была адаптирована для объяснения предсказаний машинного обучения. Это позволило применять теоретически обоснованный подход для интерпретации сложных моделей.

SHAP был впервые представлен в статье "A Unified Approach to Interpreting Model Predictions" Скоттом Ландбергом (Scott Lundberg) и Су-Ин Ли (Su-In Lee) в 2017 году. Основной идеей было создание единого, теоретически обоснованного подхода к объяснению предсказаний моделей машинного обучения.

В контексте машинного обучения, значением Шепли признака является среднее маржинальное вклады этого признака в предсказание модели по всем возможным комбинациям других признаков. Этот подход гарантирует справедливое распределение вклада между всеми признаками.

SHAP присваивает каждому признаку отдельное значение, которое можно суммировать для получения общего вклада всех признаков в предсказание модели.

Принцип работы SHAP (SHapley Additive exPlanations)

Выбор наблюдения для анализа

В зависимости от цели анализа, наблюдение может быть выбрано из-за его необычности (например, ошибочное предсказание), из-за его типичности (представительный случай) или по другим причинам, важным для исследования.

Наблюдение выбирается из того же набора данных, на котором обучена модель. Это может быть часть обучающей выборки, тестовой выборки или новые данные. Важно, чтобы выбранное наблюдение было совместимо с моделью, т.е. содержало все необходимые признаки в правильном формате.

Сначала определяется контекст анализа. Например, если интересует объяснение ошибочных предсказаний, то выбираются такие наблюдения из тестовых данных. Часто полезно анализировать распределение данных и выбирать наблюдения, которые представляют интересные случаи, такие как выбросы или крайние точки.

Могут использоваться различные метрики (например, вероятность, предоставленная моделью, или величина ошибки) для определения наиболее подходящих наблюдений для анализа. В некоторых сценариях может использоваться случайный выбор наблюдений для получения общего представления о поведении модели.

Создание "коалиций" признаков

В SHAP, коалиция представляет собой подмножество всех доступных признаков в наборе данных. Каждая коалиция образует уникальную комбинацию признаков.

Коалиции используются для моделирования различных сценариев, при которых определенные признаки присутствуют или отсутствуют в данных, позволяя оценить их индивидуальный и коллективный вклад в предсказание модели.

Для каждого наблюдения создаются все возможные комбинации признаков. Это включает сценарии, где некоторые признаки присутствуют, а некоторые отсутствуют.

Для набора из N признаков, это означает создание (2^N) различных подмножеств, включая пустое множество (где отсутствуют все признаки) и полное множество (где присутствуют все признаки).

Из-за экспоненциального роста количества комбинаций при увеличении числа признаков, часто используются приближенные методы для оценки вклада признаков без полного перебора всех комбинаций.

Полный перебор всех возможных коалиций может быть вычислительно затратным, особенно для больших наборов данных с множеством признаков.

Расчет вклада каждого признака

Для каждой коалиции признаков вычисляется вклад признака, который оценивает, насколько изменяется предсказание модели при добавлении этого признака к коалиции.

Производится перебор всех возможных коалиций признаков, и для каждой из них вычисляется, как изменится предсказание модели при добавлении рассматриваемого признака.

Вычисляется среднее взвешенное влияние признака на предсказание модели, учитывая все возможные коалиции. Это среднее и является значением Шепли для данного признака.

Значение Шепли признака i для предсказания f определяется формулой:

 [ \phi_i(f) = \sum_{S \subseteq N \setminus {i}} \frac{|S|!(|N|-|S|-1)!}{|N|!} \left[ f(S \cup {i}) - f(S) \right]

где:

  • N — полный набор признаков,

  • S — подмножество признаков без i,

  • f(S) — предсказание модели с признаками S,

  • f(S∪{i}) — предсказание модели с признаками S плюс признак i.

Полный перебор всех возможных коалиций для каждого признака является вычислительно затратным, особенно при большом количестве признаков. Часто используются алгоритмические приёмы и приближённые методы для уменьшения количества необходимых вычислений.

Агрегирование результатов

Значения Шепли для всех признаков суммируются для каждого наблюдения, чтобы оценить их коллективный вклад в предсказание модели. Агрегированные данные предоставляют информацию о том, какие признаки в целом имеют наибольшее и наименьшее влияние на предсказания модели.

Часто используется среднее значение вкладов признаков по всем наблюдениям для понимания общего влияния признака в разных сценариях.

Для наглядности результаты могут быть представлены в виде диаграмм и графиков, таких как SHAP summary plots и bee swarm plots, которые показывают распределение вкладов признаков по всем наблюдениям.

SHAP Summary Plot представляет собой общий обзор влияния каждого признака на модель. Отображает как средний вклад признаков, так и распределение этих вкладов.

SHAP Summary Plot
SHAP Summary Plot

иBee Swarm Plot показывает распределение вкладов каждого признака для каждого наблюдения, выделяя ключевые признаки и их влияние.

Bee Swarm Plot
Bee Swarm Plot

Примеры использования SHAP в различных моделях

Линейная регрессия

import shap
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# Загрузка и подготовка данных
data = pd.read_csv('your_dataset.csv')  # замените на путь к любому вашему набору данных
X = data.drop('target', axis=1)
y = data['target']

# Разделение данных и обучение модели
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LinearRegression().fit(X_train, y_train)

# Использование SHAP
explainer = shap.Explainer(model, X_train)
shap_values = explainer(X_test)

shap.summary_plot(shap_values, X_test)

Дерево решений

from sklearn.tree import DecisionTreeRegressor

# Обучене дерева решений
tree_model = DecisionTreeRegressor(random_state=42).fit(X_train, y_train)

# Использование SHAP для дерева решений
tree_explainer = shap.Explainer(tree_model, X_train)
tree_shap_values = tree_explainer(X_test)

shap.summary_plot(tree_shap_values, X_test)

Случайный лес

from sklearn.ensemble import RandomForestRegressor

# Обучение случайного леса
rf_model = RandomForestRegressor(n_estimators=100, random_state=42).fit(X_train, y_train)

# Использование SHAP для случайного леса
rf_explainer = shap.Explainer(rf_model, X_train)
rf_shap_values = rf_explainer(X_test)

shap.summary_plot(rf_shap_values, X_test)

Градиентный бустинг (XGBoost)

import xgboost as xgb

# Обучение модели XGBoost
xgb_model = xgb.XGBRegressor(objective='reg:squarederror').fit(X_train, y_train)

# Использование SHAP для XGBoost
xgb_explainer = shap.Explainer(xgb_model, X_train)
xgb_shap_values = xgb_explainer(X_test)

shap.summary_plot(xgb_shap_values, X_test)

Перед использованием SHAP необходимо установить библиотеку shap через pip: pip install shap.

Сравнение LIME и SHAP

Параметр/Метод

LIME

SHAP

Основная Идея

Создаёт интерпретируемые модели, аппроксимирующие предсказания сложной модели в локальной области

Использует теорию игр (значения Шепли) для объяснения вклада каждого признака в предсказание модели

Методология

Оценка локальной интерпретируемости через линейные модели или простые деревья решений

Глобальная интерпретация через агрегирование значений Шепли для каждого признака

Тип интерпретации

Локальная (для отдельных примеров)

Локальная и глобальная (для отдельных примеров и в целом для модели)

Вычислительная сложность

Относительно низкая

Высокая, особенно для моделей с большим количеством признаков

Применимость к моделям

Модельно-агностичный (подходит для любой модели)

Модельно-агностичный, но оптимизации и реализации могут варьироваться для разных типов моделей

Интуитивность результатов

Интерпретация легко понимается благодаря простоте моделей

Требует более глубокого понимания теории игр и значений Шепли для полного понимания

  • Где лучше использовать LIME:

    • Когда необходимо интерпретировать отдельные предсказания, например, для объяснения причин отказа в кредите.

    • В случаях, когда важна скорость и вычислительная эффективность.

    • При работе с небольшими наборами данных, где локальное поведение модели может существенно отличаться.

  • Где лучше использовать SHAP:

    • Для получения глубокого и всестороннего понимания влияния признаков как на отдельные предсказания, так и на модель в целом.

    • В ситуациях, где требуется объяснение предсказаний сложных моделей, включая ансамблевые и нейронные сети.

    • При анализе больших наборов данных, где важно понимать общие тенденции и взаимодействия признаков.

Заключение

Выбор между LIME и SHAP зависит от специфики задачи, требований к интерпретации и ограничений по вычислительным ресурсам. В некоторых случаях может быть даже полезно использовать оба инструмента в комбинации, чтобы получить как глубокое понимание общего влияния признаков (через SHAP), так и ясные интерпретации отдельных предсказаний (через LIME).

Напоследок хочу порекомендовать бесплатный урок, в рамках которого вы узнаете как работать с Langchain и как использовать языковые модели для ответов с учетом вашей базы знаний. Регистрация доступна по ссылке.

Комментарии (0)