Outils & Langages

Probabilités calibrées : Laya à l’épreuve d’un vrai test

Illustration d’une courbe de calibration : une courbe orange s’écarte de la diagonale pointillée tandis qu’une droite bleue la suit, avec des critiques de films notées par étoiles analysées par une puce d’IA et un ordinateur portable affichant du code Python scikit-learn.

Laya, un nouveau paquet Python de « décision » qui promet des probabilités calibrées, a été testé ici sur 2 000 critiques de films Allociné, en français, sans réseau et sur un simple processeur. Sans réglage, il se trompe une fois sur cinq et ses probabilités penchent nettement vers le « non ». Recalibré avec 500 exemples étiquetés, il devient très bien calibré, sans rattraper une méthode classique entraînée sur 160 000 critiques. Code, protocole et chiffres complets ci-dessous.


Pourquoi ce test

La veille technologique de ce blog a fait remonter, fin septembre 2026, une petite vague de modèles d'un genre particulier : des modèles qui ne génèrent pas de texte, mais répondent à une question fermée par une probabilité, en une seule passe. Le billet de lancement de JEV-27B, publié sur Hugging Face le 27 septembre, résume bien leur usage : un agent prend beaucoup de petites décisions (« cet e-mail est-il un hameçonnage ? », « quelle équipe doit traiter ce ticket ? »), et ces questions « ne demandent pas un long raisonnement, mais une réponse rapide et calibrée, sur laquelle on peut poser un seuil ».

Laya est la version open source la plus facile à tester de cette idée : pip install laya, des poids publiés sous licence Apache 2.0 sur Hugging Face, et une promesse écrite noir sur blanc dans sa documentation : des probabilités entraînées contre des « règles de score strictement propres », qui auraient donc « un sens statistique ». Pour une data scientist, une promesse de calibration a un avantage rare : elle se vérifie avec les outils les plus classiques du métier.

Qu'est-ce qu'une probabilité calibrée ?

La documentation de scikit-learn en donne la définition la plus simple : un classifieur bien calibré est un classifieur dont les probabilités se lisent comme un niveau de confiance. Parmi les exemples auxquels il donne une probabilité proche de 0,8, environ 80 % doivent réellement appartenir à la classe positive.

Trois mesures servent à le vérifier dans ce test :

  • La courbe de calibration (ou diagramme de fiabilité) : on range les prédictions en 10 tranches (0 à 10 %, 10 à 20 %…) et, dans chaque tranche, on compare la probabilité annoncée à la part d'exemples réellement positifs. Un modèle parfaitement calibré suit la diagonale.
  • L'ECE (erreur de calibration attendue) : l'écart moyen entre ces deux valeurs, pondéré par le nombre d'exemples de chaque tranche. Plus elle est basse, mieux c'est.
  • Le score de Brier : l'écart quadratique moyen entre la probabilité et la réponse (0 ou 1). Il mélange calibration et pouvoir de discrimination : la documentation de scikit-learn précise qu'un score de Brier plus bas ne veut pas forcément dire un modèle mieux calibré. C'est pourquoi il est présenté ici à côté de l'ECE, jamais seul.

Pourquoi est-ce important ? Parce que tout l'intérêt de ces modèles est de poser des seuils : n'automatiser que les décisions prises avec plus de 90 % de confiance, par exemple, et renvoyer les autres à un humain. Avec des probabilités mal calibrées, ce seuil ne veut rien dire.

Le protocole

  • Les données : le jeu Allociné (licence MIT), 200 000 critiques de films en français étiquetées positive ou négative. 2 000 critiques ont été tirées au hasard dans le jeu de test (graine 42), dont 47,25 % de positives.
  • Laya : version 0.3.21, checkpoint multilingual, sans aucun entraînement, avec une seule question de type oui/non.
  • La référence : la méthode classique d'un premier cours de NLP, une pondération TF-IDF des mots et paires de mots suivie d'une régression logistique scikit-learn, entraînée sur les 160 000 critiques d'entraînement.
  • L'environnement : un conteneur Docker jetable, sans accès réseau pendant les mesures (modèle et données téléchargés à l'avance, à version figée), 3 processeurs, 5 Go de mémoire, aucune carte graphique.
  • Les incertitudes : chaque résultat est donné avec un intervalle de confiance à 95 %, calculé par bootstrap apparié (1 000 rééchantillonnages des mêmes critiques pour les deux méthodes).

