Aller au contenu

académiqueRéalisé pendant ma formation d’ingénieurfévrier 2026

Machine learning : prédire les départs de salariés

Prédire quels salariés vont démissionner : cinq sources RH à réconcilier, vingt-huit modèles comparés dans les mêmes conditions, et un protocole tenu pour que les scores veuillent dire quelque chose.

  • Python 3.11
  • pandas
  • scikit-learn
  • XGBoost
  • LightGBM
  • SMOTE
Ce que c’est

Un modèle de prédiction des départs volontaires, construit sur les données RH d’une entreprise, à partir de cinq sources à réconcilier.

Ce qui était dur

Un employé sur six part, et manquer un partant coûte bien plus cher qu’une fausse alerte. Toute la difficulté est dans cet arbitrage.

Ce que ça prouve

Chaque étape du protocole est verrouillée pour que le test ne participe jamais à sa propre préparation, et les deux versions sont comparées chiffres à l’appui.

Projet de groupe, quatre personnes, dans le cadre du bloc apprentissage automatique du cycle ingénieur. Le cas est celui d’une entreprise pharmaceutique fictive qui veut comprendre pourquoi ses employés partent.

Un salarié sur six s’en va

Un employé sur six quitte l’entreprise chaque année, et 16,12%productionTaux de départ observé sur l’année : 16,12 % (production). de départs se paie cher : recrutement, formation, projets retardés le temps de remplacer. La demande métier est double, prédire qui risque de partir, et dire sur quels leviers agir.

Ce sont deux questions différentes, et elles ne se satisfont pas du même modèle : un modèle qui prédit bien mais qu’on ne sait pas lire ne dit à personne quoi faire lundi matin.

Une classe rare, des erreurs asymétriques

Cinq sources à réconcilier. Données générales des employés, deux enquêtes de satisfaction, et les relevés d’entrée et de sortie de badgeuse sur une année entière, à fusionner sur l’identifiant employé.

Un déséquilibre de un contre cinq. La classe qui intéresse est la plus rare. Un modèle qui prédirait « personne ne part » aurait déjà l’air excellent et ne servirait à rien du tout.

Les erreurs ne coûtent pas le même prix. Manquer un partant, c’est perdre la personne. Alerter à tort, c’est un entretien de trop. L’évaluation doit donc regarder le rappel avant l’exactitude.

Cinq sources, sept algorithmes

De cinq sources au protocole d’évaluation

Le protocole compte autant que le modèle

  1. Cinq sources
    données générales, deux enquêtes, entrées et sorties de badgeuse
  2. Fusion et exploration
    jointure sur l’identifiant, tests statistiques par variable
  3. Sept variables temporelles
    durées travaillées, écarts à l’horaire, départs anticipés
  4. Vingt-huit entraînements
    sept algorithmes, avec et sans rééquilibrage, sur deux protocoles
  5. Protocole groupé par individu
    aucun duplicata ne franchit la frontière
    Protocole naïf, par lignes
    le jeu réplique chaque profil : le modèle reconnaît des individus déjà vus
Cinq fichiers sources sont fusionnés sur l’identifiant employé, puis les relevés de badgeuse produisent sept variables temporelles. Sept algorithmes sont entraînés avec et sans rééquilibrage, sous deux protocoles de séparation. Le protocole naïf découpe les lignes, et donne un score presque parfait parce que le jeu réplique chaque profil ; le protocole groupé sépare les individus, et donne le seul chiffre défendable.

Fusion et exploration. Les cinq sources sont jointes sur l’identifiant, puis chaque variable candidate est confrontée à la cible par un test statistique, khi-deux pour les variables catégorielles, test de Student pour les continues. Ce n’est pas décoratif : c’est ce qui écarte les variables sans lien avant de faire tourner quoi que ce soit.

Sept variables construites depuis la badgeuse. Les relevés d’entrée et de sortie, relevés jour après jour sur une année entière, ne servent à rien tels quels. Ils deviennent des durées travaillées, des écarts à l’horaire théorique, des comptes de départs anticipés et d’absences. C’est la partie qui demande le plus de travail et c’est celle qui produit les variables les plus discriminantes.

