Ilyas Ouhnine Produits IA · de bout en bout
Tous les écrits

Inférence inverse

Déduire la règle à partir du résultat

Une base publique m’annonçait le gagnant de chaque décision, jamais le critère appliqué pour le choisir. J’ai construit un moteur qui le déduit. Il tranche 38 cas sur 100 à haute confiance, il refuse de trancher quand il ne peut pas — et il a trouvé sept erreurs dans les données dont il partait.

2026-09-059 min de lectureInférence · PostgreSQL · Qualité des données · Modèle de confiance

Le problème, en une phrase

Il existe toute une famille de problèmes où la donnée vous donne le résultat d’une décision, mais pas le critère qui l’a produit. Un jury publie son lauréat sans sa grille. Un moteur de tarification affiche un prix sans sa règle. Une commission publie le gagnant, l’ordre des offres et tous les montants — mais la case « méthode » est vide, ou remplie au petit bonheur.

Dans mon cas c’était la troisième. Plusieurs milliers de décisions publiques, chacune avec ses candidats, leurs montants, et le nom du gagnant. La règle qui a produit ce gagnant n’était renseignée que par intermittence, et quand elle l’était, elle était souvent recopiée d’un champ de formulaire qui ne veut rien dire.

La question tient en une ligne : si on connaît le gagnant et l’ensemble des offres, peut-on remonter à la règle ? La réponse est oui pour la grande majorité des cas — à condition d’accepter de ne pas répondre pour les autres.

Pourquoi on ne peut pas simplement lire la réponse

Le premier réflexe est d’aller chercher la règle dans le texte : le champ de la fiche, la phrase de justification du procès-verbal. C’est ce que faisait déjà mon collecteur, avec une table de motifs.

Ça marche quand la source est honnête. Le problème est qu’elle ne l’est pas toujours, et surtout qu’elle est silencieuse quand elle ne sait pas : le champ contient une valeur par défaut qui a l’air d’une information.

Une valeur par défaut qui ressemble à une donnée est pire qu’un champ vide. Elle ne déclenche aucune alerte, elle traverse tout le pipeline sans résistance, et elle finit dans un tableau de bord où quelqu’un la lit comme un fait.

D’où le renversement : ne plus croire l’étiquette, la recalculer à partir de ce qui n’est pas discutable — des montants et un gagnant.

Huit observations, aucune supposition

Le point de départ est la liste des offres recevables pour une décision donnée, et le fait de savoir laquelle a gagné. Sur cette liste, huit quantités se calculent sans rien supposer.

Toutes les offres sont-elles identiques ? Une égalité parfaite entre trois candidats ou plus n’arrive pas par hasard : elle signifie que le prix n’était pas l’objet de la compétition — c’est un pourcentage appliqué à une base commune.

Le gagnant est-il le moins cher ? Est-il celui qui s’approche le plus, par en dessous, d’un prix de référence calculable ? Existe-t-il un candidat recevable moins cher qui a perdu ? — celui-là est le plus informatif du lot : il élimine à lui seul toute règle du moins-disant.

Et quatre autres, plus faibles mais utiles pour arbitrer : la décision est-elle antérieure au changement de régime réglementaire, le libellé de la procédure contient-il un indice, combien de gagnants dans le groupe, quelle est la dispersion des montants.

La préparation compte autant que les signaux. Avant de calculer quoi que ce soit, il faut retirer de la liste ce que la règle elle-même écarte : les offres administrativement rejetées, celles jugées anormalement basses, celles au-dessus d’un plafond. Un signal calculé sur la mauvaise population ne dit rien du tout.

Et tout se calcule par lot, jamais globalement : une même décision peut porter sur plusieurs lots attribués séparément, et les mélanger brouille chaque signal.

L’arbre

L’arbre est court, et c’est voulu. Chaque nœud est une observation, pas une heuristique — on peut relire n’importe quelle décision et dire exactement quelle inégalité l’a produite.

Le point important est la sortie « indéterminé ». Un seul candidat recevable, ou une égalité à deux, ne permettent de rien conclure. La tentation est de trancher quand même, avec une confiance basse. C’est une erreur : une étiquette fausse à 0,4 de confiance sera lue comme une étiquette, pas comme une incertitude.

aucun gagnant identifié ─────────────────────► INDÉTERMINÉ (0,00)

le libellé nomme explicitement la règle ────────► cette règle (0,95)

n ≥ 3 et tous les montants égaux ───────────────► base commune (0,95)

un candidat recevable MOINS CHER a perdu
        │
        ├── le gagnant est le plus proche
        │   du prix de référence, par en bas ────► règle du prix de référence
        │                                          (0,95 si n ≥ 3, 0,70 si n = 2)
        │
        └── il ne l'est pas non plus ────────────► la décision s'est jouée
                                                   ailleurs qu'au prix (0,80)

le gagnant est le moins cher ───────────────────► règle du prix
                                                   (0,90 avant réforme,
                                                    0,70 après — ambigu)

La confiance, écrite avant les résultats

Le modèle de confiance est la partie du système qui a le plus compté, et c’est celle dont on parle le moins. Il a été écrit avant de regarder les résultats, pour ne pas être calibré sur l’envie d’avoir raison.

Deux principes le gouvernent.

La confiance descend quand une entrée manque. Sans estimation, le prix de référence n’est pas calculable : le plafond tombe à 0,50, quelle que soit la netteté des autres signaux. Sans la catégorie, le seuil d’anormalité est pris par défaut, on retire un cran.

La confiance descend quand deux règles prédisent la même chose. Le cas le plus fréquent est celui où le gagnant est à la fois le moins cher et le plus proche du prix de référence. Les deux règles donnent le même gagnant : l’observation ne peut pas les départager. Le droit tranche, l’observation non — donc l’étiquette est posée, mais la confiance reste basse et le cas est marqué ambigu.