L'appel à Laya tient en quelques lignes :

from laya import Router

router = Router()
question = {"positif": {"type": "noul",
                        "instructions": "Cette critique de film est-elle positive ?"}}

reponse = router.predict("Un film ennuyeux, je me suis endormi.", question,
                         model="multilingual")
print(reponse["answers"]["positif"]["noul"])   # 0.1284 : probabilité du « oui »

Le type noul renvoie la probabilité que la réponse soit « oui ». Pour les 2 000 critiques, la méthode predict_batch traite les textes par lots de 8.

Résultat 1 : Laya tel quel se trompe une fois sur cinq

Sur 2 000 critiques de testLaya, sans entraînementTF-IDF + régression logistique (160 000 critiques)
Bonnes réponses (seuil 0,5)79,9 % [78,2 – 81,7]94,2 % [93,1 – 95,3]
Score de Brier (plus bas = mieux)0,1540,053
ECE (plus bas = mieux)0,1450,081
AUC (capacité à classer)0,9140,985

Le détail par tranche montre d'où vient l'écart : Laya penche vers le « non ».

Probabilité annoncée par LayaNombre de critiquesProbabilité moyenne annoncéeCritiques réellement positives
0 à 10 %1 0161,4 %13,3 %
10 à 20 %12514,4 %54,4 %
40 à 50 %5445,5 %75,9 %
90 à 100 %29195,7 %95,2 %

Quand Laya dit « oui » avec assurance, il a raison. Mais il range la moitié des critiques sous les 10 %, alors que 13 % d'entre elles sont positives, et une critique à laquelle il donne 15 % de chances d'être positive l'est en réalité une fois sur deux. Un seuil posé sur ces probabilités laisserait passer beaucoup d'erreurs sans le signaler.

La référence n'est pas parfaite non plus, mais dans l'autre sens : elle est trop prudente. Les critiques auxquelles elle donne environ 35 % sont positives à 12 %, celles à environ 75 % le sont à 93 %. Son ECE reste presque deux fois plus faible que celle de Laya.

Résultat 2 : la méthode de l'auteur corrige peu, celle de Platt corrige presque tout

L'auteur de Laya ne prétend pas que ses probabilités brutes sont parfaites : sa documentation indique qu'il obtient sa meilleure calibration « après ajustement d'une température sur les données du domaine », et conseille de régler ses seuils sur ses propres données. La température est une correction à un seul paramètre, que Guo et ses coauteurs (2017) décrivent comme une variante de la calibration de Platt, « étonnamment efficace » sur la plupart des jeux de données.

Le test a donc été refait comme l'auteur le recommande : Laya a répondu sur 500 critiques du jeu d'entraînement (jamais utilisées dans le test), une température y a été ajustée, puis appliquée aux 2 000 prédictions de test. Seconde variante, pour comparaison : la calibration de Platt, décrite dans la documentation de scikit-learn (méthode sigmoid), qui ajuste deux paramètres, une pente et un décalage.

Sur les mêmes 2 000 critiquesBonnes réponsesBrierECE
Laya brut79,9 %0,1540,145
Laya + température (T = 2,08)79,9 %0,1420,129
Laya + Platt (pente 0,62, décalage +1,00)84,1 % [82,5 – 85,7]0,1150,023 [0,021 – 0,043]
Référence (160 000 critiques)94,2 %0,0530,081