Vingt-huit entraînements comparés. Sept algorithmes, de la régression logistique aux forêts et au gradient boosting, chacun avec et sans rééquilibrage de la classe minoritaire, sur deux protocoles de séparation différents. Puis 216combinaisonsjeu de validationCombinaisons d’hyperparamètres explorées : 216 combinaisons (jeu de validation). pour le modèle retenu, chacune évaluée par validation croisée à cinq blocs.

contrainte tenue

Protocole anti-fuite tenu de bout en bout : séparation avant toute transformation, imputation et rééquilibrage ajustés sur le train seul, jeu de test laissé à sa distribution naturelle.

Ce que j’ai tranché, et à quel prix

Rééquilibrer, et payer le prix affiché. Le sur-échantillonnage de la classe minoritaire fait repérer 31,6points de plusjeu de testSur cent salariés qui vont partir, le rééquilibrage en fait repérer trente-deux de plus. En échange, davantage de fausses alertes. de partants sur cent, en moyenne sur les sept algorithmes, et coûte 10,1points de moinsjeu de testLe prix à payer : parmi les salariés signalés comme à risque, dix de plus sur cent le sont à tort. de justesse sur les alertes. Sur ce problème l’échange est bon, parce qu’un partant manqué coûte plus qu’un entretien inutile, mais il est mesuré au lieu d’être supposé.

Deux protocoles de séparation maintenus côte à côte plutôt qu’un seul corrigé en silence. Le premier ajuste les transformations avant de séparer, ce qui laisse le jeu de test influencer l’imputation ; le second sépare d’abord. Garder les deux permet de chiffrer ce que la précaution change, au lieu d’affirmer qu’elle compte.

Le notebook et la documentation ne retiennent pas le même modèle, et je le signale plutôt que de choisir celui qui m’arrange. Le notebook conclut sur le gradient boosting, en tête au score. La documentation recommande la forêt aléatoire, parce qu’elle donne des importances de variables qu’une équipe RH peut lire.

L’arbitrage entre les deux est réel : un modèle qui gagne un point et que personne ne sait interpréter ne répond qu’à une des deux questions posées. Mais les deux documents du livrable le tranchent différemment sans le dire, et personne ne s’en est aperçu avant que je relise.

artefact reproductible

Chaîne complète rejouable : fusion de cinq sources, analyse exploratoire avec tests statistiques, ingénierie de variables temporelles depuis les relevés de badgeuse, puis sept algorithmes comparés avec et sans rééquilibrage, sur deux protocoles de séparation.

Ce que le protocole a tenu

Ce que les données disent des départs

L’analyse exploratoire sort trois facteurs nets, chacun confirmé par un test statistique. Les employés qui voyagent fréquemment partent trois fois plus que ceux qui ne voyagent jamais. Les célibataires partent deux fois et demie plus que les divorcés. Et les partants ont en moyenne un an et demi de moins avec leur manager actuel.

Un quatrième écart apparaît sur les relevés de badgeuse, les partants travaillant plus longtemps chaque jour, mais celui-là n’a pas été soumis à un test : c’est une différence de moyennes, pas un résultat établi.

C’est la partie directement actionnable, et elle ne dépend d’aucun modèle.

Le protocole anti-fuite, tenu de bout en bout

Une fuite de données, c’est une information qui passe de l’entraînement à l’évaluation par une porte dérobée, et qui fait paraître un modèle meilleur qu’il n’est. Le projet a construit un second pipeline qui s’en protège à chaque étape, et l’a fait tourner à côté du premier.

La séparation entre entraînement et test précède toute transformation. Le remplissage des valeurs manquantes, l’encodage des variables et la mise à l’échelle sont calculés sur le train seul, puis appliqués tels quels au test : à aucun moment le test ne participe au calcul de quoi que ce soit. Le rééquilibrage de la classe rare est lui aussi cantonné au train, et le jeu de test garde sa proportion naturelle de départs.

