此为DataWhale与天池联合举办的新人赛——新闻推荐,第一个小任务:实现一个Baseline
1 题目
数据来自某新闻APP平台的用户交互数据,包括30万用户,近300万次点击,共36万多篇不同的新闻文章,同时每篇新闻文章有对应的embedding向量表示。为了保证比赛的公平性,将会从中抽取20万用户的点击日志数据作为训练集,5万用户的点击日志数据作为测试集A,5万用户的点击日志数据作为测试集B。
根据点击日志数据,为测试集的每个用户推荐5篇新闻文章,以最大化下一次用户的点击率。评价指标是MRR。
2 赛题理解
题目要求对每个用户推荐5篇新闻文章,文章总数有36万+,这是一个真实的业务场景,需要先建模成数学问题再求解。该问题与常见的回归、分类问题不同,直接做分类(36万+类别)显然是不合适的。
在这样的场景下我们通常求出user点击item的概率,按概率降序排序,取前五推荐给用户。
如果对每个用户,我们都求出该用户与36万+文章的点击率,并排序,这对模型来说工作量是很大的,耗时很长,无法满足推荐系统的实时性要求。
所以,在推荐场景中,我们先通过简单的方法召回一定数量user最可能点击的item,再用排序模型对其排序。召回阶段和排序阶段是串行的,所以召回阶段是非常重要的,若重要的item没有被召回,那排序模型再好都是没有用的;排序阶段是将用户最可能点击的item排在前面,这可以进一步地提高MRR指标。可以说召回是基础,排序是对召回结果的进一步优化。
3 ItemCF算法实现新闻推荐
ItemCF是基于物品的协同过滤方法,常用于召回阶段。本文将实现ItemCF算法,并将其作为新闻推荐的baseline。
ItemCF算法的核心是计算两个物品的相似度,需要注意的是,两个物品的相似度由用户对其的喜好程度决定,不由物品本身的内容属性决定。
ItemCF算法包括两个步骤:
step1:计算两个物品的相似度,为了便于查找,通常用哈希表存储,形如{item1:{item2:sim12,item3:sim13,...},...}。
相似度结果存储起来,需要的时候直接加载使用。物品相似度需要定期依据新来的数据对其进行更新。
step2:计算user对item的点击率
根据用户历史的点击行为计算user对某item的喜爱程度,越喜爱,点击率自然越大。
点击日志数据的格式如下所示:
我们需要将其整理为用户的点击序列格式{user1: [(item1:,time1), (item2, time2)...],...},这样可以方便地查找每个user的历史点击行为。
通常我们希望会将历史点击行为按点击时间排序,即time2>time1。这样做的好处是可以考虑时间对喜爱程度的影响,越久远的点击行为对喜爱程度的影响越弱。