La température change à peine les choses, et ne modifie pas une seule réponse : elle étire les probabilités autour de 50 %, alors que le défaut de Laya est un décalage. Platt, qui ajuste aussi le décalage, le corrige : avec seulement 500 critiques étiquetées, Laya devient mieux calibré que la référence (écart d'ECE de −0,065 à −0,036), tout en restant loin derrière elle pour les bonnes réponses (−11,9 à −8,5 points).

La correction elle-même tient en quelques lignes de scikit-learn :

import numpy as np
from sklearn.linear_model import LogisticRegression

def logit(p):
    p = np.clip(p, 1e-6, 1 - 1e-6)
    return np.log(p / (1 - p))

# p_cal, y_cal : probabilités de Laya et vraies étiquettes sur 500 exemples de calibration
platt = LogisticRegression(C=1e6).fit(logit(p_cal).reshape(-1, 1), y_cal)
p_corrigees = platt.predict_proba(logit(p_test).reshape(-1, 1))[:, 1]

Résultat 3 : à 500 exemples étiquetés, match nul

Comparer Laya recalibré avec 500 étiquettes à une référence qui en a reçu 160 000 n'est pas équitable. La vraie question pratique est différente : si l'on ne dispose que de quelques centaines d'exemples étiquetés, que vaut-il mieux faire ? La référence a donc été réentraînée sur les mêmes 500 critiques, avec deux réglages : les paramètres par défaut, puis une régularisation choisie par validation croisée, pour ne pas l'avantager ni la désavantager.

500 critiques étiquetées pour chacunBonnes réponsesBrierECE
Laya + Platt84,1 %0,1150,023
TF-IDF + régression logistique, réglages par défaut72,6 %0,2210,177
TF-IDF + régression logistique, réglée par validation croisée83,2 %0,1250,076

Face à la référence réglée, l'écart de bonnes réponses va de −1,0 à +3,0 points : aucune différence démontrée. En revanche, Laya recalibré reste nettement mieux calibré (écart d'ECE de −0,062 à −0,033). Et la référence mal réglée rappelle un piège classique : avec peu de données, les paramètres par défaut d'un modèle peuvent coûter plus de dix points.

Et la vitesse ?

Sur 3 processeurs, sans carte graphique : 8,8 secondes pour charger le modèle, puis 0,41 seconde par critique en médiane (0,93 s au 95e centile), ou 0,35 seconde par critique en traitant les textes par lots de 8. Les critiques comptaient 129 jetons en médiane. La documentation de Laya annonce 33 millisecondes par question sur une carte graphique T4 : ce chiffre n'est pas comparable à ceux d'un processeur, et n'a pas été vérifié ici. Sur un ordinateur portable, comptez donc plutôt quelques décisions par seconde que quelques dizaines.

Ce que ce test prouve, et ce qu'il ne prouve pas

Il prouve une chose simple : la promesse de probabilités calibrées ne tient pas « à la sortie de la boîte » sur ce cas d'usage, et elle se répare avec quelques centaines d'exemples étiquetés et une correction de deux paramètres. Le modèle classe plutôt bien (AUC de 0,914), c'est sa façon d'exprimer sa confiance qui est décalée.

Il ne prouve pas davantage, pour plusieurs raisons :

  • Un seul jeu de données : du sentiment binaire sur des critiques de films. Les tickets, les e-mails ou les décisions à plusieurs options, pour lesquels Laya a été conçu, peuvent donner un tout autre résultat.
  • Une seule formulation de la question, en français. Une autre formulation, ou la même en anglais, n'a pas été testée.
  • Un seul modèle : le checkpoint multilingual de base. Son auteur présente une version affinée (laya-typed-decisions) comme nettement meilleure sur ses propres tâches ; elle n'a pas été testée.
  • Une référence simplifiée : pour tenir en 5 Go de mémoire, la TF-IDF utilise un hachage des mots (220 colonnes) plutôt qu'un vocabulaire exact.

Une leçon de méthode, enfin, que ce test a rappelée en chemin : un premier essai sur 100 critiques donnait à Laya une AUC de 0,984, presque identique à celle de la référence. Sur 2 000 critiques, elle tombe à 0,914. Cent exemples suffisent pour vérifier qu'un script tourne, pas pour juger un modèle.

Faut-il utiliser Laya ?

Oui, dans un cas précis : quand on doit prendre une décision fermée sur du texte, avec peu d'exemples étiquetés, et qu'on a besoin de probabilités exploitables pour poser des seuils. Dans ce cas, à 500 exemples, il fait aussi bien qu'une méthode classique bien réglée, et donne des probabilités nettement plus fiables une fois recalibré.

Non, en revanche, s'il existe déjà des dizaines de milliers d'exemples étiquetés : une TF-IDF et une régression logistique, entraînées en 30 secondes, font bien mieux sur ce test.

Dans tous les cas, la règle est la même que pour n'importe quel modèle : ne pas croire une probabilité sur parole. Tracer la courbe de calibration sur quelques centaines d'exemples de son propre domaine prend une heure et évite de bâtir des seuils sur du sable. C'est l'une des pratiques de contrôle que détaille l'article sur les bonnes pratiques d'une IA responsable en data science.

Reproduire ce test