Et surtout, les deux versions ont été gardées côte à côte. La première ajuste les transformations avant de séparer, la seconde après. Plutôt que de corriger en silence, le projet a fait tourner les deux sur les mêmes données pour mesurer ce que la précaution change.

Le verdict est que ça ne change presque rien, et l’écart va dans les deux sens selon l’algorithme. C’est un résultat en soi : sur ce jeu, l’imputation avant séparation ne gonflait pas les scores. La précaution reste la bonne pratique, mais elle se justifie par principe, pas par un gain mesuré, et le projet est allé le vérifier au lieu de le supposer.

contrainte tenue

Séparation avant toute transformation, imputation, encodage, mise à l’échelle et rééquilibrage ajustés sur le train seul, jeu de test laissé à sa distribution naturelle, et les deux protocoles comparés chiffres à l’appui.

Ce que ces scores ne valent pas

Le jeu est synthétique, dérivé d’un cas public largement réutilisé. Les relations qu’il porte sont plausibles, elles ne sont pas celles d’une entreprise réelle, et rien de ce qui précède ne se transporte tel quel dans un service RH.

Les scores de comparaison sont surévalués, pour la raison expliquée juste en dessous : les modèles ont été notés sur des personnes qu’ils avaient déjà rencontrées. Le classement relatif des algorithmes reste informatif, les valeurs absolues non.

Le piège que nous n’avons pas vu

Le piège du jeu public, que nous n’avons pas vu. Le protocole anti-fuite décrit plus haut est correct sur tous les points qu’on vérifie d’habitude. Il lui manquait une vérification que personne dans le projet n’a faite : compter les personnes réellement distinctes.

Le fichier annonce 4 410lignesproductionEmployés dans le jeu de données : 4 410 lignes (production). numérotés à la suite. Il n’y a en réalité que 1 573personnesproductionLe fichier annonce 4410 employés numérotés de 1 à 4410. En réalité la plupart y figurent en trois exemplaires : il n’y a qu’un tiers de personnes réelles. : la plupart y figurent en trois exemplaires, identiques sur tous les attributs RH et sur les deux enquêtes, cible comprise, l’identifiant mis à part. Cette réplication appartient au jeu public d’origine. Découper ces lignes au hasard disperse donc les copies d’une même personne des deux côtés de la frontière.

Un modèle de contrôle, entraîné sur ces mêmes attributs, passe de 0,9996AUCjeu de testUne AUC de 1 signifie « ne se trompe jamais », 0,5 « répond au hasard ». Un score aussi proche de 1 sur un problème humain n’est pas un exploit, c’est un signal d’alarme. à 0,7332 ± 0,03AUCjeu de testConcrètement : mis devant un salarié qui va partir et un qui va rester, le modèle désigne le bon sept fois sur dix. Le hasard en réussirait cinq, le score parfait dix. C’est le vrai niveau, loin du sans-faute qu’annonçait le découpage habituel. une fois les personnes maintenues d’un seul côté. Ce n’est pas le modèle du projet et ce ne sont pas ses variables : les relevés de badgeuse, eux, diffèrent d’une copie à l’autre. Ce contrôle mesure ce que la seule reconnaissance d’une fiche rapporte, et la réponse est : presque tout l’écart.

Un indice traînait dans le dépôt, et personne ne l’a relevé. Le rapport écrit du projet annonce 0,76F1jeu de testLe rapport écrit du projet annonce un score bien plus bas que celui qu’affiche le carnet exécuté, et c’est le rapport qui a l’air juste. pour le modèle qu’il recommande, quand le carnet exécuté en affiche 0,986F1jeu de testF1 du meilleur modèle à base d’arbres : 0,986 F1 (jeu de test, n = 882).. Deux documents du même travail, deux réponses distantes de vingt points, et aucune des deux ne réclame l’autre. Un écart pareil entre ce qu’on écrit et ce que la machine affiche est exactement le genre de signal qu’il faut aller ouvrir.

La leçon tient en une ligne de code jamais écrite : compter les individus distincts avant de découper, surtout sur un jeu public que beaucoup de gens réutilisent sans le vérifier.

