La régression logistique est souvent le premier algorithme demandé en entretien. Mais la maîtriser vraiment — coefficients, régularisation, hypothèses — différencie les profils solides.
Pourquoi ne peut-on pas utiliser une régression linéaire pour prédire une probabilité ?
Qu est-ce qu un odds ratio ? Comment l interprétez-vous dans le contexte d un modèle de churn ?
import numpy as np
from sklearn.linear_model import LogisticRegression
import pandas as pd
model = LogisticRegression(C=1.0, solver='lbfgs')
model.fit(X_train, y_train)
# Odds ratios : exp(coeff)
odds_ratios = pd.Series(
np.exp(model.coef_[0]),
index=X_train.columns
).sort_values(ascending=False)
print(odds_ratios)
# age: 0.95 -> +1 an d age = probabilite churn * 0.95
# jours_inactif: 1.12 -> +1 jour inactif = probabilite churn * 1.12
# nb_achats_12m: 0.88 -> +1 achat = probabilite churn * 0.88Comment les coefficients d une régression logistique sont-ils affectés par le scaling des features ?
Quelle est la différence entre L1 et L2 dans sklearn LogisticRegression ? Quand utilisez-vous l un ou l autre ?
# sklearn : parametre C = 1/lambda (inverse de la regularisation)
# C petit -> forte regularisation, C grand -> faible regularisation
# L2 (Ridge) : penalty='l2' - par defaut
# Réduit les coefficients sans les mettre à zéro
model_l2 = LogisticRegression(penalty='l2', C=0.1, solver='lbfgs')
# L1 (Lasso) : penalty='l1'
# Met les coefficients non importants à zéro = sélection de features
model_l1 = LogisticRegression(penalty='l1', C=0.1, solver='liblinear')
# ElasticNet : combinaison L1 + L2
model_en = LogisticRegression(penalty='elasticnet', l1_ratio=0.5, solver='saga')Quelles sont les hypothèses de la régression logistique ? Quand échouent-elles ?
Comment la régression logistique gère-t-elle plusieurs classes ?
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold, cross_validate
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import numpy as np
pipeline = Pipeline([
('scaler', StandardScaler()),
('model', LogisticRegression(
C=0.1,
class_weight='balanced',
max_iter=1000,
solver='lbfgs'
))
])
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_validate(pipeline, X, y, cv=cv,
scoring=['roc_auc', 'precision', 'recall', 'f1'])
print(f"AUC: {scores['test_roc_auc'].mean():.3f} +/- {scores['test_roc_auc'].std():.3f}")
# Odds ratios pour l interpretabilite
pipeline.fit(X_train, y_train)
import pandas as pd
odds = pd.DataFrame({
'feature': X.columns,
'odds_ratio': np.exp(pipeline.named_steps['model'].coef_[0])
}).sort_values('odds_ratio', ascending=False)
print(odds.head(10))| Niveau | Maitrise | Signal GO | NO-GO |
|---|---|---|---|
| Junior | Comprend la sigmoïde, train/predict/proba, métriques | Explique pourquoi on utilise sigmoïde, sait interpréter predict_proba | Pense que la régression logistique est toujours linéaire |
| Confirmé | Odds ratios, L1/L2, C parameter, hypothèses | Interprète les odds ratios, sait tuner C, connaît L1 vs L2 | Ne sait pas ce qu est un odds ratio |
| Senior | Calibration, diagnostics de multicolinéarité, GLMs | Vérifie la calibration, sait quand la régression logistique est meilleure qu XGBoost | Utilise toujours XGBoost sans justifier |
Premier entretien gratuit. Rapport GO/NO-GO sous 48h.