Впровадження SHAP/LIME для пояснюваності ML-моделей
Модель XGBoost дає AUC 0.91 на валідації. На продакшені з'являються неочікувані передбачення — високі скори для явно нерелевантних об'єктів. Feature importance з самого бустингу показує топ-10 ознак, але не пояснює конкретне передбачення. Цей конкретний об'єкт може отримати score 0.87 з неочевидних причин — і ми як інженери зобов'язані дати відповідь. Ми впроваджуємо SHAP та LIME для пояснюваності моделей у production, і це не просто аудит — це частина ML-пайплайну під ключ.
SHAP та LIME відповідають на різні версії питання «чому?». Важливо розуміти, коли застосовувати кожен метод і де вони ламаються.
Як працюють SHAP та LIME?
SHAP (SHapley Additive exPlanations, Lundberg & Lee) заснований на теорії кооперативних ігор Шеплі. Ідея: внесок кожної ознаки в передбачення — середнє її маргінального впливу при всіх можливих коаліціях ознак. Ключова властивість: адитивність. Сума SHAP values всіх ознак + base value (середнє передбачення моделі) дорівнює конкретному передбаченню. Це математично точне розкладання, не апроксимація.
LIME (Locally Interpretable Model-agnostic Explanations, Ribeiro et al.) працює інакше: навколо об'єкта генерується випадкова хмара збурень, для кожного отримується передбачення black-box моделі, потім на цій хмарі навчається проста інтерпретована модель (лінійна регресія або дерево). LIME стохастичний, тому в продакшені ми фіксуємо seed і використовуємо num_samples=5000+.
Які проблеми вирішують SHAP та LIME?
- Провали feature importance. Вбудована важливість ознак у XGBoost показує глобальну картину, але не пояснює окремий випадок. SHAP вирішує це детермінованим розкладанням.
- Чорний ящик для бізнесу. Регулятори вимагають пояснень за кожним рішенням. TreeSHAP дає прозорість за прийнятний час.
- Дрейф моделі без сигналу. SHAP values, що логуються в ClickHouse, дозволяють відстежувати зміну впливу ознак раніше, ніж падіння метрик.
TreeSHAP — чому важлива архітектурна спеціалізація
Для tree-based моделей (XGBoost, LightGBM, CatBoost, sklearn RandomForest) існує TreeSHAP — алгоритм з поліноміальною складністю O(TLD²). Це на порядки швидше за наївний KernelSHAP.
import shap import xgboost as xgb model = xgb.XGBClassifier() model.fit(X_train, y_train) explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X_test) # Waterfall plot для конкретного передбачення shap.plots.waterfall(explainer(X_test)[0]) # Summary plot — глобальна важливість shap.summary_plot(shap_values, X_test) На практиці TreeSHAP на LightGBM з 500 деревами обробляє 10 000 прикладів за 2–3 секунди на CPU. Цілком прийнятно для batch inference.
Чому LIME іноді кращий за SHAP?
- Модель не підтримується TreeSHAP і занадто повільна для KernelSHAP.
- Потрібне пояснення в термінах «супер-пікселів» для зображень або виділення слів для текстів.
- Потрібен швидкий прототип без глибокої математики.
Але пам'ятайте: LIME не детермінований. При різних random_state пояснення для одного об'єкта можуть відрізнятися. У продакшені ми використовуємо фіксований seed та num_samples=5000+.
Порівняння методів
| Характеристика | TreeSHAP | KernelSHAP | LIME |
|---|---|---|---|
| Застосовність | Тільки дерева | Будь-яка модель | Будь-яка модель |
| Математична точність | Точна | Точна | Апроксимація |
| Стабільність | Детермінована | Детермінована | Стохастична |
| Швидкість (10k об'єктів) | Секунди | Години | Хвилини |
| Підтримка тексту/зображень | Ні | Ні нативно | Так |
Типові проблеми та рішення
| Проблема | Рішення |
|---|---|
| Довгі пояснення для KernelSHAP | Перейти на GradientSHAP або використовувати вибірку |
| Нестабільність LIME | Фіксувати seed, збільшити num_samples до 5000+ |
| SHAP не працює для LLM | Використовувати attention weights або partition explainer |
Інтеграція в production ML pipeline
Пояснення потрібні не тільки для аудиту — вони частина операційного пайплайну.
Кейс з практики: клієнт — страхова компанія, розрахунок страхових премій (LightGBM, 120 ознак). Вимога: агент повинен пояснити клієнту по телефону причину високої премії. Рішення: TreeSHAP в inference API. Для кожного передбачення повертається топ-3 ознаки з найбільшими SHAP values + автоматичний шаблон тексту: «Ваша премія вища за середню з наступних причин: вік автомобіля (+12%), регіон реєстрації (+8%), історія виплат (+6%)». Latency overhead: 35ms на TreeSHAP при середньому inference 18ms — прийнятно.
Моніторинг: SHAP values логуються в ClickHouse. Раз на тиждень агрегуємо — дрейф у розподілі SHAP values сигналізує про feature drift раніше, ніж падіння AUC.
Обмеження, про які варто знати
SHAP ≠ causality. Високий SHAP value у ознаки означає кореляцію з передбаченням, а не причинно-наслідковий зв'язок. «Ознака X впливає на передбачення» ≠ «зміна X змінить результат у реальності».
Мультиколінеарність ламає інтерпретацію. Якщо дві ознаки корелюють (r > 0.8), SHAP ділить їх вплив довільно. При інтерпретації потрібен аналіз кореляцій.
Для LLM — обидва методи дають грубі оцінки. Attention weights часто інформативніші для задач генерації, але теж не строгий proxy важливості.
Що входить в нашу роботу
- Аналіз моделі та даних: обираємо підходящий метод — TreeSHAP, KernelSHAP, LIME — з урахуванням архітектури та latency-вимог.
- Розробка explainer-модуля: інтеграція в існуючий inference API.
- Генерація звітів: waterfall plot, summary plot, автоматичні текстові шаблони.
- Моніторинг: логування SHAP values в ClickHouse, побудова дашбордів дрейфу.
- Навчання команди: документація, workshop для інженерів та бізнес-користувачів.
Строки та вартість
Строки: від 1 тижня на базову інтеграцію одного методу до 3–4 тижнів на повний pipeline з моніторингом та дашбордами. Вартість розраховується індивідуально під кожен проект. Зв'яжіться з нами для попередньої оцінки — розкажемо, які результати отримаєте.
Наш досвід: понад 50 проектів з explainable AI, 5 років на ринку, сертифіковані ML-інженери. Гарантуємо прозорість та підтримку після впровадження.
Замовте консультацію — допоможемо зробити вашу модель зрозумілою та відповідною вимогам регуляторів.







