Значения SHAP: глобальная и локальная важность признаков
Вы вычислите значения SHAP для модели градиентного бустинга, построите сводные диаграммы типа beeswarm и столбчатые диаграммы, а также объясните отдельное предсказание нетехническому специалисту.
«Значения SHAP: глобальная и локальная важность признаков» — бесплатный урок Machine Learning Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Machine Learning Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Machine Learning Academy содержит 4 уроков всего.
Почему важна объяснимость модели
Объяснимость — это возможность понять, почему модель выдала конкретное предсказание. В критически значимых областях, таких как кредитование, здравоохранение и найм, регулирующие органы и пользователи требуют объяснений, а не только точных предсказаний. SHAP (SHapley Additive exPlanations) предоставляет математически обоснованную методологию, основанную на теории кооперативных игр, для получения таких объяснений для любой модели.
Значения Шепли: происхождение из теории игр
Значения SHAP основаны на значениях Шепли из теории кооперативных игр, где игроки (признаки) совместно формируют результат (предсказание). Каждый признак получает справедливую долю заслуг: его маржинальный вклад усредняется по всем возможным порядкам добавления признаков. Благодаря этому SHAP — единственный аддитивный метод атрибуции, удовлетворяющий аксиомам эффективности, симметрии, фиктивного игрока и аддитивности.
Установка и импорт SHAP
Библиотека shap поддерживает модели на основе деревьев, нейронные сети и любые модели типа «чёрный ящик». Установите её с помощью команды pip install shap и импортируйте вместе с обученной моделью. Объяснители SHAP учитывают тип модели: TreeExplainer для градиентного бустинга и случайных лесов вычисляет точные значения за время O(T·D²), что намного быстрее наивного вычисления значений Шепли с экспоненциальной временной сложностью.
import shap
import xgboost as xgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
data.data, data.target, test_size=0.2, random_state=42
)
model = xgb.XGBClassifier(n_estimators=100, use_label_encoder=False, eval_metric='logloss')
model.fit(X_train, y_train)
explainer = shap.TreeExplainer(model)Вычисление значений SHAP для тестового набора
Вызовите explainer.shap_values(X_test), чтобы получить матрицу, в которой каждая строка соответствует образцу, а каждый столбец — признаку. Значение SHAP для признака j в образце i показывает вклад признака j в смещение предсказания от ожидаемого базового значения. Положительные значения смещают предсказание в сторону положительного класса, а отрицательные — в сторону отрицательного.
shap_values = explainer.shap_values(X_test)
print('SHAP values shape:', shap_values.shape) # (n_samples, n_features)
print('Base value (expected prediction):', explainer.expected_value)
print('First sample SHAP values:', shap_values[0])Глобальная важность: столбчатая диаграмма
Глобальная важность признаков показывает, какие признаки важнее всего для всех предсказаний в совокупности. summary_plot SHAP в режиме столбчатой диаграммы отображает среднее абсолютное значение SHAP для каждого признака и ранжирует признаки от наиболее до наименее важных. Это заменяет наивную встроенную оценку важности признаков, которая учитывает только количество разбиений и потому необъективно отдаёт предпочтение признакам с большим числом уникальных значений.
import matplotlib.pyplot as plt
# Bar plot: mean |SHAP| per feature
shap.summary_plot(shap_values, X_test,
feature_names=data.feature_names,
plot_type='bar')
plt.tight_layout()
plt.savefig('shap_bar.png', dpi=150)Глобальная важность: диаграмма-рой
Диаграмма-рой (стандартный вариант summary_plot) информативнее столбчатой диаграммы: каждая точка соответствует одному образцу и окрашена в зависимости от значения признака (красный — высокое значение, синий — низкое). Ось x показывает значение SHAP, поэтому можно увидеть не только важность признаков, но и направление, в котором высокое или низкое значение признака смещает предсказание. Это позволяет сразу заметить нелинейные эффекты и эффекты взаимодействия.
shap.summary_plot(shap_values, X_test,
feature_names=data.feature_names)
# Dots to the right = positive contribution to predicted class
# Red dots far right = high feature value strongly increases predictionЛокальное объяснение: диаграмма сил
Диаграмма сил объясняет одно предсказание. Слева отображается базовое значение, а справа — итоговое предсказание; признаки представлены стрелками, которые повышают (красные) или понижают (синие) результат. Ширина каждой стрелки пропорциональна значению SHAP соответствующего признака. Именно такое объяснение можно показать кредитному специалисту, который спрашивает: «Почему эта заявка была отклонена?»
# Explain the first test sample
i = 0
shap.force_plot(
explainer.expected_value,
shap_values[i],
X_test[i],
feature_names=data.feature_names,
matplotlib=True
)Локальное объяснение: каскадная диаграмма
Каскадная диаграмма — более наглядная альтернатива диаграмме сил для одного образца. Она вертикально складывает вклады SHAP, начиная с базового значения, и показывает вклад каждого признака в виде сегмента столбца. Положительные вклады окрашены в красный цвет и направлены вверх, а отрицательные — в синий и направлены вниз. Итоговая сумма сегментов равна необработанному выходу модели для этого образца.
import shap
explanation = shap.Explanation(
values=shap_values[0],
base_values=explainer.expected_value,
data=X_test[0],
feature_names=list(data.feature_names)
)
shap.waterfall_plot(explanation)Диаграмма зависимости: взаимодействия признаков
Диаграмма зависимости SHAP показывает, как изменяется значение SHAP одного признака при изменении его исходного значения; цветом обозначается второй признак, чтобы выявить взаимодействия. Например, диаграмма для признака «наихудший радиус», окрашенная по признаку «средняя текстура», показывает, зависит ли влияние радиуса от текстуры. Такой подход превосходит обычные диаграммы частичной зависимости, поскольку естественным образом учитывает взаимодействия всех признаков.
shap.dependence_plot(
'worst radius', # feature to plot on x-axis
shap_values,
X_test,
feature_names=list(data.feature_names),
interaction_index='mean texture' # colour by this feature
)SHAP с любой моделью: KernelExplainer
Если модель является «чёрным ящиком» (SVM, нейронная сеть или любой оцениватель sklearn), используйте shap.KernelExplainer. Он приближённо вычисляет значения Шепли, выбирая случайные коалиции и подбирая локальную взвешенную линейную модель. Этот метод не зависит от типа модели, но работает медленнее, чем TreeExplainer. Чтобы ускорить вычисления на больших наборах данных, укажите сводку фонового набора данных (например, центроиды K-средних).
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
import shap
import numpy as np
pipeline = Pipeline([('scaler', StandardScaler()), ('svm', SVC(probability=True))])
pipeline.fit(X_train, y_train)
# Use 50 background samples for speed
background = shap.kmeans(X_train, 50)
explainer_k = shap.KernelExplainer(pipeline.predict_proba, background)
shap_vals_k = explainer_k.shap_values(X_test[:10]) # Explain 10 samplesПроверка: сумма значений SHAP равна предсказанию
Важное свойство SHAP — эффективность: сумма всех значений SHAP для образца плюс базовое значение должна равняться необработанному выходу модели. Проверка этого здравого условия подтверждает, что объяснитель работает правильно. Любое расхождение указывает на несоответствие типа объяснителя модели или на некорректные фоновые данные.
import numpy as np
# For tree models, verify SHAP values sum to log-odds output
base = explainer.expected_value
for i in range(5):
shap_sum = shap_values[i].sum() + base
raw_pred = model.predict(X_test[i:i+1], output_margin=True)[0]
print(f'Sample {i}: SHAP sum={shap_sum:.4f}, model output={raw_pred:.4f}, match={abs(shap_sum-raw_pred)<1e-4}')Быстрая проверка
Проверьте своё понимание концепций машинного обучения с Python из этого урока.
Итоги урока
В этом уроке Вы узнали, что значения SHAP количественно оценивают вклад каждого признака в предсказание, используя значения Шепли из теории игр; глобальные сводки (столбчатые диаграммы и диаграммы-рои) показывают общую важность и направление влияния признаков; а локальные объяснения (диаграммы сил и каскадные диаграммы) обосновывают отдельные предсказания. Далее мы рассмотрим LIME как альтернативный подход к объяснению моделей, не зависящий от их типа.
Изучай Python с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Значения SHAP: глобальная и локальная важность признаков» бесплатный?
Да — полный текст урока «Значения SHAP: глобальная и локальная важность признаков» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Machine Learning Academy, подпишись на CoddyKit PRO. Курс Machine Learning Academy содержит 4 уроков всего.
Чему я научусь в уроке «Значения SHAP: глобальная и локальная важность признаков»?
Вы вычислите значения SHAP для модели градиентного бустинга, построите сводные диаграммы типа beeswarm и столбчатые диаграммы, а также объясните отдельное предсказание нетехническому специалисту. Ты практикуешь Machine Learning Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Machine Learning Academy?
Предыдущий опыт не требуется. Machine Learning Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Значения SHAP: глобальная и локальная важность признаков»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Machine Learning Academy?
Да. Каждый урок Machine Learning Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Значения SHAP: глобальная и локальная важность признаков
- LIME: локальные интерпретируемые объяснения, не зависящие от модели
- Метрики справедливости: демографический паритет и равные возможности
- Стратегии снижения предвзятости: дообработка, обработка в процессе и постобработка