数据集
混合的数据集
单独使用douban_imdb训练确实有效果,但是因为是国外的数据集,国外电影占绝大部分,国内电影推荐效果非常差。
douban_csdn数据集最稀疏,训练不出效果,mtime、douban_openkg指标还行,单独来用item太少。因此拟将这三个数据集混合在一起。
douban_imdb电影频数往往达到五六万往上,其他数据集的频数比较而言太小了,需要删除douban_imdb的部分行。于是,我将所有数量大于1000的item,随机删除记录,只保留(500 + len(group) // 50)行。
if dataset == 'douban_imdb':
df = pd.DataFrame()
for iid, group in tqdm(data.groupby('iid')):
if len(group) > 1000:
left = np.random.choice(group.index.tolist(), 500 + len(group) // 50, replace=False)
df = df.append(group.loc[left])
else:
df = df.append(group)
data = df
del df`
这里使用的是分组,注意遍历的不能是iid,不然每次都得查询,速度很慢(30min->5min)。
统计
原数据集
Datasets | all the clicks | all the items | all the users | density |
---|---|---|---|---|
douban_imdb | 9,130,043 | 10,634 | 162,224 | 0.53% |
mtime | 103,393 | 13,455 | 13,835 | 0.06% |
douban_openkg | 424,799 | 1,100 | 64,759 | 0.60% |
划分sess之后
Datasets | all the clicks | all the items | train sessions | test sessions | train avg.length |
---|---|---|---|---|---|
douban_imdb | 946,035 | 6,865 | 692,847 | 84,396 | 15.3 |
mtime | 9,367 | 3,233 | 6166 | 1,067 | 14.9 |
douban_openkg | 16,745 | 896 | 10,097 | 2,216 | 4.3 |
mix | 972,147 | 10,692 | 709,110 | 87,679 | 4.3 |
mix最后能跑到recall@20 27%,mrr@20 9%,和douban_imdb差不多
对NARM的改动
因为NARM得到的session representation是global和local的拼接,维度是2*hidden size,即最初输入的两倍。为了使其作为新的用户表示存入数据库,需要调整维度。
一种方法是,对于
R
2
∣
H
∣
R^{2|H|}
R2∣H∣空间中串联的
c
t
c_t
ct(注:为方便表示,这里
∣
H
∣
{|H|}
∣H∣是原论文的1/2),再经过一个线性变换到
R
∣
H
∣
R^{|H|}
R∣H∣空间中(类似于多模态的做法),即
u
=
W
c
t
\begin{aligned} u = Wc_t \end{aligned}
u=Wct
第二种方法是,原论文在最后计算scores时,先将
R
∣
D
∣
R^{|D|}
R∣D∣的emb映射到
R
∣
H
∣
R^{|H|}
R∣H∣,
事实上是
S
i
=
(
B
T
e
m
b
i
)
T
c
t
S_i = (\pmb{B^T}emb_i)^Tc_t
Si=(BTBTBTembi)Tct
我们也可以先映射会话表示,即
S
i
=
e
m
b
i
T
(
B
c
t
)
S_i = emb_i^T(\pmb{B}c_t)
Si=embiT(BBBct),于是将
c
t
c_t
ct映射到
R
∣
D
∣
R^{|D|}
R∣D∣上。存入数据库也即
∣
D
∣
|D|
∣D∣维,在输入时,借鉴GGNN的做法,用0扩展为|H|维。
当然,第二种方法会带来一定的损失,第一种方法增加了复杂度,都有缺点。
先在diginetica数据集上进行实验,查看效果。
Recall@20 | MRR@20 | |
---|---|---|
N A R M o r i g i n NARM_{origin} NARMorigin | 53.15 | 18.22 |
N A R M l i n e a r NARM_{linear} NARMlinear | 52.19 | 18.19 |
N A R M l i n e a r − b i a s NARM_{linear-bias} NARMlinear−bias | 52.79 | 18.10 |
N A R M H 2 D NARM_{H2D} NARMH2D | 53.16 | 18.23 |
可以看到差别不大,但加一层linear(第一种方法)效果有所下降,先映射(第二种)几乎没有变化(数学上一致的)。
第二种方法还可以减少硬盘占用,因此采取该方法。