Impurity-важность ставит почти уникальную ID-колонку на первое место — в чём ошибка и чем её заменить?
Обученное дерево ставит почти уникальную колонку user_id на вершину feature_importances_, хотя её удаление почти не меняет метрику на валидации.
Ограничения: новых данных не собирать и набор признаков не менять; разбираться только с обученной моделью и уже имеющейся отложенной выборкой.
importances = model.feature_importances_
ranking = sorted(zip(X_train.columns, importances), key=lambda p: -p[1])
print(ranking[:5]) # user_id доминирует в рейтинге
# TODO: объяснить смещение и построить достоверный рейтинг
Найдите причину смещения и замените рейтинг.
Impurity-важность суммирует убранную признаком impurity, а колонка с высокой кардинальностью даёт куда больше кандидатов-порогов, поэтому выигрывает разбиения случайно и без обобщения — и считается по обучающей подгонке. Берите permutation importance на отложенной выборке.
- ✗Доверяют
feature_importances_как причинному или обобщающему рейтингу - ✗Считают, что высокая impurity-важность означает вклад в метрику на валидации
- ✗Запускают permutation importance на обучении, воспроизводя то же смещение
- →Почему коррелированные признаки всё же путают permutation importance, и что помогает?
- →Чем удаление признака с переобучением отличается от его перемешивания?
Смещение возникает из самого перебора разбиений. Признак с почти уникальными значениями даёт почти столько же кандидатов-порогов, сколько строк, поэтому какое-то из них случайно даёт заметное падение impurity. Дерево засчитывает это падение колонке, и feature_importances_, посчитанная по обучающей подгонке, поднимает user_id наверх — при нулевом обобщении.
Достоверный рейтинг даёт permutation importance на отложенной выборке: колонку перемешивают и смотрят, насколько просела метрика.
from sklearn.inspection import permutation_importance
r = permutation_importance(model, X_valid, y_valid, n_repeats=20, random_state=0)
order = r.importances_mean.argsort()[::-1]
for i in order[:5]:
print(X_valid.columns[i], round(r.importances_mean[i], 4))
# user_id опускается к нулю: перемешивание не вредит качеству
Признак, чьё перемешивание не ухудшает метрику, ничего не даёт модели. Держите user_id вне признаков — как идентификатор он ещё и рискует стать утечкой.