Как использовать пакет SHAP-IQ для выявления и визуализации взаимодействий признаков в моделях машинного обучения с помощью индексов взаимодействия Шепли (SII)
В мире машинного обучения понимание того, как различные признаки взаимодействуют друг с другом, становится все более важным. Пакет SHAP-IQ предлагает мощные инструменты для анализа этих взаимодействий, позволяя глубже понять, как они влияют на предсказания модели. В этой статье мы рассмотрим, как использовать SHAP-IQ для выявления и визуализации взаимодействий признаков, что поможет вам принимать более обоснованные решения на основе данных.
Установка зависимостей
Перед тем как начать, убедитесь, что у вас установлены необходимые пакеты. Для этого выполните следующую команду:
!pip install shapiq overrides scikit-learn pandas numpy
Загрузка и предварительная обработка данных
Мы будем использовать набор данных о прокате велосипедов из OpenML. После загрузки данных мы разделим их на обучающую и тестовую выборки для подготовки к обучению модели.
import shapiq
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
import numpy as np
# Загрузка данных
X, y = shapiq.load_bike_sharing(to_numpy=True)
# Разделение на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
Обучение модели и оценка производительности
Теперь мы обучим модель и оценим ее производительность:
# Обучение модели
model = RandomForestRegressor()
model.fit(X_train, y_train)
# Прогнозирование
y_pred = model.predict(X_test)
# Оценка
mae = mean_absolute_error(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
r2 = r2_score(y_test, y_pred)
print(f"R² Score: {r2:.4f}")
print(f"Mean Absolute Error: {mae:.4f}")
print(f"Root Mean Squared Error: {rmse:.4f}")
Настройка объяснителя
Теперь мы настроим объяснитель с использованием пакета SHAP-IQ для вычисления значений взаимодействия Шепли на основе метода k-SII. Указывая max_order=4, мы позволяем объяснителю учитывать взаимодействия до 4 признаков одновременно, что дает более глубокие инсайты.
# Настройка объяснителя с k-SII значениями взаимодействия до 4 порядка
explainer = shapiq.TabularExplainer(
model=model,
data=X,
index="k-SII",
max_order=4
)
Объяснение локального экземпляра
Выберем конкретный тестовый экземпляр (индекс 100) для генерации локальных объяснений. Это поможет нам понять, какие именно входные данные были переданы модели.
from tqdm.asyncio import tqdm
# Создание объяснений для различных порядков
feature_names = list(df[0].columns) # Получение имен признаков
n_features = len(feature_names)
# Выбор локального экземпляра для объяснения
instance_id = 100
x_explain = X_test[instance_id]
y_true = y_test[instance_id]
y_pred = model.predict(x_explain.reshape(1, -1))[0]
print(f"Экземпляр {instance_id}, Истинное значение: {y_true}, Предсказанное значение: {y_pred}")
for i, feature in enumerate(feature_names):
print(f"{feature}: {x_explain[i]}")
Анализ значений взаимодействия
Используем метод explainer.explain() для вычисления значений взаимодействия Шепли для конкретного экземпляра данных (X[100]) с бюджетом в 256 оценок модели. Это возвращает объект InteractionValues, который показывает, как отдельные признаки и их комбинации влияют на выход модели.
interaction_values = explainer.explain(X[100], budget=256)
# Анализ значений взаимодействия
print(interaction_values)
Первичные значения взаимодействия
Для упрощения мы вычислим первичные значения взаимодействия — стандартные значения Шепли, которые учитывают только индивидуальные вклады признаков.
feature_names = list(df[0].columns)
explainer = shapiq.TreeExplainer(model=model, max_order=1, index="SV")
si_order = explainer.explain(x=x_explain)
si_order
Построение водопадной диаграммы
Водопадная диаграмма визуально разбивает предсказание модели на индивидуальные вклады признаков. Она начинается с базового предсказания и добавляет/вычитает значения Шепли каждого признака, чтобы достичь окончательного предсказанного результата. Базовое значение (т.е. ожидаемый выход модели без информации о признаках) составляет 190.717. Наблюдая, как каждый признак влияет на предсказание, мы можем получить ценные инсайты.
si_order.plot_waterfall(feature_names=feature_names, show=True)
Признаки, такие как Погода и Влажность, имеют положительный вклад, в то время как Признаки Температуры и Года негативно влияют на предсказание. В целом, водопадная диаграмма предоставляет ценную информацию о процессе принятия решений модели.
Для дальнейшего изучения вы можете посетить нашу страницу на GitHub для получения учебных материалов, кода и ноутбуков. Также подписывайтесь на нашу рассылку, чтобы быть в курсе последних обновлений.