Accueil / Factory / Algos ML / Learning to Rank — factory / algos ML / apprentissage supervisé · classement

LEARNING TO RANK.

Une famille de modèles qui apprend un ordre plutôt qu'une note : quels produits afficher en premier pour une recherche donnée. Le modèle combine pertinence du texte, avis, ventes, prix ou stock, et optimise directement la qualité du haut de la liste. LambdaMART, un boosting d'arbres, est le standard des moteurs de recherche.

ClassementMoteur de rechercheLambdaMARTE-commerceNiveau : avancé

FICHE D'IDENTITÉ

notes sur 5 · usage entreprise
PerformanceLa référence pour classer des résultats de recherche
InterprétabilitéImportance des variables oui, justification de l'ordre non
VitesseBoosting rapide ; classer une recherche prend quelques millisecondes
Facilité de réglageRéglages du boosting, plus la construction des labels
Tolérance aux données brutesArbres : pas de normalisation, valeurs extrêmes tolérées
EN 30 SECONDES

Un chef de rayon ne note pas chaque produit dans l'absolu. Pour chaque demande de client, il décide lequel mettre devant l'autre, et il apprend de ses erreurs d'ordre.

1. On collecte des listes jugées

Pour chaque recherche passée, on garde les produits proposés et leur pertinence observée : ignoré, cliqué, ajouté au panier, acheté (de 0 à 3).

2. On apprend à ordonner, pas à noter

LambdaMART construit des arbres qui corrigent les erreurs d'ordre entre paires de produits d'une même recherche, en pesant plus lourd les erreurs en haut de liste.

3. On trie les nouveaux résultats

Pour une nouvelle recherche, le modèle donne un score à chaque produit candidat. Seul l'ordre des scores compte : on affiche du plus haut au plus bas.

LE CAS MÉTIER

e-commerce · moteur de recherche interne
EN ENTRÉE

300 recherches, 20 produits chacune

Pour chaque produit candidat : score de pertinence du texte, note moyenne, ventes des 30 derniers jours, prix relatif, disponibilité. La pertinence observée va de 0 (ignoré) à 3 (acheté). Les données sont simulées.

EN SORTIE

Un ordre d'affichage par recherche

Le modèle apprend à faire remonter les produits en stock, bien notés et au bon prix, et pas seulement ceux dont le texte colle à la requête.

CE QU'ON MESURE

Le NDCG@10

Il mesure la qualité des 10 premiers résultats, avec plus de poids aux premières places : 1 correspond à l'ordre idéal. On le compare au tri actuel, ici le seul score texte, sur des recherches jamais vues par le modèle.

QUAND LE SORTIR, QUAND L'ÉVITER

OUI

  • Moteur de recherche interne, catalogue, annonces ou comparateur à ordonner
  • Signaux de comportement abondants (clics, ajouts au panier, achats) pour construire la pertinence
  • Plusieurs critères à combiner (pertinence, marge, stock) que des poids manuels n'équilibrent plus
  • Deuxième étage d'un système de recommandation, pour trier des candidats déjà présélectionnés

NON

  • Peu de recherches ou de clics : régler des poids à la main reste plus sûr
  • Clics biaisés par la position (on clique ce qui est en haut) : les corriger avant d'apprendre, sinon le modèle recopie l'ordre actuel
  • Des milliers de candidats par recherche : présélectionner d'abord avec une méthode rapide (mots-clés, embeddings)
  • Besoin d'une note absolue plutôt que d'un ordre : une régression ou une classification classique suffit
LES 4 RÉGLAGES QUI COMPTENT

Noms donnés pour LightGBM, identiques en R et en Python.

objective = lambdarank

Choisit l'apprentissage par listes (LambdaMART). XGBoost propose l'équivalent avec rank:ndcg.

group

Nombre de lignes de chaque recherche, dans l'ordre des données. Une erreur ici, et le modèle compare des produits de recherches différentes.

eval_at