Les versions utilisées : Python 3.12, laya 0.3.21, PyTorch 2.14.0 (version processeur), transformers 5.17.0, scikit-learn 1.9.1, pandas 3.0.6. Le jeu Allociné se charge directement depuis Hugging Face, en fichiers Parquet, avec pandas (attention aux changements de comportement de pandas 3.0 si vous reprenez un ancien code). Le calcul de l'ECE et de la courbe de calibration, lui, ne demande qu'une dizaine de lignes de NumPy :

import numpy as np

def ece(y, p, nb_tranches=10):
    tranches = np.minimum((p * nb_tranches).astype(int), nb_tranches - 1)
    erreur = 0.0
    for b in range(nb_tranches):
        dans_tranche = tranches == b
        if dans_tranche.any():
            ecart = abs(p[dans_tranche].mean() - y[dans_tranche].mean())
            erreur += dans_tranche.mean() * ecart
    return erreur

Le test principal (2 000 critiques, Laya et référence) a tourné en 13 minutes sur 3 processeurs, le 29 septembre 2026 ; le recalibrage et la comparaison à budget égal ne demandent ensuite que quelques minutes de plus.

Questions fréquentes

Qu'est-ce que Laya ?

Un paquet Python open source (licence Apache 2.0, installable avec pip install laya) qui répond à des questions fermées sur un texte — oui ou non, un choix parmi des options, une note — par une probabilité, en une seule passe et sans générer de texte. Il fait partie d'une famille de modèles dits « System 1 », pensés pour les petites décisions rapides d'un agent : trier un ticket, repérer un hameçonnage, évaluer une urgence.

Qu'est-ce qu'une probabilité calibrée ?

Une probabilité qu'on peut lire comme un niveau de confiance : parmi toutes les prédictions à environ 80 %, environ 80 % doivent être justes. On le vérifie avec une courbe de calibration (probabilité annoncée contre fréquence réellement observée, par tranches) et une mesure d'écart comme l'ECE. Une probabilité calibrée permet de poser des seuils fiables, par exemple n'automatiser que les décisions à plus de 90 % de confiance.

Les probabilités de Laya sont-elles bien calibrées ?

Pas sans réglage, sur ce test : 2 000 critiques de films Allociné, checkpoint multilingual, question « Cette critique de film est-elle positive ? ». Laya penche vers le « non » : il donne moins de 10 % à la moitié des critiques, dont 13 % sont en réalité positives. Son erreur de calibration (ECE 0,145) est presque deux fois plus forte que celle d'une régression logistique classique (0,081).

Comment recalibrer les probabilités d'un modèle comme Laya ?

Avec quelques centaines d'exemples étiquetés de son propre domaine et une calibration de Platt : une régression logistique à une seule variable, le logit de la probabilité du modèle, qui ajuste une pente et un décalage. Sur ce test, 500 critiques ont suffi à faire passer l'ECE de Laya de 0,145 à 0,023. La simple mise à l'échelle par température, recommandée par l'auteur de Laya, n'a presque rien changé ici (0,129), parce que le défaut était un décalage et non un excès de confiance symétrique.

Laya fait-il mieux qu'une régression logistique ?

Cela dépend du nombre d'exemples étiquetés disponibles. Avec 160 000 critiques d'entraînement, une TF-IDF et une régression logistique atteignent 94,2 % de bonnes réponses, contre 84,1 % pour Laya recalibré. Avec seulement 500 exemples de part et d'autre, l'écart d'exactitude n'est pas démontré (−1,0 à +3,0 points), mais Laya recalibré reste nettement mieux calibré (ECE 0,023 contre 0,076).

Laya est-il rapide sans carte graphique ?

Il tourne correctement sur un simple processeur, mais sans atteindre les chiffres annoncés sur carte graphique. Sur 3 processeurs, ce test a mesuré 0,41 seconde par critique en médiane (0,35 seconde en traitant les textes par lots de 8), après 8,8 secondes de chargement du modèle. Sa documentation annonce 33 millisecondes par question sur une carte graphique T4, un chiffre non comparable et non vérifié ici.

Ce résultat vaut-il pour d'autres usages de Laya ?

Pas forcément. Ce test porte sur un seul jeu de données (sentiment binaire de critiques de films), une seule formulation de question en français et un seul checkpoint (multilingual, non affiné). Laya est conçu d'abord pour des tickets, des e-mails et des décisions à plusieurs options, et son auteur présente une version affinée comme bien meilleure. La seule conclusion générale est de méthode : tracer la courbe de calibration sur ses propres données avant de faire confiance à une probabilité.