artefact reproductible

Le diagnostic se rejoue en une commande : le script regroupe les lignes par personne, compare les deux découpages sur les mêmes données, et écrit les deux valeurs ci-dessus.

Je me servirais de la régression logistique comme d’un détecteur. Elle était là, dans les sept algorithmes comparés, et elle criait : un modèle linéaire ne peut pas retenir un individu, donc l’écart énorme entre elle et les modèles à base d’arbres était le symptôme, disponible dès le premier tableau de résultats. Personne ne l’a lu comme un signal, moi le premier.

Je poserais la question du coût réel dès le cadrage. Tout le projet arbitre entre rappel et précision au nom d’un coût de remplacement, sans que ce coût ait jamais été chiffré avec le métier. L’arbitrage est défendable, sa justification reste une hypothèse.

Trois projets de ce portfolio portent la même forme d’angle mort, une agrégation qui masque un cas non traité : ici un individu déjà vu, sur Leyenda une classe jamais apprise, et sur INSEI un chemin du pipeline bien moins couvert que l’autre.

Preuves

artefact reproductibleChaîne complète rejouable : fusion de cinq sources, analyse exploratoire avec tests statistiques, ingénierie de variables temporelles depuis les relevés de badgeuse, puis sept algorithmes comparés avec et sans rééquilibrage, sur deux protocoles de séparation.contrainte tenueProtocole anti-fuite tenu de bout en bout : séparation avant toute transformation, imputation et rééquilibrage ajustés sur le train seul, jeu de test laissé à sa distribution naturelle.mesureÉcart quantifié entre un protocole naïf et un protocole groupé par individu, à modèle et variables identiques.arbitrage documentéHypothèse initiale de fuite temporelle testée puis écartée sur preuve : partants et restants pointent jusqu’à la même date, avec un nombre de jours présents équivalent. La cause réelle était ailleurs.artefact reproductibleDiagnostic rejouable en une commande : le script regroupe les lignes par personne, compare les deux découpages sur les mêmes données et écrit toutes les valeurs publiées ici.

Chiffres et méthode

