TL;DR: Learning to Rank Explained
A compact visual guide to pointwise, pairwise, and listwise ranking, plus RankNet, LambdaRank, ListNet, and practical metrics.
Learning to Rank (LTR) is the family of machine learning methods used when the output is an ordered list: search results, recommendations, product listings, candidate documents, and anything else where “which item comes first?” matters more than a single prediction. It sits inside the model-evaluation path of my Data Science Insights hub because ranking quality depends on measuring the right behaviour, not just producing a score.
This guide focuses on the practical differences between pointwise, pairwise, and listwise ranking methods, then connects those ideas to RankNet, LambdaRank, and ListNet. By the end, you should know which approach fits your ranking problem and why the loss function matters so much.
Prefer to experiment while you learn? Open the Learning to Rank playground in Notebook Studio to train a small browser-safe RankNet-style scorer and compare NDCG@3 before and after training.
Introduction to Learning to Rank methods
Definition and importance in information retrieval
Learning to Rank is a supervised machine learning technique used to rank a list of documents or items based on their relevance to a query or user. It is crucial in search engines and information retrieval because it helps place the most relevant results where users are most likely to see them.
When should you use Learning to Rank?
Use LTR when the order of several candidates matters more than an isolated prediction. Common examples include web search, recommender systems, ecommerce product ranking, job matching, and reranking retrieved documents in a Retrieval-Augmented Generation (RAG) system. In each case, the model receives a query or user context, scores a group of candidates, and is evaluated on the quality of the resulting order.
Understanding Learning to Rank methods
Pointwise, pairwise, and listwise approaches
Pointwise approach: scores each document independently against a ground-truth target, similar to a regression or classification task. It is simple, but optimising individual scores does not necessarily produce the best order.
Pairwise approach: learns a preference between two documents for the same query, such as “document i should rank above document j.” It focuses on relative order rather than the accuracy of either document’s score.
Listwise approach: learns from an entire query group—the candidate documents and their relevance labels together—so the objective can reflect the ordering of the complete list.
Machine learning for ranking
Training data and optimisation
Training data consists of query groups: lists of candidate items with relevance labels or a partial order between items in each list. The goal is to rank new, unseen groups in a similar way to the training data. Optimisation is commonly performed using gradient descent or a gradient-boosting procedure.
Loss function: the key to ranking performance
The loss should match the unit of the ranking decision:
| Approach | Training unit | Typical objective | What it optimises well |
|---|---|---|---|
| Pointwise | One document | Regression or classification loss, such as MSE | Predicting relevance scores |
| Pairwise | A document pair from one query | Pairwise logistic or hinge loss | Correct relative ordering |
| Listwise | A complete query group | List-level probability or ranking objective | Quality of the overall ranked list |
For RankNet, binary cross-entropy (BCE) is applied to a pairwise preference probability—not to independently scored documents. The pairwise logistic loss is a natural choice when getting the order right matters more than calibrating an individual score.
Approaches to Learning to Rank
RankNet
RankNet learns pairwise preferences with BCE. The model returns raw document scores, and the probability that document i should rank above document j is computed from the score difference.

The following is a pytorch example of how to use RankNet:
import torch
import torch.nn as nn
import torch.optim as optim
class RankNet(nn.Module):
def __init__(self, input_size):
super().__init__()
self.scorer = nn.Linear(input_size, 1)
def forward(self, x):
return self.scorer(x).squeeze(-1)
input_size = 10
model = RankNet(input_size)
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.Adam(model.parameters(), lr=1e-3)
# Two documents from the same query.
x_i = torch.rand(5, input_size)
x_j = torch.rand(5, input_size)
# 1: document i should rank above j; 0: j should rank above i.
y_ij = torch.tensor([1, 0, 1, 1, 0], dtype=torch.float32)
for _ in range(100):
optimizer.zero_grad()
score_i = model(x_i)
score_j = model(x_j)
# RankNet models P(i > j) = sigmoid(score_i - score_j).
pairwise_logits = score_i - score_j
loss = criterion(pairwise_logits, y_ij)
loss.backward()
optimizer.step()RankNet models \(P_{ij}=\sigma(s_i-s_j)\), where \(s_i\) and \(s_j\) are the scores for two documents from the same query. BCEWithLogitsLoss combines the sigmoid transformation with binary cross-entropy in a numerically stable implementation. A pair swapped at rank 1 and a pair swapped at rank 20 can still receive similar treatment, which motivates LambdaRank.
LambdaRank
LambdaRank defines gradients of an implicit loss function so that document pairs near the top of the ranked list receive stronger updates. In other words, it weights pairwise updates by the predicted change in a ranking metric such as NDCG if two documents were swapped.

