Null importances: is the importance significant?
Fifty models trained on a shuffled target build the null distribution of each feature's importance: only a real importance that exceeds the 95th null percentile proves genuine signal.
Prerequisites
lightgbm, pandas, numpy
Python
import numpy as np
import pandas as pd
from lightgbm import LGBMClassifier
def importances(X, y_arr, seed=42):
m = LGBMClassifier(n_estimators=200, random_state=seed, verbose=-1)
return m.fit(X, y_arr).feature_importances_
imp_reelle = importances(X_train, y_train.values)
rng = np.random.default_rng(0)
null_imps = np.array([
importances(X_train, rng.permutation(y_train.values), seed=i)
for i in range(50)
]) # 50 modèles sur cible mélangée
p95_null = np.percentile(null_imps, 95, axis=0)
bilan = pd.DataFrame({
"imp_reelle": imp_reelle,
"p95_null": p95_null,
"significative": imp_reelle > p95_null,
}, index=X_train.columns).sort_values("imp_reelle", ascending=False)
print(bilan.head(6).round(1).to_string())
print("features significatives :", int(bilan["significative"].sum()))Result
imp_reelle p95_null significative nb_incidents 1842.0 201.4 True montant_moy 1311.0 188.2 True anciennete 987.0 214.7 True code_region 611.0 688.9 False freq_connexion 604.0 177.3 True age 371.0 169.8 True features significatives : 9 code_region a une grosse importance MÊME quand la cible est mélangée (pure cardinalité) : son score réel ne prouve donc rien — retirée. C'est le piège que l'importance native seule ne détecte jamais.
Null importanceSignificativitéSélection de features