Biais-variance, surapprentissage, validation croisée, précision contre rappel, classes déséquilibrées, régularisation et gradient boosting : les questions posées en entretien de machine learning.
Cliquez sur une question pour dérouler la réponse attendue.
L’apprentissage supervisé consiste à apprendre une fonction de prédiction à partir d’exemples déjà étiquetés : on fournit au modèle des paires (entrées, réponse attendue), et il ajuste ses paramètres pour minimiser l’écart entre ce qu’il prédit et la réponse connue.
Le mot qui porte la réponse est supervisé : la supervision, c’est l’étiquette. Sans elle, il n’y a rien à comparer à la prédiction, donc rien à corriger.
Deux précisions qui montrent qu’on ne récite pas une définition :
Les deux familles à nommer : la régression, quand la réponse est un nombre, et la classification, quand elle est une catégorie.
Et pour situer par rapport au reste : l’apprentissage non supervisé travaille sans étiquette et cherche une structure dans les données ; l’apprentissage par renforcement n’a pas d’étiquette mais un signal de récompense obtenu en agissant.
La nature de la sortie : un nombre continu en régression, une catégorie en classification. Tout le reste en découle — la fonction de perte, les métriques, et la façon de lire une erreur.
| Régression | Classification | |
|---|---|---|
| Sortie | un nombre | une classe, souvent une probabilité |
| Exemple | prix d’un logement | courriel indésirable ou non |
| Perte usuelle | erreur quadratique | entropie croisée |
| Métriques | MAE, RMSE, R² | précision, rappel, F1, AUC |
| Sens de l’erreur | « je me suis trompé de 12 % » | « je me suis trompé, ou pas » |
Le piège de la question, et c’est là qu’on distingue un candidat qui a pratiqué : le type de la colonne ne décide pas du problème.
Une note de 1 à 5 est un nombre, mais c’est une variable ordinale : traitée en régression, le modèle peut prédire 3,7, ce qui n’existe pas ; traitée en classification, on perd l’ordre, et confondre 1 avec 5 coûte autant que confondre 4 avec 5. Les deux approches sont défendables, et savoir énoncer ce compromis vaut mieux que trancher.
Un code postal est un nombre qui n’en est pas un : il faut l’encoder comme catégorie.
Et l’inverse existe aussi : prédire une probabilité d’attrition est une classification, mais on utilise la probabilité elle-même comme un score continu pour classer les clients par risque.
Parce que les trois jeux répondent à trois questions différentes, et qu’un jeu qui a servi à décider quelque chose ne peut plus servir à mesurer.
La phrase qui montre qu’on a compris le mécanisme : chaque décision prise en regardant un jeu de données le contamine. Si on essaie cinquante configurations et qu’on garde celle qui donne le meilleur score de test, ce score n’est plus une estimation honnête — on a surappris le test par sélection, et l’écart se révèle en production.
Les proportions usuelles sont 60/20/20 ou 70/15/15, mais elles ne sont pas la réponse : ce qui compte, c’est le nombre absolu d’exemples dans le jeu de test. Dix pour cent d’un million d’exemples suffisent largement ; vingt pour cent de trois cents exemples donnent une mesure trop bruitée pour décider quoi que ce soit — et c’est précisément là que la validation croisée remplace le jeu de validation.
Deux erreurs de découpage à mentionner, parce qu’elles annulent tout le raisonnement :
Un modèle surapprend quand il apprend les particularités de ses données d’entraînement — le bruit, les cas isolés — au lieu de la régularité qui s’y cache. Il devient excellent sur ce qu’il a vu et médiocre sur le reste.
La façon de le repérer tient en une comparaison : l’écart entre le score d’entraînement et le score de validation.
Ce qu’il faut ajouter pour montrer qu’on l’a vu en pratique : on ne le constate pas seulement à la fin, on le surveille pendant l’entraînement. La courbe de validation descend avec celle d’entraînement, puis remonte alors que la seconde continue de descendre. Ce point de retournement est exactement là qu’il faut s’arrêter, et c’est ce que fait l’early stopping.
Les remèdes, dans l’ordre où on les essaie :
Le piège à ne pas tomber dedans : un écart énorme entre entraînement et validation peut aussi signaler que les deux jeux ne suivent pas la même distribution — un découpage mal fait, une période différente. Avant de régulariser, il faut vérifier le découpage.
Le biais est l’erreur due aux hypothèses du modèle, la variance sa sensibilité au jeu d’entraînement. Réduire l’un augmente l’autre, et le diagnostic se lit sur l’écart entre les deux scores.
Lire la réponse détailléeLa validation croisée à k blocs découpe les données en k parts, entraîne k modèles en gardant chaque fois une part différente pour l’évaluation, et moyenne les k scores obtenus.
Ce qu’elle apporte, et c’est la raison de l’utiliser : chaque exemple sert une fois à évaluer et k−1 fois à entraîner. Là où un jeu de validation unique donne un score qui dépend beaucoup du découpage tiré, la moyenne sur k blocs est nettement plus stable — et l’écart-type entre les blocs est une information à part entière.
from sklearn.model_selection import cross_val_score, StratifiedKFold
decoupage = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(modele, X, y, cv=decoupage, scoring='roc_auc')
print(f'{scores.mean():.3f} ± {scores.std():.3f}')Un écart-type large — 0,81 ± 0,09 — dit que le modèle est instable ou que le jeu est trop petit. C’est un signal qu’un score unique aurait caché, et le mentionner fait la différence.
Quand l’utiliser : sur des données de taille modeste, et chaque fois qu’il faut comparer des modèles ou régler des hyperparamètres. k valant 5 ou 10 est le choix par défaut, sans raison théorique forte de préférer l’un à l’autre.
Quand ne pas l’utiliser : quand l’entraînement coûte cher — k fois le coût, c’est rédhibitoire pour un grand réseau — et quand un jeu de validation unique contient déjà des dizaines de milliers d’exemples, cas où le gain de stabilité est nul.
Les trois variantes à connaître, parce que le choix du découpage est plus important que la valeur de k :
Et le piège qui invalide tout le reste : la préparation des données doit se faire à l’intérieur de chaque bloc. Normaliser ou imputer avant de découper laisse fuiter la moyenne du jeu d’évaluation dans l’entraînement. C’est ce que résout un Pipeline, et c’est pour cela qu’on en utilise un.
Une information qui n’existera pas au moment de prédire se retrouve dans l’entraînement. Le score devient excellent et faux, et cela ne se voit pas avant la production.
Lire la réponse détailléeLes quatre cases qui croisent la prédiction et la réalité, et dont toutes les métriques de classification sont dérivées.
| Réalité positive | Réalité négative | |
|---|---|---|
| Prédit positif | vrai positif (VP) | faux positif (FP) |
| Prédit négatif | faux négatif (FN) | vrai négatif (VN) |
Les deux cases en gras sont les deux façons de se tromper, et elles n’ont presque jamais le même coût. C’est là tout l’intérêt de la matrice : l’exactitude résume les quatre cases en un seul nombre, donc elle efface exactement l’information qui sert à décider.
Les métriques, à savoir reconstruire de mémoire :
L’exemple qui montre pourquoi l’exactitude trompe, et qu’il faut donner sans qu’on le demande : sur un dépistage où une personne sur mille est malade, un modèle qui répond « en bonne santé » à tout le monde obtient 99,9 % d’exactitude et un rappel de zéro. Il est inutile, et le chiffre est excellent.
Deux points qui font bonne impression :
Cela dépend du coût de chaque erreur, pas du modèle. On privilégie le rappel quand manquer un cas positif coûte cher, la précision quand une fausse alerte coûte cher.
Lire la réponse détailléeL’AUC ROC est la probabilité que le modèle attribue un score plus élevé à un positif tiré au hasard qu’à un négatif tiré au hasard. C’est une mesure de capacité à ordonner, pas de justesse : 0,5 vaut le hasard, 1,0 le classement parfait.
Sa qualité principale : elle est indépendante du seuil. On peut comparer deux modèles avant d’avoir décidé où couper.
Sur des classes très déséquilibrées. C’est le cas à connaître, parce qu’il est fréquent et contre-intuitif. Le taux de faux positifs a le nombre de négatifs au dénominateur : quand les négatifs sont écrasants, mille faux positifs sur un million de négatifs représentent 0,1 %, donc la courbe reste magnifique. L’AUC affiche 0,95 alors que la liste envoyée aux analystes contient 99 % de fausses alertes.
Le réflexe à énoncer : sur un problème à 1 % de positifs, on regarde l’aire sous la courbe précision-rappel, qui ne comporte pas les vrais négatifs et s’effondre honnêtement.
Quand la décision porte sur une plage précise. L’AUC intègre tous les seuils, y compris ceux qu’on n’utilisera jamais. Si le processus ne permet de vérifier que les cent premiers dossiers, la métrique utile est la précision dans les cent premiers — pas une moyenne sur l’ensemble de la courbe.
Quand la probabilité elle-même est utilisée. L’AUC ne dépend que de l’ordre : un modèle qui prédit 0,7 partout où il devrait prédire 0,3 peut avoir une AUC parfaite. Si la probabilité alimente un calcul — une espérance de perte, une tarification — il faut la calibration, mesurée par le score de Brier ou une courbe de fiabilité.
Beaucoup de candidats disent « l’AUC mesure la performance du modèle ». La formulation qui montre qu’on l’a comprise : l’AUC mesure la qualité du classement, indépendamment du seuil et de la calibration. Les trois qualités sont distinctes, et un modèle peut exceller dans l’une et échouer dans les deux autres.
D’abord en changeant de métrique, ensuite en pondérant les classes, et en rééchantillonnant seulement si c’est nécessaire. Le déséquilibre est plus souvent un problème de mesure que de données.
Lire la réponse détailléeLes deux ajoutent une pénalité sur la taille des coefficients pour limiter le surapprentissage. Ce qui les sépare tient dans la forme de la pénalité, et la conséquence est nette : L1 met des coefficients à zéro, L2 les rétrécit sans les annuler.
| L1 — lasso | L2 — ridge | |
|---|---|---|
| Pénalité | somme des valeurs absolues | somme des carrés |
| Effet | coefficients exactement nuls | coefficients petits, non nuls |
| Usage | sélection de variables | stabilisation |
| Variables corrélées | en garde une, écarte les autres | répartit le poids entre elles |
| Solution | non unique, non différentiable en 0 | unique, forme analytique |
L’intuition géométrique, si on demande pourquoi L1 annule : la contrainte L1 dessine un losange, dont les sommets sont sur les axes ; la contrainte L2 dessine un cercle. La solution touche la contrainte en un point, et un losange se fait toucher par un coin — c’est-à-dire là où une coordonnée vaut zéro.
Quand choisir quoi, ce qui est la vraie question posée :
Deux points qui font bonne impression :
C de la régression logistique est l’inverse de la force de régularisation : un C petit régularise fort, ce qui est la source de confusion la plus commune sur ce sujet.Et le prolongement qui montre l’ampleur du concept : la régularisation n’est pas propre aux modèles linéaires. Le dropout d’un réseau, la profondeur maximale d’un arbre, le min_samples_leaf d’une forêt et l’arrêt anticipé sont tous des régularisations — la même idée que contraindre les coefficients, appliquée à une autre famille de modèles.
Parce qu’elle ne prédit pas une classe mais une probabilité, et qu’on obtient la classe en comparant cette probabilité à un seuil. Le mot « régression » vient de ce qu’elle régresse une quantité continue : la probabilité, ou plus exactement le logarithme du rapport de cotes.
Le mécanisme, en deux temps :
C’est cette seconde étape qui distingue la régression logistique de la régression linéaire, et la raison de ne pas utiliser la seconde pour classer : une droite prédit des valeurs négatives et supérieures à 1, qui ne veulent rien dire comme probabilités, et son erreur quadratique punit un exemple bien classé mais « trop loin » de la frontière.
Ce qu’il faut ajouter pour montrer qu’on comprend la lecture du modèle : le coefficient s’interprète en rapport de cotes. Un coefficient de 0,7 sur une variable signifie que sa hausse d’une unité multiplie les cotes de l’événement par e⁰·⁷, soit environ 2. C’est ce qui explique pourquoi ce modèle reste utilisé en crédit, en médecine et en assurance : le lien entre une variable et la décision se dit en une phrase, et se défend devant un régulateur.
Trois précisions qui font bonne impression :
De façon gloutonne : à chaque nœud, il essaie toutes les variables et tous les seuils possibles, et retient la coupure qui rend les deux groupes obtenus les plus homogènes possible en termes de cible. Puis il recommence dans chaque groupe, sans jamais revenir sur les coupures déjà faites.
La mesure d’homogénéité dépend du problème :
Le mot important est glouton, et c’est ce qu’il faut souligner : l’arbre choisit la meilleure coupure immédiate, pas celle qui mènerait au meilleur arbre final. Il n’y a aucune garantie d’optimalité globale, parce que trouver l’arbre optimal est un problème hors d’atteinte en calcul.
Ce qu’il faut ajouter sur l’arrêt, parce que c’est là que se joue la qualité : sans contrainte, l’arbre continue jusqu’à ce que chaque feuille soit pure, c’est-à-dire jusqu’à mémoriser l’entraînement. On l’arrête donc par max_depth, min_samples_leaf ou min_samples_split, ou on le laisse pousser puis on le taille en supprimant les branches dont le gain ne justifie pas la complexité.
Les trois propriétés à connaître, parce qu’elles expliquent tous les usages qui suivent :
Et le piège classique, qu’il vaut mieux mentionner soi-même : l’importance des variables calculée par impureté est biaisée en faveur des variables à nombreuses modalités, qui offrent plus de coupures possibles. Sur des données mêlant variables continues et binaires, il faut lui préférer l’importance par permutation ou les valeurs de Shapley.
La forêt moyenne des arbres indépendants et se règle presque toute seule ; le boosting corrige ses erreurs séquentiellement et gagne quelques points au prix d’un réglage soigné.
Lire la réponse détailléeCe sont deux façons d’assembler des modèles faibles, qui visent deux termes différents de l’erreur.
Le bagging — bootstrap aggregating — entraîne des modèles en parallèle, chacun sur un échantillon tiré avec remise, puis moyenne leurs prédictions. Les modèles sont indépendants, donc leurs erreurs se compensent partiellement : la variance baisse, le biais reste le même. La forêt aléatoire en est l’exemple, avec le tirage de variables en supplément.
Le boosting entraîne les modèles en séquence, chacun se concentrant sur ce que les précédents ont raté. La somme pondérée de modèles très simples devient un modèle expressif : le biais baisse, et la variance peut monter. AdaBoost et le gradient boosting en sont les deux formes.
| Bagging | Boosting | |
|---|---|---|
| Ordre | parallèle | séquentiel |
| Modèles de base | forts, à variance élevée | faibles, à biais élevé |
| Cible | la variance | le biais |
| Risque | peu de surapprentissage | surapprentissage si trop d’étapes |
| Données bruitées | robuste | sensible |
| Parallélisation | naturelle | limitée |
La condition à énoncer, parce qu’elle explique pourquoi le bagging fonctionne : la moyenne ne réduit la variance que si les modèles sont décorrélés. Moyenner cinquante arbres identiques ne donne rien de plus qu’un arbre. C’est exactement pourquoi la forêt aléatoire limite les variables candidates à chaque coupure : sans cela, tous les arbres couperaient d’abord sur la même variable dominante et se ressembleraient trop.
Et la sensibilité au bruit du boosting mérite une phrase : puisque chaque étape se concentre sur les exemples mal prédits, une étiquette erronée est poursuivie avec insistance. Sur un jeu aux étiquettes douteuses, une forêt est souvent le choix le plus sûr.
Le troisième terme, si l’on veut compléter : le stacking, qui entraîne un méta-modèle sur les prédictions de modèles hétérogènes. Il exploite la complémentarité des familles plutôt que la répétition d’une seule, et c’est ce qui gagne les compétitions — au prix d’un pipeline nettement plus lourd à maintenir.
Parce que la structure des arbres correspond à la structure des données tabulaires, là où celle d’un réseau de neurones ne correspond à rien de particulier.
Quatre raisons, à donner dans cet ordre :
Les coupures gèrent l’hétérogénéité des colonnes. Un tableau réel mêle un âge, un code postal, un montant en euros et un booléen. Un arbre compare chaque variable à un seuil dans sa propre unité ; un réseau doit tout ramener sur une échelle commune, et la mise à l’échelle d’une variable très asymétrique est une perte d’information.
L’invariance aux transformations monotones. Passer un montant au logarithme ne change pas un arbre, puisque l’ordre est conservé. Pour un réseau, c’est une transformation majeure, qu’il faut trouver. Toute une part du travail de préparation disparaît.
Les interactions sont apprises sans être déclarées. Une branche qui coupe sur l’ancienneté puis sur le nombre d’incidents exprime une interaction d’ordre deux. Un réseau y arrive aussi, mais il lui faut beaucoup plus d’exemples pour y parvenir par lui-même.
Le régime de données leur est favorable. Les jeux tabulaires comptent souvent des dizaines de milliers de lignes, pas des dizaines de millions. Les réseaux profonds ont besoin de volume pour compenser leur absence d’hypothèse structurelle ; les arbres sont efficaces avec peu.
Ce qu’il faut ajouter pour situer la réponse dans la littérature, et cela fait bonne impression : plusieurs études comparatives publiées depuis 2021 arrivent à la même conclusion — sur données tabulaires, les arbres boostés restent devant les architectures profondes conçues pour ce cas, et l’écart de temps d’ingénierie est plus grand encore que l’écart de performance.
La nuance à ne pas oublier, parce qu’elle montre qu’on ne récite pas une préférence : le boosting perd dès que la structure des données est le signal. Sur des images, du texte, du son ou des graphes, la disposition spatiale, l’ordre des mots ou la topologie portent l’information, et c’est exactement ce que les convolutions et l’attention exploitent. Un arbre voit un pixel comme une colonne indépendante de ses voisines.
Et le cas mixte, qui est celui des systèmes réels : on encode le texte ou l’image avec un modèle profond, puis on donne ces représentations en variables à un gradient boosting avec les colonnes du tableau. Chaque famille traite ce qu’elle traite mieux que l’autre.
Ceux qui reposent sur une distance ou sur une descente de gradient. Les modèles à base d’arbres n’en ont pas besoin, et la règle se retient à ce critère plutôt qu’à une liste.
Il faut normaliser :
Il n’est pas nécessaire de normaliser :
Les deux transformations à distinguer :
RobustScaler, qui utilise la médiane et l’écart interquartile, est plus sûr.Et le point qui compte autant que le choix de la transformation : elle s’ajuste sur l’entraînement seul. Calculer la moyenne sur tout le jeu avant de découper est une fuite de données, discrète et fréquente. D’où le Pipeline, qui rend l’erreur impossible :
pipeline = make_pipeline(StandardScaler(), LogisticRegression())
pipeline.fit(X_entrainement, y_entrainement)Le choix dépend de deux choses : le nombre de modalités et le modèle qui va consommer la variable.
L’encodage un-parmi-n (one-hot) crée une colonne binaire par modalité. C’est le choix par défaut en dessous d’une quinzaine de modalités, et le seul correct pour un modèle linéaire ou un réseau — parce qu’il n’introduit aucun ordre entre les modalités.
L’encodage ordinal remplace chaque modalité par un entier. Il n’est légitime que si l’ordre existe : petit < moyen < grand. Appliqué à des villes, il fait croire au modèle que Lyon est entre Lille et Marseille. Avec un modèle à base d’arbres, il reste néanmoins utilisable même sans ordre, puisque l’arbre peut isoler une modalité par coupures successives — au prix de quelques coupures gaspillées.
L’encodage par la cible remplace la modalité par la moyenne de la cible observée sur cette modalité. C’est la réponse aux variables à forte cardinalité — code postal, référence produit, identifiant d’appareil — là où un-parmi-n produirait des milliers de colonnes creuses.
C’est aussi celui qui demande de la précaution, et c’est ce que vérifie la question :
Les deux autres à connaître :
Et le cas qu’on oublie systématiquement, alors qu’il tombe en production : la modalité jamais vue à l’entraînement. Un nouveau pays, un nouveau produit. Sans consigne explicite, la transformation échoue ou produit une ligne vide. En scikit-learn, cela se règle d’un argument, et savoir le citer montre qu’on a déjà mis un modèle en service :
OneHotEncoder(handle_unknown='ignore', min_frequency=10)La première réponse n’est pas une technique, c’est une question : pourquoi cette valeur manque-t-elle ? Le mécanisme d’absence détermine le traitement, et l’ignorer introduit un biais qu’aucune imputation ne corrigera.
Les trois cas, avec leur conséquence :
Ce qu’on fait en pratique, dans l’ordre :
revenu_manquant en plus de la valeur imputée. C’est le réflexe le plus rentable et le moins cité : si l’absence porte du signal — et elle en porte souvent — le modèle peut l’utiliser au lieu de le subir.« inconnu » pour une catégorielle. Simple, robuste, suffisant dans la majorité des cas.IterativeImputer, ou les k plus proches voisins — quand les variables sont corrélées et que le taux d’absence est important. Plus précis, plus lent, et plus facile à mal faire.Deux points qui font la différence :
Pipeline.Et l’erreur à ne jamais commettre, parce qu’elle est fréquente et silencieuse : imputer par zéro une variable numérique sans y penser. Zéro est une valeur légitime pour un revenu, une température ou un solde ; l’utiliser comme marque d’absence rend les deux situations indistinguables et déplace la moyenne.
Trois familles de méthodes, et un critère de décision qui n’est pas la performance.
Les filtres évaluent chaque variable indépendamment du modèle : corrélation avec la cible, information mutuelle, test statistique. Rapides, et aveugles à deux choses — les redondances entre variables, et les variables inutiles seules mais décisives en combinaison.
Les enveloppes entraînent le modèle sur des sous-ensembles de variables et comparent. L’élimination récursive retire à chaque tour la variable la moins utile. Coûteux, et sujet au surapprentissage de la sélection si l’évaluation ne se fait pas en validation croisée.
Les méthodes intégrées font la sélection pendant l’entraînement : la pénalité L1 annule des coefficients, un arbre ignore les variables sur lesquelles il ne coupe jamais. C’est le meilleur rapport résultat / effort, et c’est ce qu’on utilise par défaut.
Le critère à énoncer, parce que c’est lui qui manque dans la plupart des réponses : on ne réduit pas le nombre de variables pour gagner en performance. Un gradient boosting supporte très bien deux cents colonnes dont la moitié sont inutiles. On réduit pour :
Deux pièges à mentionner :
Et le complément le plus utile en pratique : mesurer l’importance par permutation sur le jeu de validation. On mélange une colonne et on regarde ce que le score perd. C’est agnostique au modèle, cela mesure l’apport réel en généralisation, et cela répond directement à la question « puis-je supprimer cette colonne ? ».
En trois décisions : quelle méthode de recherche, quel protocole d’évaluation, et quels paramètres méritent d’être cherchés.
La méthode. La recherche exhaustive sur grille explose combinatoirement et gaspille l’essentiel de son budget sur des paramètres sans effet. La recherche aléatoire est le bon défaut, et le résultat qui le justifie est connu : à budget égal, elle trouve de meilleures configurations, parce qu’elle explore plus de valeurs distinctes des paramètres qui comptent vraiment. Au-delà, l’optimisation bayésienne — Optuna, scikit-optimize — choisit chaque essai en fonction des précédents, ce qui devient rentable quand un entraînement coûte des minutes.
Le protocole. C’est là que se joue la validité du résultat :
recherche = RandomizedSearchCV(
pipeline, # le pipeline entier, preparation comprise
distributions,
n_iter=60,
cv=StratifiedKFold(5, shuffle=True, random_state=42),
scoring='average_precision', # la metrique du probleme, pas l'exactitude
)Deux points obligatoires : la recherche porte sur le pipeline complet, sinon la préparation fuit ; et le score final se lit sur un jeu de test jamais utilisé par la recherche. Le meilleur score de validation croisée est un score optimiste, puisqu’on a retenu le maximum de soixante tirages — le maximum d’un bruit est biaisé vers le haut.
Les paramètres à chercher. Peu, et les bons. Sur un gradient boosting, le taux d’apprentissage et le nombre d’arbres — liés — puis la profondeur, puis les taux d’échantillonnage. Sur une forêt, presque rien : assez d’arbres, et éventuellement le nombre de variables candidates par coupure. Les échelles se choisissent logarithmiques pour tout ce qui est un taux ou une intensité de régularisation.
Ce qu’il faut ajouter, et qui vaut plus que la maîtrise des outils : le réglage arrive tard dans l’ordre des priorités. Une variable pertinente en plus, une étiquette corrigée, un découpage réparé rapportent davantage que le meilleur réglage possible. Passer une journée sur les hyperparamètres avant d’avoir vérifié le découpage est une erreur de méthode, et le dire fait bonne impression.
Deux réflexes économiques à citer : l’arrêt anticipé intégré à la recherche, qui abandonne les configurations manifestement mauvaises, et la réduction successive (HalvingRandomSearchCV), qui alloue progressivement plus de données aux configurations survivantes.
Le choix se fait sur deux critères : comment l’erreur doit être pénalisée, et dans quelle unité elle doit être lue.
| Métrique | Unité | Comportement |
|---|---|---|
| MAE | celle de la cible | erreur moyenne, robuste aux valeurs extrêmes |
| RMSE | celle de la cible | pénalise les grosses erreurs au carré |
| MAPE | pourcentage | relative, indéfinie si la cible peut valoir 0 |
| R² | sans unité | part de variance expliquée, comparable entre jeux |
MAE ou RMSE, c’est la vraie question, et la réponse est métier : est-ce qu’une erreur de 10 est deux fois plus grave qu’une erreur de 5, ou quatre fois ? Prévoir une demande de stock avec dix unités d’écart coûte proportionnellement — MAE. Sous-estimer la charge d’un réseau électrique de dix pour cent coûte bien plus que deux fois cinq pour cent — RMSE.
Le corollaire à connaître : MAE et RMSE n’optimisent pas la même chose. Minimiser l’erreur absolue conduit à prédire la médiane conditionnelle, minimiser l’erreur quadratique conduit à prédire la moyenne. Sur une distribution asymétrique — des montants, des durées — les deux prédictions diffèrent nettement, et ce n’est pas un détail de métrique mais un choix d’estimateur.
Trois précisions qui font bonne impression :
Et le réflexe à ne pas oublier : comparer à un modèle de référence. Un RMSE de 12,4 ne veut rien dire seul ; il veut dire quelque chose face au RMSE de la prédiction naïve — la moyenne, ou la dernière valeur observée sur une série temporelle.
Parce qu’un score seul ne veut rien dire. Un AUC de 0,78 ou un RMSE de 12,4 ne devient une information qu’en comparaison de quelque chose, et ce quelque chose doit être défini avant d’entraîner un modèle sérieux.
Les références utiles, selon le problème :
Ce qu’un modèle de référence apporte au-delà du chiffre, et c’est ce qui fait la qualité de la réponse :
La formulation qui montre l’expérience : le premier livrable d’un projet de modélisation n’est pas un modèle, c’est une mesure de l’existant. Sans elle, on ne peut ni prouver un gain, ni justifier un abandon.
Les données d’entrée s’éloignent de celles de l’entraînement, ou le lien entre entrées et cible change. Le modèle répond sans erreur, et ses prédictions deviennent fausses.
Lire la réponse détailléeEn distinguant l’explication globale, qui dit ce que le modèle a appris, de l’explication locale, qui justifie une prédiction. SHAP répond à la seconde, et c’est presque toujours celle qu’on demande.
Lire la réponse détailléeEn optimisant une quantité métier sur le jeu de validation, jamais en gardant le 0,5 par défaut — qui n’est qu’une convention d’implémentation, sans aucune justification statistique.
La démarche, en trois temps :
1. Chiffrer les deux erreurs. Combien coûte un faux positif, combien coûte un faux négatif ? En euros, en heures d’analyste, en risque. Ce chiffrage vient du métier, et l’obtenir est souvent la partie la plus difficile du travail.
2. Choisir le seuil qui minimise le coût total sur la validation :
couts = [
faux_positifs(seuil) * cout_fp + faux_negatifs(seuil) * cout_fn
for seuil in seuils
]
seuil_retenu = seuils[int(np.argmin(couts))]Quand le chiffrage est impossible, on substitue une contrainte opérationnelle, qui joue le même rôle : « les analystes peuvent traiter deux cents dossiers par jour » fixe le seuil par la capacité, et c’est souvent la formulation la plus juste du problème réel.
3. Vérifier le seuil sur le test, comme n’importe quel autre paramètre appris. Un seuil choisi sur la validation puis évalué sur cette même validation donne un résultat optimiste.
Trois points qui distinguent une réponse expérimentée :
Et la précision technique à ne pas manquer : si la probabilité doit être interprétée — pour un calcul d’espérance de perte, une tarification — il faut d’abord calibrer le modèle, par régression isotone ou par la méthode de Platt. Un gradient boosting sort des scores mal calibrés : le seuil optimal fonctionne quand même, mais le nombre lui-même ne peut pas être lu comme une probabilité.
Jamais par un découpage aléatoire. La règle tient en une phrase : le modèle ne doit être évalué que sur des données postérieures à celles qu’il a vues.
Un train_test_split mélangé sur une série temporelle entraîne le modèle sur juin pour prédire mai. Le score obtenu est excellent, et il ne se reproduira jamais — parce qu’en production, l’avenir n’est pas disponible. C’est la fuite de données la plus facile à commettre et la plus coûteuse à découvrir tard.
La validation croisée temporelle avance dans le temps par blocs successifs :
from sklearn.model_selection import TimeSeriesSplit
# Chaque bloc entraine sur tout le passe et evalue sur la periode suivante.
for i_entrainement, i_test in TimeSeriesSplit(n_splits=5).split(X):
...Deux variantes, selon l’hypothèse qu’on fait sur le phénomène : la fenêtre croissante, où l’entraînement accumule tout l’historique, et la fenêtre glissante, de taille fixe, qui oublie le passé lointain. La seconde est préférable quand le comportement dérive, et le comparatif entre les deux est en soi un résultat intéressant à présenter.
Les trois précautions qui font la qualité d’une réponse senior :
Et le complément qui montre qu’on relie la validation à la production : la bonne façon de vérifier un modèle temporel est de rejouer l’histoire — se placer à chaque date, n’utiliser que ce qui était connu ce jour-là, prédire, puis comparer. C’est plus long à mettre en place qu’une validation croisée, et c’est la seule mesure qui ressemble à ce qui se passera vraiment.
C’est la question la plus révélatrice de l’expérience réelle d’un candidat, parce qu’elle n’a pas une réponse mais une liste ordonnée d’hypothèses à éliminer.
1. Une fuite de données. L’hypothèse la plus probable, à vérifier avant toutes les autres. Une variable qui n’existe pas encore au moment de prédire, ou une préparation ajustée avant le découpage. Le score hors ligne était faux depuis le début.
2. Un décalage entre l’entraînement et le service (training-serving skew). Les variables ne sont pas calculées de la même façon des deux côtés : un groupby pandas dans le carnet d’expérimentation, une requête SQL en production, et une différence d’arrondi, de fuseau horaire ou de valeur par défaut. Le modèle reçoit des entrées légèrement différentes de celles sur lesquelles il a appris. C’est la panne la plus fréquente en pratique, et la raison d’être d’un magasin de variables partagé entre l’entraînement et le service.
3. Une fraîcheur différente. Hors ligne, toutes les variables étaient complètes. En production, une table est alimentée avec six heures de retard, et le modèle prédit sur des valeurs manquantes ou périmées qu’il n’a jamais rencontrées à l’entraînement.
4. Une population différente. Le jeu d’entraînement venait de l’historique des clients existants ; le modèle sert maintenant tous les visiteurs, dont ceux que le processus précédent écartait. Le modèle extrapole hors de son domaine.
5. Une métrique qui ne mesure pas l’objectif. Le cas le plus embarrassant : le modèle fonctionne, et le gain n’apparaît pas. L’AUC a progressé de trois points, le taux de conversion n’a pas bougé — parce que la métrique hors ligne n’était pas reliée à la décision, ou parce que le gain se situait sur des cas que le processus ne traite pas.
6. Un effet de rétroaction. Le modèle change le comportement qu’il prédit. Un moteur de recommandation modifie ce que les gens voient donc ce qu’ils cliquent ; un modèle antifraude bloque des transactions dont on ne saura jamais l’issue. Les données de production ne sont plus celles sur lesquelles la mesure hors ligne portait.
La phrase à retenir, qui résume le tout : une mesure hors ligne estime la performance d’un modèle, une mesure en ligne estime la valeur d’une décision. Les deux peuvent diverger sans que personne se soit trompé.
D’où les deux pratiques à énoncer pour finir, parce qu’elles répondent à la question avant qu’elle se pose : le déploiement en observation (shadow mode), où le modèle prédit en production sans décider, ce qui permet de comparer ses entrées et ses sorties avec celles de l’expérimentation ; et l’essai contrôlé sur une fraction du trafic, qui est la seule façon de mesurer un gain réel.
Question de jugement, posée pour vérifier qu’un candidat sait renoncer. Les cas où il faut répondre non :
Quand une règle suffit. Si la décision s’écrit en trois conditions que le métier connaît déjà, une règle est plus rapide, plus lisible, testable unitairement, et ne dérive pas. Apprendre une règle connue est un coût sans contrepartie.
Quand il n’y a pas d’étiquettes, et aucun moyen d’en obtenir. Sans supervision, pas d’apprentissage supervisé — et l’étiquetage manuel de quelques milliers d’exemples est un projet en soi, dont il faut décider en connaissance de cause.
Quand le volume est trop faible. Trois cents lignes avec quarante variables ne permettent pas de conclure : la variance du score de validation dépassera l’écart entre les modèles comparés. Une analyse statistique honnête vaut mieux qu’un modèle qui donne une illusion de précision.
Quand l’erreur n’est pas acceptable. Un modèle se trompe par construction. S’il faut une garantie — un calcul réglementaire, une facturation, un contrôle de sécurité — la réponse est un algorithme déterministe, éventuellement assisté d’un modèle en amont pour prioriser.
Quand le phénomène change plus vite qu’on ne peut réentraîner. Un modèle validé sur trois mois d’historique et déployé sur un marché qui se réorganise tous les quinze jours sera périmé avant d’être en service.
Quand personne ne pourra le maintenir. Un modèle est un système vivant : surveillance, réentraînement, gestion des versions, astreinte. Livrer un modèle à une équipe qui n’a pas ces moyens produit une dette qui se paiera dans six mois, quand ses prédictions seront devenues fausses sans que personne ne le remarque.
Quand le gain n’a pas de destinataire. Si aucune décision ne change en fonction de la prédiction, la meilleure performance du monde ne vaut rien. La question à poser au commanditaire est simple : qu’allez-vous faire différemment quand vous aurez ce nombre ? Sans réponse claire, le projet n’a pas d’objet.
La formulation qui conclut bien, et qui est vraie : le rôle n’est pas de livrer un modèle, c’est de résoudre le problème. Recommander une règle, un tableau de bord ou un meilleur processus de collecte quand c’est la bonne réponse inspire nettement plus confiance que d’entraîner un modèle parce que c’était la demande.