A streaming catalogue's retrieval stage hands you 25 candidate titles per user, and the home row shows ten. Your model decides the order. Global accuracy is the wrong lens here: the product is a per-user list, so a model that serves the heavy users beautifully and gives everyone else the same popular row is failing most of the audience. A third of the people you have to rank for signed up this week and have no history at all.
Establish how concentrated engagement is and how many users you have history for.
Implement explore_catalogue(train_df) returning a dict with:
head_share tells you how strong the "just show the popular thing" strategy is. engaged_per_user_mean tells you how much room a top-10 list has: with ten slots and about ten relevant items, ordering is the whole game.
Evaluated server-side against a hidden test set.