Два признака несут один сигнал: что на самом деле показывает permutation importance
В таблице есть две почти одинаковые колонки: сумма покупок из витрины и сумма покупок из CRM. Команда хочет отказаться от одного источника. График важности модели кажется удобным ответом, но он описывает использование колонок уже обученной моделью. Решение о зависимости от внешнего источника требует ещё одного эксперимента: переобучения без него.
Перестановка ломает одну связь при замороженной модели
Permutation importance измеряет, как ухудшилась выбранная метрика, когда значения признака перемешали между объектами. Обучение при этом не повторяется. Модель продолжает использовать прежние коэффициенты или деревья. Если ухудшение велико, конкретная модель опирается на эту колонку на проверяемом наборе. Если мало, возможны разные объяснения, включая наличие другого носителя того же сигнала.
Для связанных колонок полезны два вопроса. Первый: насколько модель зависит от каждой из них по отдельности? Второй: насколько зависит от всей группы? Совместная перестановка переносит значения группы одной и той же перестановкой строк. Так сохраняется внутренняя связь между колонками, но разрушается их связь с правильными ответами. Независимые перестановки каждой колонки отвечают другому эксперименту и могут создавать несуществующие сочетания.
Важность всегда относится к метрике и набору данных. Для регрессии возьмём MAE: среднюю абсолютную ошибку. Чем больше она выросла после перестановки, тем сильнее влияние вмешательства. Нельзя сравнивать такой рост напрямую с важностями из другого проекта, где целевая величина измеряется в тысячах рублей вместо рублей.
Обучим маленькую регрессию и удалим дубль
Используем NumPy и линейную регрессию через метод наименьших квадратов. Две колонки в примере полностью совпадают, чтобы эффект можно было разобрать без случайного шума. Обучение получает первые восемь значений, проверка — следующие четыре. На этом искусственном линейном правиле разделение позволяет точно увидеть разницу между вмешательством и переобучением.
import numpy as np
def design(x):
return np.column_stack([np.ones(len(x)), x, x])
train_x = np.arange(8, dtype=float)
test_x = np.arange(8, 12, dtype=float)
train = design(train_x)
test = design(test_x)
y_train, y_test = 2 + 3 * train_x, 2 + 3 * test_x
coef = np.linalg.lstsq(train, y_train, rcond=None)[0]
mae = lambda pred: float(np.mean(np.abs(pred - y_test)))
baseline = mae(test @ coef)
for columns in ([1], [2], [1, 2]):
losses = []
for shift in (1, 2, 3):
changed = test.copy()
changed[:, columns] = np.roll(test[:, columns], shift, axis=0)
losses.append(mae(changed @ coef) - baseline)
print("columns", columns, "MAE_increase", round(float(np.mean(losses)), 6))
smaller_coef = np.linalg.lstsq(train[:, :2], y_train, rcond=None)[0]
smaller_mae = mae(test[:, :2] @ smaller_coef)
print("baseline_MAE", round(baseline, 6), "retrained_MAE", round(smaller_mae, 6))
assert baseline < 1e-10 and smaller_mae < 1e-10
Отдельная перестановка каждой колонки даёт рост MAE 2,5, совместная — 5,0. Но после переобучения на одной колонке MAE снова практически нулевая. Исходная модель использовала обе колонки; для решения задачи достаточно одной. В коде взяты три заранее заданных циклических сдвига. Это прозрачная демонстрация механизма, а не статистическая оценка важности на большом датасете.
Метод наименьших квадратов при дублирующих колонках возвращает решение минимальной нормы, поэтому в этом примере коэффициент распределяется между двумя одинаковыми носителями сигнала. Другой алгоритм может выбрать преимущественно один дубль. Тогда отдельная важность второго будет близка к нулю, хотя оба исходных источника несут одинаковую информацию. Это свойство выбранной модели, а не универсальная характеристика данных.
Как принять решение об отказе от источника
Сначала соберите логические группы признаков: суммы и их пересчёт в другую валюту, несколько окон одной активности, дубли разных витрин. Проверьте отдельные и совместные перестановки на отложенном наборе. Для обычного отчёта используйте много случайных перестановок с фиксированным seed и сохраняйте разброс, чтобы одно удачное перемешивание не стало основанием для архитектурного решения.
Затем обучите вариант без дорогого источника и сравните его на тех же объектах с исходной моделью. Сохраняйте прежние правила подбора параметров и независимый финальный тест. Если оставшаяся колонка обновляется позже или чаще пропадает, оцените эти режимы отдельно. Одинаковое качество на полной исторической таблице не означает одинаковой пригодности признаков к рабочему инференсу.
В итоговом решении соедините качество, доступность, задержку и стоимость источника. Можно удалить дубль, если переобученный вариант выполняет требования и оставшийся сигнал доступен в момент прогноза. Перестановка помогает выбрать гипотезу для этого эксперимента; завершает решение проверка нового пайплайна.
Перед запуском перестановок проверьте качество самой модели на исходных данных. Если она почти не решает задачу, слабая важность всех колонок мало говорит об их полезности: модель могла просто не научиться ими пользоваться. В рабочем отчёте рядом с ростом ошибки держите исходную метрику, размер выборки и название проверенного периода. Сравнение с простым базовым решением помогает понять, заслуживает ли текущая модель подробной интерпретации.
Группы удобно задавать по происхождению данных, а не только по коэффициенту корреляции. Две колонки могут быть слабо связаны в среднем, но взаимозаменяемы в важном сегменте. И наоборот, высокая корреляция не делает признаки одинаковыми при пропусках или изменении режима работы. После общего эксперимента откройте ошибки тех объектов, где упрощённый вариант проиграл: именно они показывают цену отказа от источника, которую средняя метрика могла скрыть.
В платном курсе «Табличные модели в продакшн» вы работаете с генерацией и отбором признаков, обучением CatBoost/LightGBM, feature importance и SHAP. Дальнейшая практическая задача — собрать сравнимые эксперименты и перенести выбранные признаки в inference pipeline. Откройте программу курса.
Продолжить на практике
- ML Engineer / Data Scientist: табличные модели в продакшн ↗
Практический курс для тех, кто хочет получить навыки ML Engineer / Data Scientist на реальных табличных задачах. В курсе Вы не просто обучите CatBoost/LightGBM, а соберёте полноценный production-style пайплайн: подготовка данных, feature engineering (генерация признаков), корректная валидация, защита от leakage (утечек), тюнинг через Optuna, интерпретация через SHAP, batch-инференс и REST API для предсказаний.