Profondeur à laquelle le NDCG est suivi pendant l'entraînement : 10 pour une première page de résultats, 3 pour un bandeau de recommandations.

learning_rate et num_leaves

Comme pour tout boosting : un pas petit avec davantage d'arbres, des arbres de taille modérée. On règle par validation sur des recherches mises de côté.

LE CODE MINIMAL

données simulées dans le code
# Classement des résultats de recherche : Learning to Rank (LambdaMART) en R
library(lightgbm)

# Simulation : 300 recherches, 20 produits candidats chacune
set.seed(42)
n_req <- 300
n_prod <- 20
N <- n_req * n_prod
requete <- rep(1:n_req, each = n_prod)
X <- cbind(score_texte = runif(N), note_moyenne = runif(N, 2.5, 5), ventes_30j = rpois(N, 20),
           prix_relatif = runif(N, 0.6, 1.6), en_stock = rbinom(N, 1, 0.85))
latent <- 2.5 * X[, "score_texte"] + 0.8 * (X[, "note_moyenne"] - 3.75) + 0.02 * X[, "ventes_30j"] -
  (X[, "prix_relatif"] - 1) + 1.5 * X[, "en_stock"] + rnorm(N, 0, 0.5)
pertinence <- findInterval(latent, quantile(latent, c(0.6, 0.8, 0.93)))   # 0 = ignoré ... 3 = acheté

# 240 recherches pour apprendre, 60 pour tester ; lignes regroupées par recherche
app <- requete <= 240
dtrain <- lgb.Dataset(X[app, ], label = pertinence[app], group = rep(n_prod, 240))
parametres <- list(objective = "lambdarank", learning_rate = 0.05, num_leaves = 15, verbose = -1)
modele <- lgb.train(params = parametres, data = dtrain, nrounds = 200)

# NDCG@10 : qualité des 10 premiers résultats affichés (1 = ordre idéal)
dcg <- function(r) sum(r[1:10] / log2(2:11))
ndcg <- function(score) mean(sapply(split(seq_len(sum(!app)), requete[!app]), function(i)
  dcg(pertinence[!app][i][order(-score[i])]) / dcg(sort(pertinence[!app][i], decreasing = TRUE))))
cat("NDCG@10 LambdaMART          :", round(ndcg(predict(modele, X[!app, ])), 3), "\n")
cat("NDCG@10 tri par score texte :", round(ndcg(X[!app, "score_texte"]), 3), "\n")
print(lgb.importance(modele))

QUESTIONS FRÉQUENTES

Qu'est-ce que le NDCG ?

Le Normalized Discounted Cumulative Gain mesure la qualité d'un classement. Chaque résultat pertinent rapporte des points, d'autant moins qu'il est placé bas dans la liste. On divise par le score du classement idéal : 1 est parfait.

Quelles différences entre approches pointwise, pairwise et listwise ?

Pointwise prédit une note par produit, comme une régression. Pairwise apprend lequel de deux produits doit passer devant. Listwise optimise la qualité de la liste entière. LambdaMART travaille par paires, pondérées par leur effet sur le NDCG de la liste.

Comment construire les labels de pertinence ?

Par jugement humain sur un échantillon de recherches, ou à partir des comportements : un achat vaut plus qu'un ajout au panier, qui vaut plus qu'un clic. Les clics doivent être corrigés du biais de position, sinon le modèle apprend seulement à reproduire l'ordre actuel.

LES ALGOS VOISINS

à comparer avant de choisir
le moteur utilisé

LightGBM

Le boosting qui fournit l'objectif lambdarank de l'exemple, rapide sur de gros volumes.

Voir la fiche →
l'étage du dessus

Embeddings

Présélectionnent les candidats par proximité de sens avant que le learning to rank ne les ordonne.

Voir la fiche →
une source de signaux

Filtrage collaboratif

Son score de goût peut devenir une variable du modèle de classement, à côté du prix et du stock.

Voir la fiche →
— formation

Passer de la fiche à la pratique

Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.

Voir les formations →