Почему permutation importance обнуляет важные коррелирующие признаки

Вы обучили модель спроса и получили хорошее качество на отложенных данных. Но в отчёте permutation_importance у ключевых признаков почти нули. Удалять их? Если в таблице есть несколько вариантов одного сигнала — например, сумма заказа в рублях, сумма после технического пересчёта и её почти точная копия из витрины, — перестановка одного столбца оставляет модели остальные копии. Падение метрики будет маленьким, хотя вся группа признаков необходима.

Что именно измеряет перестановка

Permutation importance сначала измеряет качество готовой модели на выбранном наборе. Затем перемешивает один столбец между строками, снова считает качество и берёт разницу. Это ответ на узкий вопрос: насколько данная обученная модель зависит от этого столбца, когда остальные доступны в прежнем виде. Маленькое число не означает, что информация в столбце бесполезна в принципе.

При сильно связанных признаках модель может распределить вес между ними. Если перетасовать только один, девять оставшихся продолжают нести почти тот же сигнал. Посмотрим на предельный случай: десять одинаковых столбцов и линейная модель. Каждая строка содержит десять копий одного измерения; целевая величина равна этому измерению. Данные специально простые, чтобы видеть механизм без влияния настройки модели.

import numpy as np
from sklearn.inspection import permutation_importance
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

signal = np.linspace(-1, 1, 100)
X = np.column_stack([signal] * 10)
y = signal.copy()
model = LinearRegression().fit(X[:70], y[:70])
holdout = X[70:]
target = y[70:]
base = r2_score(target, model.predict(holdout))
single = permutation_importance(model, holdout, target,
                                scoring="r2", n_repeats=20, random_state=7)
rng = np.random.default_rng(7)
shuffled = holdout[rng.permutation(len(holdout))]
group_drop = base - r2_score(target, model.predict(shuffled))
print("R2:", round(base, 3))
print("один столбец:", round(float(single.importances_mean[0]), 3))
print("все копии вместе:", round(group_drop, 3))

На отложенных строках R2 = 1. Падение качества от перестановки первого столбца равно 0,022. Когда все десять столбцов переставлены одним и тем же новым порядком, падение составляет 2,237: R² после перестановки становится отрицательным. Существенная разница показывает, почему «нулевая важность каждого» не даёт основания выбросить всю группу.

Как разбирать подозрительный отчёт

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

Для связанной группы попробуйте переставить все её столбцы совместно на одной копии holdout, как в примере. Так вы нарушите связь группы с целью, но сохраните внутренние сочетания значений внутри каждой перенесённой строки. Сравните падение метрики с перестановкой по одному. Если задача — сократить набор полей для сервиса, это лишь первый шаг. Обучите новую модель без кандидатов на удаление и сравните её качество на том же честном разделении. После переобучения модель может перераспределить веса, поэтому исходная важность не равна эффекту удаления и повторного обучения.

Бывает обратная проблема: перемешанная комбинация признаков становится неестественной для предметной области. Тогда модель видит строки, которых при обычной работе не бывает. У групповой перестановки этот риск меньше для признаков внутри группы, поскольку они движутся вместе, но связи с внешними полями всё равно могут нарушаться. Интерпретируйте результат как диагностику зависимости модели на конкретном наборе, а не как причинный эффект признака.

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

От отчёта к рабочему эксперименту

На курсе «Data Scientist: от данных до деплоя моделей» вы пройдёте построение признаков, проверку их устойчивости, выбор валидации, сравнение экспериментов и анализ ошибок. Эту работу можно оформить как понятный эксперимент: зафиксировать срез данных, объединить связанные признаки, оценить группу и проверить новую модель после сокращения входов. Посмотрите программу курса.

Продолжить на практике

  • Data Scientist: от данных до деплоя моделей ↗

    Практический курс по Data Science: от постановки ML-задачи и работы с данными до inference API, CI/CD и мониторинга моделей в продакшне. Вы пройдёте EDA, feature engineering, обучение и оценку моделей, experiment tracking, error analysis и deployment — чтобы собирать полноценный рабочий контур вокруг ML-решения.