Une confiance honnête coûte des points sur les tableaux de résultats et en fait gagner sur les décisions. C’est un arbitrage qu’il faut faire consciemment, une fois, au début.

Situation observéeConfiance
Le libellé nomme la règle0,95
n ≥ 3, tous les montants égaux, libellé muet0,85
Gagnant ≠ moins cher, gagnant = plus proche du prix de référence, n ≥ 30,95
Même configuration, mais n = 20,70
Gagnant plus cher qu’un recevable, et pas le plus proche non plus0,80
Gagnant = moins cher = plus proche, après réforme0,70 · marqué ambigu
Un seul candidat recevable0,00 · indéterminé
Estimation absenteplafonné à 0,50
Catégorie absente−0,10

La première passe échoue

Cent décisions, choisies parmi les plus récentes ayant un gagnant publié, une estimation, et au moins une offre recevable chiffrée. Aucune sélection favorable : la population entière qui remplit ces trois conditions.

Résultat : 4 cas sur 100 au-dessus du seuil de confiance. Sept classements manifestement faux. Autant dire un échec.

Deux erreurs symétriques, et instructives.

Une égalité à deux prise pour une règle. Deux candidats recevables avaient déposé exactement le même montant, un chiffre rond. Le signal « tous les montants sont égaux » s’est déclenché, avec 0,90 de confiance. Deux personnes qui tombent sur le même nombre rond, c’est une coïncidence. Trois, c’est une règle. Le signal n’avait pas d’effectif minimum.

Un libellé explicite ignoré. Six décisions dont le libellé de procédure nommait littéralement la règle ont été classées autrement, parce que l’arbre ne regardait le texte qu’en dernier recours, comme un indice faible. C’était l’inverse : quand la source dit explicitement la règle, c’est le signal le plus direct qui existe. Il doit passer devant les signaux calculés, pas derrière.

L’erreur de conception est la même dans les deux cas : j’avais rangé les signaux par élégance — les calculés d’abord, le texte ensuite, parce que calculer est plus satisfaisant que lire — au lieu de les ranger par force probante.

Quatre règles, et la deuxième passe

Quatre corrections, chacune née d’un cas précis qui s’était mal classé — aucune d’une idée générale sur ce qui « devrait » marcher.

R1 — le libellé explicite passe en tête et l’emporte sur tout le reste. R2 — un libellé de type concours, combiné à un gagnant qui n’est pas le moins cher, suffit à conclure que la décision ne s’est pas jouée au prix. R3 — le signal d’égalité exige désormais trois candidats. R4 — la configuration où deux règles prédisent le même gagnant voit sa confiance relevée de 0,55 à 0,70, parce que le droit, lui, tranche.

Le résultat, sur exactement la même population de cent cas :

Trente-huit cas au-dessus du seuil au lieu de quatre. Les neuf décisions à base commune correctement identifiées sur neuf. Aucun faux positif. Et une confiance moyenne qui monte de 0,67 à 0,78 — sans qu’aucune règle n’ait été ajoutée pour gonfler un chiffre.

MesurePasse 1Passe 2
Cas au-dessus du seuil de confiance4 / 10038 / 100
Décisions à base commune identifiées3 / 99 / 9
Classements manifestement faux70
Confiance moyenne0,670,78

Le résultat auquel je ne m’attendais pas

Sept décisions se sont classées dans une catégorie que je n’avais pas prévu de voir apparaître aussi souvent : le gagnant y est strictement plus cher qu’un candidat recevable, et il n’est pas non plus le plus proche du prix de référence. Aucune règle de prix ne produit ce gagnant. La décision s’est donc jouée sur autre chose — un score technique — alors que l’étiquette de la source disait « sur offre de prix ».

Ce ne sont pas des erreurs du moteur. Ce sont des erreurs de la donnée, que le moteur a mises au jour.

Elles comptent doublement, parce qu’un autre morceau du produit calculait un « gagnant théorique » à partir de cette étiquette, pour les décisions dont le résultat n’est pas encore publié. Sur ces sept configurations, il donnait un gagnant faux. En silence.

C’est le bénéfice le moins visible de ce genre de travail, et souvent le plus rentable : un modèle qui recalcule une donnée devient un audit de cette donnée. Faites-les tourner en parallèle un moment avant de remplacer l’un par l’autre — l’écart entre les deux est une liste de bugs.

Ce qui se transpose

  • Quand une source vous donne le résultat mais pas la règle, la règle est souvent récupérable — et la récupérer vaut mieux que faire confiance au champ.
  • Une valeur par défaut qui ressemble à une donnée est plus dangereuse qu’un champ vide : elle ne déclenche rien.
  • Classez vos signaux par force probante, pas par élégance. Le signal explicite passe devant le signal calculé.
  • Un seuil d’effectif est ce qui sépare une coïncidence d’une règle. Deux points ne font pas une loi.
  • Écrivez le modèle de confiance avant de regarder les résultats, et faites-le descendre quand une entrée manque.
  • « Indéterminé » doit rester une réponse possible. Sinon vous ne produisez pas de la connaissance, vous produisez des étiquettes.
  • Un moteur qui recalcule une donnée existante est un détecteur d’erreurs dans cette donnée. L’écart entre les deux est votre liste de bugs.

Article suivant : Remplir un formulaire officiel sans gabarit

Une démo qui marche. Et après ?

Décrivez la situation en trois lignes — ce qui existe déjà, ce qui doit exister, et pour quand. Je vous dis en trente minutes dans laquelle des trois offres ça tombe, ou si ce n’est pas pour moi. Réponse sous 24 h en semaine.