13 chiffres et la façon dont chacun a été mesuré
Entraînements comparés avant de choisir un modèle
28entraînementsjeu de testToutes les combinaisons plausibles entraînées dans les mêmes conditions, puis comparées : le choix du modèle se défend, il ne se devine pas.Sept algorithmes, de la régression logistique au gradient boosting, chacun entraîné avec et sans rééquilibrage de la classe minoritaire, et sur les deux protocoles de séparation maintenus en parallèle. Tous évalués sur le même jeu de test.
Employés dans le jeu de données
4 410lignesproductionNombre de lignes après fusion des cinq fichiers sources sur l’identifiant employé : données générales, deux enquêtes de satisfaction, et les relevés d’entrée et de sortie de badgeuse.4410 lignes, mais pas 4410 personnes : le jeu public d’origine réplique chaque profil jusqu’à trois fois.
Taux de départ observé sur l’année
16,12%productionPart des employés ayant quitté l’entreprise dans l’année, comptée sur l’ensemble du jeu. C’est la classe positive à prédire, et son déséquilibre gouverne tout le protocole d’évaluation.
F1 de la régression logistique, modèle de référence
0,489F1jeu de testRégression logistique entraînée sur le protocole à séparation précoce, rééquilibrage de la classe rare appliqué au train seul, évaluée sur le jeu de test tenu à l’écart. Elle sert de plancher appris : un modèle linéaire ne peut pas mémoriser un individu.
F1 du meilleur modèle à base d’arbres
0,986F1jeu de testXGBoost entraîné sur le protocole à séparation précoce, rééquilibrage appliqué au train seul, évalué sur le jeu de test tenu à l’écart.Ce score n’est pas un résultat exploitable. L’explication la plus probable est la réplication des profils dans le jeu public, qui laisse le modèle reconnaître des individus déjà vus ; un modèle de contrôle l’établit sur les attributs RH, sans le prouver sur les variables de badgeuse que ce score-ci utilise aussi.
F1 annoncé par le livrable écrit du projet
0,76F1jeu de testLe rapport écrit du projet annonce un score bien plus bas que celui qu’affiche le carnet exécuté, et c’est le rapport qui a l’air juste.Valeur reportée dans le tableau de résultats du README du dépôt, pour le modèle qui y est recommandé. La documentation du projet donne le même ordre de grandeur.Aucune cellule du carnet exécuté ne produit cette valeur : rien ne dit sur quelle exécution elle a été relevée.
Partants détectés en plus grâce au rééquilibrage
31,6points de plusjeu de testSur cent salariés qui vont partir, le rééquilibrage en fait repérer trente-deux de plus. En échange, davantage de fausses alertes.Écart moyen de rappel entre les modèles entraînés avec et sans sur-échantillonnage de la classe minoritaire, à protocole identique, moyenné sur les sept algorithmes comparés.Payé par une perte moyenne de précision de 0,101 : le rééquilibrage déplace l’arbitrage, il ne l’annule pas.
Justesse des alertes perdue en échange
10,1points de moinsjeu de testLe prix à payer : parmi les salariés signalés comme à risque, dix de plus sur cent le sont à tort.Écart moyen de précision entre les modèles entraînés avec et sans sur-échantillonnage, à protocole identique, moyenné sur les sept algorithmes comparés. C’est la contrepartie mesurée du gain de rappel.
Combinaisons d’hyperparamètres explorées
216combinaisonsjeu de validationRecherche exhaustive sur grille pour le modèle retenu, chaque combinaison évaluée par validation croisée à cinq blocs sur le train.
Ce que le modèle semble valoir avec le découpage habituel
0,9996AUCjeu de testUne AUC de 1 signifie « ne se trompe jamais », 0,5 « répond au hasard ». Un score aussi proche de 1 sur un problème humain n’est pas un exploit, c’est un signal d’alarme.Découpage aléatoire ligne à ligne, validation croisée à cinq blocs, forêt aléatoire de 300 arbres, graine fixée, sur les attributs RH et d’enquête. Le notebook découpe lui aussi au hasard ligne à ligne ; son modèle et ses réglages diffèrent, ce contrôle ne le reproduit pas.Ce score n’est pas une performance : il vient du fait que la plupart des personnes du test sont déjà présentes dans l’entraînement.
Ce qu’il vaut réellement, une fois les personnes séparées
0,7332 ± 0,03AUCjeu de testConcrètement : mis devant un salarié qui va partir et un qui va rester, le modèle désigne le bon sept fois sur dix. Le hasard en réussirait cinq, le score parfait dix. C’est le vrai niveau, loin du sans-faute qu’annonçait le découpage habituel.Même jeu, mêmes variables, même modèle, même graine. Seul le découpage change : toutes les lignes décrivant une même personne restent du même côté de la frontière, de sorte que le modèle n’évalue jamais quelqu’un qu’il a déjà rencontré.L’incertitude est l’écart-type entre les cinq blocs, pas un intervalle de confiance au sens strict.
Lignes de test décrivant une personne déjà vue à l’entraînement
93,42%jeu de testLe modèle passait un examen dont il avait déjà corrigé neuf copies sur dix. C’est ce qui explique le score presque parfait, et personne dans le projet ne l’avait vérifié.Sur le découpage aléatoire lui-même, part des lignes de test dont la personne apparaît aussi dans l’entraînement, moyennée sur les cinq blocs. Deux lignes décrivent la même personne quand toutes leurs colonnes coïncident, l’identifiant mis à part.
Personnes réellement distinctes derrière les 4410 lignes
1 573personnesproductionLe fichier annonce 4410 employés numérotés de 1 à 4410. En réalité la plupart y figurent en trois exemplaires : il n’y a qu’un tiers de personnes réelles.Regroupement des 4410 lignes par égalité stricte de toutes les colonnes hors identifiant : 1368 personnes apparaissent trois fois, 101 deux fois, 104 une seule fois.