Sources

  1. laya · PyPI (documentation de la version 0.3.21)Python Package Index

    Documentation officielle du paquet testé : probabilités entraînées contre des règles de score strictement propres (« RLCD »), calibration « statistically meaningful », ECE obtenue « after domain temperature fitting », conseil de valider ses seuils sur ses propres données, et 33 ms par question mesurées sur une carte graphique T4.

  2. convaiinnovations/layaHugging Face

    Dépôt des poids du modèle, sous licence Apache 2.0 (vérifiée sur la fiche du modèle). Le checkpoint multilingual utilisé dans ce test y est publié (révision 55cf4c4e, téléchargée le 29 septembre 2026).

  3. autotrust/JEV-27B: fast, calibrated decisions and full reasoning from one open modelHugging Face Blog

    Billet du 27 septembre 2026 qui décrit l'usage de ces modèles de décision : des questions qui « don't need a long chain of thought » mais « a fast, calibrated answer you can put a threshold on ». Cité pour situer Laya dans cette famille de modèles, pas pour ses propres résultats.

  4. tblard/allocineHugging Face (Théophile Blard)

    Jeu de données de 200 000 critiques de films Allociné en français, étiquetées positive ou négative, sous licence MIT (vérifiée sur la fiche du jeu) : 160 000 pour l'entraînement, 20 000 pour la validation, 20 000 pour le test. Révision a4654f48 utilisée.

  5. Probability calibration — scikit-learn 1.9.1 documentationscikit-learn

    Définition d'un classifieur bien calibré (parmi les prédictions proches de 0,8, environ 80 % positives), courbes de calibration ou « reliability diagrams », calibration de Platt (méthode « sigmoid », pente et décalage) et mise en garde : un score de Brier plus bas ne signifie pas forcément une meilleure calibration.

  6. On Calibration of Modern Neural NetworksGuo, Pleiss, Sun et Weinberger (arXiv, 2017)

    Article de référence sur la mauvaise calibration des réseaux de neurones modernes, qui présente la mise à l'échelle par température comme « a single-parameter variant of Platt Scaling », « surprisingly effective » sur la plupart des jeux de données testés.

Chiffres et affirmations vérifiés sur ces sources le .

Kit gratuit

Merci ! Choisissez votre kit gratuit.

Choisissez un kit

À découvrir aussi

Poursuivre la lecture.

Tous les articles
Les trois tableurs TheSoloSuite pour Google Sheets et Excel présentés en cascade : le Planificateur Maison pour le ménage, le Planificateur de repas et le Kit Budget 2.0, chacun avec son tableau de bord d’accueil.

Outils & Langages

Ménage, repas, budget : 3 tableurs Google Sheets et Excel

Planning ménage, planificateur de repas, budget mensuel : trois tableurs Google Sheets et Excel en français, et ce que chacun calcule vraiment.

Lire l’article
Illustration d’un ordinateur portable affichant le moteur DuckDB au-dessus d’une maquette de New York parcourue de taxis jaunes : à gauche un panneau bleu « Parquet 1,85 s », à droite un panneau violet « CSV 27,06 s », et en bas les repères « 90 millions de trajets » et « moins de 256 Mo ».

Apprentissage Data Science

DuckDB : analyser des Go de données sans serveur

90 millions de trajets de taxi analysés sans serveur avec DuckDB : 1,85 s en Parquet contre 27,06 s en CSV, et une requête terminée sous 256 Mo de mémoire. Protocole et chiffres mesurés.

Lire l’article
Illustration de deux moteurs d’analyse de données alimentés par un même flux de tableaux : le module bleu Polars à gauche et le module violet pandas à droite, séparés par un panneau d’avertissement orange au point de bifurcation, avec un chronomètre doré au premier plan qui évoque la mesure des performances.

Outils & Langages

Polars 2.0 face à pandas 3.0 : faut-il migrer en 2026 ?

Polars 2.0 face à pandas 3.0 : moteur streaming par défaut, ordre des lignes non garanti, API supprimées et performances annoncées — de quoi décider si la migration vaut le coup.

Lire l’article

Kit gratuit

Recevez un kit gratuit, sourcé et actionnable.

Choisissez un kit