- BrainTools - https://www.braintools.ru -

Почему дефолтный Feature Importance в бустинге врёт

Недавно для я озадачился проектом — создать автономного ML‑агента для табличных данных. На этапе отбора признаков логика [1] Feature Selection казалась очевидной. Агент строит быстрый бейзлайн на LightGBM, смотрит на feature_importances_, отсекает часть и вперёд.

Агент после работы отчитался: размерность снижена. Но на тесте RMSE деградировала.

Когда я полез в логи, картина оказалась неприятной:

  • Случайный client_id (тысяча уникальных числовых ID) стоял в топ-4 по важности.

  • Реальный признак со слабой дисперсией, но сильным нелинейным влиянием, модель выбросила как аутсайдера.

  • Два скоррелированных финансовых показателя разделили важность пополам и оба сползли ниже порога отсечения — хотя именно на них держалась большая часть точности.

Было бы логично добавить в пайплайн просто обрабтку признаков по типу удаление пользовательских данных и удаление корелированных признаков, но это не меняет факта, что feature_importances_ не самый надежный способ.

Поэтому я решил разобраться, почему это происходит, что на самом деле умеет TreeSHAP, и что показывают эксперименты.


1. Откуда берутся пороки MDI

Дефолтный feature_importances_ в большинстве древесных моделей — это MDI (Mean Decrease in Impurity): суммарное уменьшение дисперсии (для регрессии) или примеси Джини (для классификации) по всем узлам, где признак участвовал в разбиении.

В каждом узле t алгоритм оценивает «выигрыш» от разбиения по признаку j:

Delta I(t, j)=I(t) - frac{N_{t_L}}{N_t} I(t_L) - frac{N_{t_R}}{N_t} I(t_R)

Итоговая важность — взвешенная сумма таких выигрышей по всему ансамблю:

text{MDI}(X_j)=frac{1}{sum_{t} N_t Delta I(t)} sum_{t in mathcal{T}, v(t)=j} N_t Delta I(t, j)

Звучит логично: чем сильнее признак уменьшил неопределённость в листьях, тем он полезнее. Но в этой логике есть изъяны.

Изъян 1. Смещение мощности

Бинарный флаг X_{text{flag}} in {0, 1} имеет ровно одну точку разбиения. Шумовой столбец user_id с тысячью уникальных значений — 999 кандидатных порогов.

В узле с 1 000 объектами у шумового ID — 999 попыток случайно разделить обучающую выборку так, чтобы локальная дисперсия просела. Жадный алгоритм неизбежно выберет признак с большим числом степеней свободы. Чистый шум получает высокий MDI за счёт запоминания [2] трейна.

Изъян 2. Train‑only оценка

MDI считается исключительно на обучающих данных. Он принципиально не видит валидации и не может отличить реальный сигнал от переобучения.

Изъян 3. Расщепление при коллинеарности

Если два признака коррелируют с r approx 0.99, жадному дереву почти всё равно, по которому из них делать сплит. Ансамбль будет случайно чередовать их.

Вместо того чтобы зафиксировать суммарный сигнал признака, MDI делит важность между близнецами.


2. Что такое TreeSHAP и почему он работает иначе

Идея из теории игр

Представьте команду, которая выиграла матч 3:0. Как оценить вклад каждого игрока честно?

Нельзя смотреть только на того, кто ударил последним (это аналог MDI — кто сделал сплит). Ллойд Стауэлл Шепли, американский математик и экономист, предложил оценивать игрока по его среднему маржинальному вкладу во все возможные коалиции: берём подмножество S, смотрим результат без игрока i, добавляем его, фиксируем разницу v(S cup {i}) - v(S). Усредняем по всем перестановкам.

В 2017 году Скотт Лундберг и Су‑Ин Ли доказали, что единственно математически [3] строгий и справедливый способ оценить предсказания модели — использовать вектор Шепли. Они создали фреймворк SHAP, суть которого:

«игроки» — это признаки, «результат» — предсказание модели. Значение Шепли phi_i(x) показывает, на сколько единиц признак x_i сдвинул прогноёз для конкретного объекта относительно среднего:

f(x)=mathbb{E}[f(X)] + sum_{i=1}^M phi_i(x)

Проблема: комбинаторный взрыв

В общем случае нужно перебрать все 2^M подмножеств признаков. При 40 колонках это 2^{40} approx 10^{12} комбинаций — вычисление заняло бы годы. Понимая эту проблему Лундберг сфокусировался на деревье решений и появился TreeSHAP.

Как TreeSHAP это обходит

Чтобы «убрать» признак из уже обученного дерева, алгоритм поступает хитро. Когда объект спускается от корня к листьям и попадает в узел по «отсутствующему» признаку X_j, TreeSHAP отправляет его в обе ветки одновременно, взвешивая прогнозы пропорционально тому, сколько обучающих объектов попало влево и вправо.

Это позволяет аналитически вычислить mathbb{E}[f(x) mid x_S] для любого подмножества S и отследить вклад всех коалиций за один рекурсивный проход. Сложность падает с O(2^M) до:

