Собесов

Сценарий ML: SHAP, permutation, LIME

ML / Data ScienceДеревья vs нейросетиСредняяSenior

Условие

Сравните SHAP, permutation importance, LIME: что они дают, когда какую использовать.

Решение

Подход

SHAP Permutation LIME
Level Local + global Global Local
Founded on Shapley values (game theory) Empirical drop Local linear approx
Coverage Все фичи всегда Все фичи Подмножество
Speed Slow (но TreeSHAP — fast for trees) Medium Medium
Correlation handling OK с shap.maskers Плохо (independent) Плохо
Negative contribution Да (signed) Нет (только magnitude) Да
Consistency Гарантирована Нет Нет

SHAP

Shapley values из теории кооперативных игр: «справедливое» распределение «вклада» каждой фичи в prediction:

φ_i = Σ_{S ⊆ F \ {i}} [|S|!·(|F|−|S|−1)!/|F|!] · (f(S ∪ {i}) − f(S))

Свойства:

  • Local accuracy: Σφ_i = f(x) − E[f]
  • Missingness: фича без вклада → 0
  • Consistency: если модель стала больше зависеть от фичи, её Shapley не уменьшается.
import shap
explainer = shap.TreeExplainer(model)  # быстрый, polynomial for trees
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)
shap.force_plot(explainer.expected_value, shap_values[0], X_test.iloc[0])

Permutation importance

Перемешиваем фичу i на val, смотрим падение метрики. Большое падение → важна.

from sklearn.inspection import permutation_importance
imp = permutation_importance(model, X_val, y_val, n_repeats=30, scoring='roc_auc')

Простой, robust, model-agnostic. Минус — не показывает направление эффекта.

LIME

Объясняет prediction для одной точки x_0:

  1. Семплируем точки вокруг x_0.
  2. Получаем predictions модели.
  3. Обучаем простую линейную модель локально.
  4. Коэффициенты ↔ важности.
import lime.lime_tabular
explainer = lime.lime_tabular.LimeTabularExplainer(
    X_train.values, feature_names=cols, mode='classification'
)
exp = explainer.explain_instance(X_test.iloc[0].values, model.predict_proba)
exp.show_in_notebook()

Когда что

  • Global picture, model-agnostic, быстро: permutation.
  • Local explanation продукту/регулятору: SHAP force plot.
  • Image / text (single instance): LIME или Integrated Gradients.
  • Корректные attribution для tree-based: TreeSHAP (быстро + правильно).

Подводные камни

  1. Permutation на корр. фичах: одна закрывает другую → обе занижены. Conditional permutation.
  2. KernelSHAP (model-agnostic) — O(2^n_features) в худшем случае. Используйте TreeSHAP для деревьев, DeepSHAP для NN.
  3. LIME: local linear approximation работает только в малой окрестности. На сильно non-linear модели — может вводить в заблуждение.
  4. SHAP additive в feature space, но если фичи коррелируют, splitting вклад между ними — спорно.
  5. Объяснение моделi ≠ caлlcation. Корреляция вклада ≠ причинно.

Эталонный ответ

SHAP: Shapley values, local + global, signed; TreeSHAP fast для деревьев. Permutation: empirical drop при перемешивании фичи, simple, model-agnostic, global; плохо на корр-фичах. LIME: локальная linear approx для одной точки, удобна на text/image. Корреляция атрибуций ≠ причинно-следственная связь.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти