返回列表

CIKM 2019 超大规模推荐赛道亚军比赛攻略_队伍名字已被占用队

CIKM 2019 EComm AI:超大规模推荐之用户兴趣高效检索 | 231721

开始: 2019-08-21 结束: 2019-10-09 商品推荐 数据算法赛
CIKM 2019 · 推荐系统 · 亚军方案 · 时间注意力协同过滤
🥈 CIKM 2019 AnalytiCup · 亚军 👥 团队:未知 ⏱️ 时间复杂度 O(n)

CIKM 2019 推荐系统 · 亚军方案

基于时间权重的U2U/I2I协同过滤 + 时间注意力相似度 + Stacking融合

赛题背景分析与理解

数据格式 Data Format

训练集一共包含三个文件,分别为用户行为文件、用户信息表、商品信息表,详情如下。

user_behavior.csv为用户行为文件,文件共有4列并以逗号分隔。每列的含义与内容如下:

列名描述
用户ID正整数,对应一个特定的用户
商品ID正整数,对应一个特定的商品
行为类型枚举类型字符串,取值为('pv', 'buy', 'cart', 'fav')之一
时间戳取值范围为[0, 1382400)的整数,表示该行为发生的时间到某一个星期五的0:00:00的时间偏移(单位为秒)

user.csv为用户信息文件,文件共有4列并以逗号分隔:

列名描述
用户ID正整数
性别0男 1女 2未知
年龄正整数
购买力[1,9]正整数

item.csv为商品信息表:

列名描述
商品ID正整数
类目ID正整数
店铺ID正整数
品牌ID整数,-1表示未知

模型要求 Task Target

  • 在 $O(n)$ 时间复杂度内,为用户进行 TopK 商品推荐。为测试集中每一个用户生成 50 个最可能感兴趣的商品。
  • 评价指标:$$Recall@50(u) = \frac{|P_u\cap(G_u-H_u)|}{|G_u-H_u|}$$,专注于新颖的兴趣商品(用户历史行为中未出现过的商品)。

主要挑战

  • Key challenge: user-item semantic gap 用户与商品间的语义鸿沟(比搜索情景大得多)
  • There may be no overlap between user features and item features. Matching cannot be done on the superficial feature level! 用户与商品特征几乎没有重叠,不能做简单层面的特征交互。
  • User interest is implicitly reflected in the clicked item sequence. Time is associated with user id and item id.

所以最后我们把主要挖掘时间信息。

IDEAS

  • 为了挖掘潜在的新颖兴趣商品,我们从全局角度:
    1. 基于 User-CF 寻找相似的用户
    2. 基于 Item-CF 寻找相似的商品
  • CF 模型的确高效,但是并不能解决所有问题,这里我们提出两个疑问:
    1. 用户兴趣是否会随着时间而衰减?
    2. 如果会衰减,那么传统的协同过滤是否会损失时间信息?

答案很明显是的:传统CF模型将所有用户行为当作同一时间发生的,而事实上用户行为是时间序列,是有先后次序的。

模型与方案

系统架构

系统架构

模型1:时间权重的U2U协同过滤

U2U模型

在线上训练集中找到所有相似的用户,加入时序权重:目标用户最近买的商品权重更大,乘以系数 $1/(3+cnt)$,其中 $cnt$ 是用户购买倒数第几次购买。

$$p(u,i)=\sum_{v \in{S(u,K)\bigcap{N(i)}}}{w_{uv}r_{vi}}*\frac{1}{3+cnt_i}$$

策略:与目标用户潜在相关的用户,一定和目标用户点击过同样的商品。找到所有与目标用户点击过同样商品的用户,筛选出 Top 500 作为候选集。

策略图
# 策略核心代码示意 users_d = {} cnt = 0 cnt_thres, user_thres = 100, 500 for item in clicked_items: if item in item_seq: for user in item_seq[item]: users_d[user] = users_d.get( user, 0) + 1/(3+cnt) cnt += 1 if cnt > cnt_thres: break users_lst = [i for i, _ in sorted(users_d.items(), key=lambda x: x[1], reverse=True)[:user_thres]]

模型2:基于时间权重的I2I协同过滤

I2I模型

基于商品的协同过滤的思想是:用户会点击与点击过的商品相似的商品。因此我们需要为每个商品计算其相似的商品,与User-CF的策略类似,与目标商品相似的商品,一定同时被一个用户购买过。对每个目标商品,购买过这个商品的所有用户,他们购买过的商品都与目标商品潜在相关。我们计算出同时购买过两个商品的用户数量,根据用户数量预筛选出800个潜在相关商品

定义如下公式更精细的计算商品相似度:

$$W(i,j) = \frac{|N(i) \cap N(j)|}{\sqrt{|N(i)|*|N(j)|}}$$

其中,$W(i,j)$ 表示物品 $i,j$ 之间的相似度;$N(i)$ 表示点击物品 $i$ 的用户集合,$|N(i)|$ 表示点击物品 $i$ 的用户的个数。

基于时间注意力的相似度计算模型

时间注意力模型

以上两个经典算法能在全局角度找到相似的用户或者相似的商品,比较利于发现较新颖的潜在喜欢商品。但是这两个算法存在一个问题:在找相似用户或者相似商品时,我们用的是一个用户购买的所有商品,这就会出现一个问题,一个用户一个星期前点击的商品很可能跟现在点击的商品没有关系,但是有可能被同一个用户买过而被算法识别成相似商品。

时间窗示意图

针对购买时间跨度长的干扰问题:我们假设时间距离越近的两个商品越相似,如图,对一个用户A购买的所有商品按时间顺序排列,对其中一个商品 $i$,在时间窗内的每个商品 $j$ 与 $i$ 的相似度我们定义为:

$$sim(i,j) = \frac{1}{3+dis(i,j)}$$

相似度 $sim(i,j)$ 可以理解成两个商品在时间窗内共同出现的次数,只是两个商品越近我们认为他们越相似,所以我们乘以了一个系数。从而得到所有商品的相似商品,以及相似度。我们训练的 sim_seq_20_5.pkl 和 sim_seq_30_5.pkl 的区别是其中的参数差异。

PS:我们的模型与 Word2Vec 很像,两个模型都可以在一个滑窗内计算 i2i 相似度,但是我们的模型在用户行为序列上表现更出色,因为我们能考虑的点击的先后次序信息,这一信息的捕获体现在 distance 上。

Stacking

Stacking流程

After feeding log file data into 3 models. We multiply merge from these 3 models:

  1. Each group prepare 200 tuples of (item,score)
  2. rank & get 100 items
  3. Re-rank 40th-100th items by hotness
  4. collect top 50 items to recommend to target users

Performance

性能

创新点

创新点

时间复杂度

时间复杂度

满足赛题要求的 $O(n)$ 时间复杂度限制。

同比赛其他方案