O(T cdot L cdot D^2)

где T — число деревьев, L — число листьев, D — глубина. Ансамбль из нескольких сотен деревьев обсчитывается для тысяч объектов за пару секунд.

Глобальная важность

phi_i(x)— локальная оценка для одного объекта. Для всего датасета берут среднюю абсолютную величину:

text{Global Importance}(X_i)=frac{1}{N} sum_{k=1}^N |phi_i(x^{(k)})|

Это отражает то, насколько сильно признак физически смещает прогнозы на отложенных данных, а не сколько раз он участвовал в жадных сплитах на трейне.


3. Эксперименты

Я решил провести эксперименты с шумом и клонированием, сравнить MDI, Permutation Future Importance (когда мы оцениваем признак, перемешивая значения признаков и оценивая насколько упало качество модели) и TreeSHAP.

Решил добавить его в сравнение так как TreeSHAP по сути все еще опирается на структуру дерева, а Permutaion модельно независимый.

Эксперимент 1. Шум с высокой мощностью

Датасет (N=3000): три сигнальных признака — непрерывный линейный, непрерывный нелинейный и бинарный флаг. Плюс три абсолютных шума: user_id (0–1000), непрерывный нормальный шум и случайная монетка.

Сравниваю четыре метрики: MDI, Permutation на Train, Permutation на Test и TreeSHAP на Test.

Искажение важности признаков при разной мощности

Искажение важности признаков при разной мощности

Что вышло:

  • MDI воспринимает user_id как значимый признак: забирает 15.6% важности из‑за количества возможных порогов.

  • Permutation: 1.09% видимо из‑за переобучения, на тесте 0.14%.

  • TreeSHAP: 1.88%.

  • Бинарный флаг: MDI оценивает его в 6.4%, TreeSHAP — почти в 20%.

Эксперимент 2. Коллинеарный клон

Три признака: X_A (70% дисперсии таргета), его почти точная копия X_{A_twin}=X_A + mathcal{N}(0, 0.001) (корреляция r > 0.999), независимый X_B (30%).

Эффект размытия важности при мультиколлинеарности

Эффект размытия важности при мультиколлинеарности

Сценарий

X_A

X_{A_twin}

X_B

Шум

Сумма близнецов

Один X_A (без клона)

40.2%

—

42.3%

15.5%

40.2%

MDI с клоном

26.0%

15.0%

40.9%

17.4%

41.7%

TreeSHAP (Test)

36.3%

25.0%

38.0%

0.7%

61.3%

Permutation (OOF)

38.5%

19.5%

41.8%

0.2%

58.0%

Суммарный вклад пары X_A + X_{A_twin} в MDI незначительно изменился, но каждый в отдельности просел. Независимый X_B визуально обогнал клон. При наивном порогом отсечении коллинеарная пара рискует быть отброшена целиком.

Эксперимент 3. Что происходит с качеством модели

Задача — скоринг платёжеспособности (нелинейный таргет от дохода, возраста, кредитного рейтинга и долговой нагрузки). В датасет подмешаны коллинеарный клон дохода (income_clone) и три шумовые колонки.

Ранжирую все 8 признаков тремя способами и последовательно удаляю от 1 до 5 «наименее важных». После каждого удаления переобучаю модель и меряю RMSE на строго отложенном тесте.

Качество модели при отсечении признаков

Качество модели при отсечении признаков

MDI поставил непрерывный шум noise_uniform на 3-е место, а важный флаш vip_fleg ушёл на 5-е.

Итог по RMSE:

Удалено фичей

RMSE по MDI

RMSE по Permutation

RMSE по TreeSHAP

0 (всё)

0.5558

0.5558

0.5558

1

0.5509

0.5531

0.5509

2

0.5492

0.5532

0.5486

3

1.1111

0.5479

0.5479

4

1.1079

0.5470

0.5830

Тут как раз видно влияние того, что MDI поставила важный бинарный флаг на 3-е место по важности, как только отбрасывается этот признак RMSE значительно поднимается. Permutation и TreeSHAP отсекают шум и даже немного снижают метрику.


4. Итог

1. model.feature_importances_ — не такой уж и надежный инструмент, подходит только для первичной диагностики, не для отбора. MDI полезен, чтобы быстро понять, какие признаки дерево вообще использует.

2. Коллинеарные признаки нужно обрабатывать до отбора. Любой метод разделит суммарный вклад пары между её членами. Перед фильтрацией по важности стоит объединить или удалить сильные дубли через корреляционный анализ.

3. TreeSHAP на валидации — рабочая замена MDI. Аксиоматика Шепли гарантирует справедливое распределение вклада между признаками.

Автор: svolodya

Источник [4]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/37154

URLs in this post:

[1] логика: http://www.braintools.ru/article/7640

[2] запоминания: http://www.braintools.ru/article/722

[3] математически: http://www.braintools.ru/article/7620

[4] Источник: https://habr.com/ru/articles/1096086/?utm_campaign=1096086&utm_source=habrahabr&utm_medium=rss

www.BrainTools.ru

Rambler's Top100