I wrote a deeper practical guide to LambdaRank and how it improves learning to rank if you want to focus on this algorithm specifically.
ListNet
ListNet is a listwise method that converts relevance labels and predicted scores into probability distributions over documents, then minimises the difference between those distributions. Unlike RankNet, it can learn from the ordering of an entire query group rather than independently sampled pairs. It is conceptually closer to the ranking task, although constructing and training listwise objectives can be more involved.

Overcoming challenges in Learning to Rank
Position bias and distributed training
Position bias is a common issue in LTR: high-ranked results receive more exposure, so click-through data reflects position as well as relevance. Where click labels are used, randomized exposure, propensity weighting, or other debiasing techniques can help separate these effects.
XGBoost implements the Unbiased LambdaMART algorithm to debias position-dependent click data. Distributed training is supported through integrations with frameworks including Dask, Spark, and PySpark.
Evaluating and refining ranking models
Metrics for ranking performance
Choose the metric based on how people use the ranked list:
- Use NDCG@k when relevance is graded and top positions matter.
- Use MRR when users usually need one correct first result.
- Use MAP when multiple relevant results per query matter.
- Use Precision@k when only the top k results will be shown.
- Use DCG as the unnormalised building block of NDCG.
The goal is to rank new, unseen lists in a similar way to the rankings in the training data. Selecting and designing good features—feature engineering—is also an important part of improving a ranking model.
Understanding evaluation measures: DCG, NDCG, MAP, MRR, and Precision
Discounted Cumulative Gain (DCG) measures ranking quality by accumulating relevance from the top of the result list while discounting lower positions. It is useful for search and recommendation systems, but raw scores are difficult to compare across queries.
Normalized Discounted Cumulative Gain (NDCG) divides DCG by the ideal DCG (IDCG), making scores easier to compare across queries with different relevance distributions. It supports graded relevance and gives more weight to highly relevant results near the top.
Mean Average Precision (MAP) is the mean of the average precision for each query. It is useful when multiple relevant results matter, but it depends on how many relevant documents each query has.
Mean Reciprocal Rank (MRR) averages the reciprocal rank of the first relevant result. It is useful when users primarily need one correct answer, but it ignores later relevant results.
Precision@k measures the proportion of relevant documents among the first k retrieved documents. It is easy to understand, but it does not by itself account for the order within those k results or for recall.
Frequently asked questions
What is the difference between RankNet and LambdaRank?
RankNet learns pairwise preferences with a logistic loss. LambdaRank keeps the pairwise idea but weights updates by the predicted change in a ranking metric, such as NDCG, when two documents swap.
Is LambdaMART a Learning to Rank algorithm?
LambdaMART is a LambdaRank-style ranking objective combined with boosted decision trees. It is a popular tree-based implementation of the broader LTR idea.
Why is NDCG commonly used for ranking?
NDCG supports graded relevance and discounts lower positions, so it matches systems where a highly relevant result near the top is more valuable than the same result near the bottom.
Is pairwise or listwise ranking better?
Neither is always better. Pairwise methods are often simpler and scale well with sampled document pairs; listwise methods align the objective with the whole query group but can be more involved to train. Choose based on your labels, data volume, and evaluation metric.
