03 — Target Variables: Explicit vs Implicit Feedback
“Tell me what you optimize for, and I’ll tell you what users will do.”
Introduction
Before architecture, before features, before metrics — what is the model predicting? The choice of label is the most consequential decision in a recommender. It encodes what “good” means to the product. Get it wrong and a brilliant model will reliably produce brilliant garbage.
This post unpacks explicit vs implicit signals, the difference between click, conversion, engagement, and satisfaction, and how to build robust multi-signal labels.
1. Explicit vs Implicit
flowchart LR
A[User Behavior] --> B[Explicit Signals<br/>Ratings, Thumbs, Reviews]
A --> C[Implicit Signals<br/>Clicks, Dwell, Skips, Replays]
B --> D[Pros: clean intent<br/>Cons: sparse, biased toward extremes]
C --> E[Pros: abundant, natural<br/>Cons: ambiguous, position-biased]
Explicit feedback
User intentionally says they liked or disliked something: 5-star ratings, thumbs up/down, hearts, saves, written reviews.
Implicit feedback
User behavior implies preference without an intentional signal: click, watch >30s, scroll past, abandon cart, return next day.
| Aspect | Explicit | Implicit |
|---|---|---|
| Volume | ~1% of users | 100% of users |
| Noise | Low but selection-biased | High but representative |
| Negative signal | Available (1-star) | Inferred (skip, low dwell) |
| Cold start | Possible via prompts | Requires observation |
| Latency to label | Long (review later) | Instant (click now) |
2. The Hierarchy of Signals
flowchart TB
A[Impression] --> B[Click / Tap]
B --> C[Engaged View<br/>>30s, >50% scroll]
C --> D[Conversion<br/>Add-to-cart, Save, Subscribe]
D --> E[Purchase / Completion]
E --> F[Long-Term Value<br/>Retention, Return, Recommend]
The higher up the funnel, the more abundant but noisier the signal. The deeper, the rarer but more aligned with business value.
Rule of thumb: train on the deepest signal you have enough of, and use higher-funnel signals as auxiliary tasks (Blog 12: MMoE).
3. Common Targets and Their Quirks
3.1 Binary Click
\(y \in \{0, 1\}\)
- Easy to model with logistic regression / NN classifier.
- Position biased (Blog 17). Top slots get inflated CTR.
- Doesn’t distinguish a casual tap from a deep engagement.
3.2 Conversion (CVR)
\(y = 1 \text{ iff click} \to \text{purchase/signup}\)
- High business signal.
- Severe class imbalance (~0.1–3%) — use focal loss, downsampling, calibration.
- Conversion can happen days later — needs attribution windowing.
3.3 Dwell Time / Watch Time
Continuous, log-normal. YouTube famously optimizes log(watch time).
- Captures quality of engagement.
- Heavy-tailed → log-transform.
- Bots and autoplay can game it.
3.4 Rating
$y \in {1, …, 5}$ or ${-1, +1}$ (thumbs).
- Sparse — most users never rate.
- Distribution is bimodal (people rate when extreme).
3.5 Multi-Signal Composite
Many production systems use weighted sums: \(y = w_{\text{click}} \cdot \text{click} + w_{\text{watch}} \cdot \log(\text{watch}) + w_{\text{share}} \cdot \text{share} - w_{\text{skip}} \cdot \text{skip}\)
The weights are tuned via online A/B with the long-term metric (retention) as ground truth.
4. Implicit Negative Sampling
Implicit data has no clear negatives. Options:
| Strategy | When |
|---|---|
| Uniform random items | Quick baseline (BPR, ALS) |
| Popularity-weighted | Tighter decision boundary, more useful negatives |
| In-batch negatives | Standard in two-tower (Blog 09) |
| Hard negatives (mined via approximate NN) | Big lift but unstable; gradient-stop tricks needed |
| Exposure-aware negatives (shown but not clicked) | Closest to causal; suffers from position bias |
import numpy as np
def sample_negatives(user_pos_items, n_items, k=4, strategy="uniform", item_pop=None):
negs = []
while len(negs) < k:
if strategy == "uniform":
cand = np.random.randint(0, n_items)
else: # popularity
cand = np.random.choice(n_items, p=item_pop)
if cand not in user_pos_items:
negs.append(cand)
return negs
5. Delayed Feedback
For conversions, the label may arrive days after the impression. Two approaches:
- Delayed feedback model (DFM): joint model of conversion probability and conversion delay (Chapelle 2014).
- Importance sampling correction: reweight to undo the delay-truncation bias.
6. Counterfactual Labels
The “true” label you want is would the user have clicked if shown? — counterfactual. You observe only what was shown. See Blog 17 for IPS, DR, and propensity scoring.
7. Code: Build a Multi-Signal Label on MovieLens 25M
import pandas as pd
ratings = pd.read_csv("ratings.csv") # MovieLens 25M
tags = pd.read_csv("tags.csv")
# We treat: rating >= 4 as positive, tag as engagement boost
ratings["pos"] = (ratings["rating"] >= 4).astype(int)
tags["tagged"] = 1
tagged = tags.groupby(["userId", "movieId"])["tagged"].max().reset_index()
df = ratings.merge(tagged, on=["userId", "movieId"], how="left").fillna(0)
# Composite label
df["label"] = (0.6 * df["pos"] + 0.4 * df["tagged"]).clip(0, 1)
print(df.head())
For implicit-only datasets like RetailRocket:
events = pd.read_csv("events.csv")
weights = {"view": 1, "addtocart": 5, "transaction": 25}
events["w"] = events["event"].map(weights)
labels = events.groupby(["visitorid", "itemid"])["w"].sum().reset_index()
8. Calibration Matters
If your model serves multi-stage pipelines (e.g., ad auction, slate optimizer), scores must be probabilities, not just rank-correct. Use:
- Platt scaling or isotonic regression on a holdout.
- Periodic temperature scaling for deep models.
from sklearn.isotonic import IsotonicRegression
cal = IsotonicRegression(out_of_bounds="clip").fit(p_raw, y_true)
p_cal = cal.transform(p_raw)
9. Pros & Cons by Target Choice
| Target | Pros | Cons | Best for |
|---|---|---|---|
| Explicit rating | Clean preference | Sparse, biased | Cold start, niche tastes |
| Click | Abundant | Position-biased, shallow | First-stage ranking |
| Dwell / watch time | Quality signal | Manipulable | Feeds, video |
| Conversion | Business-aligned | Imbalanced, delayed | E-commerce, subscriptions |
| Composite | Captures multiple goals | Weight tuning | Most large-scale prod systems |
| LTV | True north | High variance, slow | Long-term planning |
10. Production Tips
- Always log impressions and outcomes — without impressions you can’t build negatives.
- Trace every conversion to the impression that caused it; this is your attribution model.
- Use multiple targets with multi-task heads (Blog 12) so you don’t lock into one signal.
- Re-derive labels as your product changes (e.g., when you switch from “save” to “follow”).
- Track label drift — what counted as positive 6 months ago may not now.
11. Public Datasets
- MovieLens (explicit ratings + tags) — https://grouplens.org/datasets/movielens/
- Amazon Reviews 2018 (explicit ratings + reviews) — https://nijianmo.github.io/amazon/
- RetailRocket (implicit funnel: view → cart → purchase) — https://www.kaggle.com/datasets/retailrocket/ecommerce-dataset
- Criteo Sponsored Search (implicit + delayed conversions) — https://ailab.criteo.com/
- Yoochoose / RecSys Challenge 2015 (clicks + buys) — https://recsys.acm.org/recsys15/challenge/
12. Further Reading
- Hu, Koren, Volinsky, Collaborative Filtering for Implicit Feedback Datasets (ICDM 2008)
- Chapelle, Modeling Delayed Feedback in Display Advertising (KDD 2014)
- Covington et al., Deep Neural Networks for YouTube Recommendations (RecSys 2016)
- Ma et al., Entire Space Multi-Task Model: ESMM (SIGIR 2018)