Условие
Сравните 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:
- Семплируем точки вокруг
x_0. - Получаем predictions модели.
- Обучаем простую линейную модель локально.
- Коэффициенты ↔ важности.
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 (быстро + правильно).
Подводные камни
- Permutation на корр. фичах: одна закрывает другую → обе занижены. Conditional permutation.
- KernelSHAP (model-agnostic) — O(2^n_features) в худшем случае. Используйте TreeSHAP для деревьев, DeepSHAP для NN.
- LIME: local linear approximation работает только в малой окрестности. На сильно non-linear модели — может вводить в заблуждение.
- SHAP additive в feature space, но если фичи коррелируют, splitting вклад между ними — спорно.
- Объяснение моделi ≠ caлlcation. Корреляция вклада ≠ причинно.
Эталонный ответ
SHAP: Shapley values, local + global, signed; TreeSHAP fast для деревьев. Permutation: empirical drop при перемешивании фичи, simple, model-agnostic, global; плохо на корр-фичах. LIME: локальная linear approx для одной точки, удобна на text/image. Корреляция атрибуций ≠ причинно-следственная связь.