Собесов

Сценарий ML: bias в feature importance у Random Forest

ML / Data ScienceBoosting и ensembleСложнаяSenior

Условие

В RF на feature_importances_ ID-фича оказалась №1. Это значит, что ID полезна? Объясните bias.

Решение

Подход

feature_importances_ (Gini / MDI — Mean Decrease in Impurity): сумма impurity reduction по всем split. Смещена в сторону:

  1. High-cardinality features (как ID): больше возможностей split → выше chance быть выбранным → большее MDI, даже если у фичи нулевая реальная связь с y.
  2. Continuous features: больше threshold кандидатов чем у бинарных.
  3. Correlated features: один из коррелирующих доминирует, другой получает 0.

Демонстрация

import numpy as np
from sklearn.ensemble import RandomForestRegressor
import pandas as pd
 
np.random.seed(42)
n = 1000
df = pd.DataFrame({
    'id': np.arange(n),              # cardinality 1000, нерелевантна
    'binary': np.random.binomial(1, 0.5, n),
    'real_feature': np.random.normal(0, 1, n),
})
df['y'] = df['real_feature'] + np.random.normal(0, 0.5, n)  # только real_feature важна
 
rf = RandomForestRegressor(n_estimators=200, random_state=0).fit(df[['id','binary','real_feature']], df['y'])
print(dict(zip(['id','binary','real_feature'], rf.feature_importances_)))
# ~{'id': 0.42, 'binary': 0.05, 'real_feature': 0.53}
# id оказывается значимой, хотя y от неё не зависит — это bias

Корректные альтернативы

  1. Permutation importance: перемешиваем фичу и смотрим падение метрики. Unbiased по cardinality.
  2. SHAP values: marginal contribution, теоретически обоснованы.
  3. Conditional permutation (для коррелированных фичей): permute conditional на остальных.
from sklearn.inspection import permutation_importance
imp = permutation_importance(rf, X_test, y_test, n_repeats=30, random_state=0)
for name, m in zip(features, imp.importances_mean):
    print(f"{name}: {m:.4f}")

SHAP

import shap
explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test, feature_names=features)

Подводные камни

  1. MDI важен на train — переоценивает фичи, которые помогли overfit, не generalization. Permutation на val — лучше.
  2. Permutation на коррелированных фичах: permute одной не убивает информацию (есть в другой) → обе занижены. Conditional permutation.
  3. SHAP на больших датасетах медленный — используйте TreeSHAP (быстрый для деревьев) на sample.
  4. Drop-column importance (retrain без фичи) — самый честный, но дорогой.
  5. ID-like фичи в продакшне опасны: на новых users ID не виден → leakage в тесте.

Эталонный ответ

MDI / Gini importance смещён в сторону high-cardinality и continuous features. ID может оказаться №1 даже без реальной связи с y. Альтернативы: permutation importance (на val), SHAP, drop-column. Для коррелированных фичей — conditional permutation.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти