Условие
В RF на feature_importances_ ID-фича оказалась №1. Это значит, что ID полезна? Объясните bias.
Решение
Подход
feature_importances_ (Gini / MDI — Mean Decrease in Impurity): сумма impurity reduction по всем split. Смещена в сторону:
- High-cardinality features (как ID): больше возможностей split → выше chance быть выбранным → большее MDI, даже если у фичи нулевая реальная связь с y.
- Continuous features: больше threshold кандидатов чем у бинарных.
- 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Корректные альтернативы
- Permutation importance: перемешиваем фичу и смотрим падение метрики. Unbiased по cardinality.
- SHAP values: marginal contribution, теоретически обоснованы.
- 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)Подводные камни
- MDI важен на train — переоценивает фичи, которые помогли overfit, не generalization. Permutation на val — лучше.
- Permutation на коррелированных фичах: permute одной не убивает информацию (есть в другой) → обе занижены. Conditional permutation.
- SHAP на больших датасетах медленный — используйте TreeSHAP (быстрый для деревьев) на sample.
- Drop-column importance (retrain без фичи) — самый честный, но дорогой.
- ID-like фичи в продакшне опасны: на новых users ID не виден → leakage в тесте.
Эталонный ответ
MDI / Gini importance смещён в сторону high-cardinality и continuous features. ID может оказаться №1 даже без реальной связи с y. Альтернативы: permutation importance (на val), SHAP, drop-column. Для коррелированных фичей — conditional permutation.