Le feature engineering est souvent ce qui differentie un bon modele d un excellent modele. En entretien, on evalue la capacite a creer des features pertinentes et a eviter les pieges classiques.
Quand utilisez-vous One-Hot Encoding vs Target Encoding vs Ordinal Encoding ?
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from category_encoders import TargetEncoder
# One-Hot Encoding : variables nominales a faible cardinalite (<15 valeurs)
pd.get_dummies(df, columns=['genre', 'region'], drop_first=True)
# Target Encoding : variables a forte cardinalite (>15 valeurs)
# Encode par la moyenne de la target par categorie
enc = TargetEncoder(cols=['city', 'product_category'])
df_encoded = enc.fit_transform(df, df['churned'])
# Attention : risque de data leakage sur le train set
# Toujours utiliser cross-validation ou leave-one-out
# Ordinal Encoding : variables ordonnees
order_map = {'faible': 0, 'moyen': 1, 'eleve': 2}
df['niveau_encoded'] = df['niveau'].map(order_map)Quelles strategies de gestion des valeurs manquantes utilisez-vous ?
from sklearn.impute import SimpleImputer, KNNImputer
# Imputation simple
imputer_median = SimpleImputer(strategy='median') # numerique robuste
imputer_mode = SimpleImputer(strategy='most_frequent') # categoriel
# KNN Imputer : impute selon les k voisins les plus proches
knn_imputer = KNNImputer(n_neighbors=5)
# Ajouter un indicateur de valeur manquante
df['income_missing'] = df['income'].isna().astype(int)
df['income'].fillna(df['income'].median(), inplace=True)
# Supprimer : seulement si <5% de valeurs manquantes et MCAR
# (Missing Completely At Random)Quelles features temporelles creez-vous classiquement pour une serie temporelle ?
df['date'] = pd.to_datetime(df['date'])
# Features calendaires
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day_of_week'] = df['date'].dt.dayofweek
df['is_weekend'] = df['day_of_week'].isin([5, 6]).astype(int)
df['quarter'] = df['date'].dt.quarter
df['is_month_end']= df['date'].dt.is_month_end.astype(int)
# Encodage cyclique (eviter la discontinuite 12->1 pour les mois)
import numpy as np
df['month_sin'] = np.sin(2 * np.pi * df['month'] / 12)
df['month_cos'] = np.cos(2 * np.pi * df['month'] / 12)
# Lag features (comportement passe)
df['revenue_lag_7d'] = df.groupby('customer_id')['revenue'].shift(7)
df['revenue_lag_30d'] = df.groupby('customer_id')['revenue'].shift(30)
df['revenue_roll_mean_7d'] = df.groupby('customer_id')['revenue'].transform(
lambda x: x.rolling(7).mean())Pourquoi les arbres de decision n ont-ils pas besoin de normalisation ? Et les reseaux de neurones ?
Comment selectionnez-vous les features les plus importantes pour votre modele ?
import shap
from sklearn.feature_selection import mutual_info_classif, RFE
# Methode 1 : importances XGBoost
model.fit(X_train, y_train)
importances = pd.Series(model.feature_importances_, index=X_train.columns)
top_20 = importances.nlargest(20)
# Methode 2 : SHAP values (plus fiable)
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_train)
shap.summary_plot(shap_values, X_train, max_display=20)
# Methode 3 : Mutual Information
mi_scores = mutual_info_classif(X_train, y_train)
# Attention : collinearite
corr_matrix = X_train.corr().abs()
# Supprimer les features avec correlation > 0.95Qu est-ce que le data leakage ? Donnez un exemple concret.
| Niveau | Maitrise | Signal GO | NO-GO |
|---|---|---|---|
| Junior | Encodages basiques, imputation simple, scaling | Sait faire un OHE, impute par la mediane, sait quand normaliser | Applique le scaler avant le train/test split |
| Confirme | Target encoding, features temporelles, SHAP selection | Utilise le Target Encoding avec cross-val, cree des lag features, selectionne avec SHAP | Ne sait pas ce qu est le data leakage, ne cree pas de lag features |
| Senior | Pipeline sklearn complet, feature store, prevention leakage | A concu un pipeline sklearn avec ColumnTransformer, connait les feature stores | Ne peut pas expliquer un cas concret de data leakage |
Premier entretien gratuit. Rapport GO/NO-GO sous 48h.