推荐系统--用户行为和实验设计

主要介绍推荐系统用户行为数据、实验设计,是接下来算法实验的基础。

用户行为

用户行为数据

用户行为分为 显性 和 隐性 两种。

  • 显性反馈行为(explicit feedback)
    用户评分、喜欢/不喜欢
  • 隐性反馈行为(implicit feedback)
    页面浏览行为、消费行为

两者比较

如何表示用户:

  • user id
    产生行为的用户
  • item id
    产生行为的对象
  • behavior type
    行为的种类(如购买还是浏览)
  • context
    产生行为的上下文,包括时间和地点
  • behavior weight
    行为的权重(用户评分、观看时长等)
  • behavior content
    行为的内容(评论文本、标签等)

数据集的一般分类:

  • 无上下文信息的隐性反馈数据集
    包含 user id, item id
    如 Book-Crossing
  • 无上下文信息的显性反馈数据集
    包含 user id, item id, 物品评分
  • 有上下文信息的隐性反馈数据集
    包含 user id, item id, 用户对物品产生行为的 timestamp
    如 Lastfm
  • 有上下文信息的显性反馈数据集
    包含 user id, item id, 物品评分, 用户对物品产生行为的 timestamp
    如 Netflix Prize

用户行为分析

物品流行度 和 用户活跃度 都近似于 长尾分布。下图表示用户活跃度和物品流行度的关系(MovieLens 数据集)。

一般认为,新用户倾向于浏览热门物品,因为对网站不熟悉,只能点击首页的热门物品,而老用户会逐渐开始浏览冷门物品。

仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法,有很多种方法,这里介绍 基于邻域的方法(neighborhood-based)隐语义模型(latent factor model)基于图的随机游走算法(random walk on graph),这其中,最有名、在业界得到最广泛应用的算法是基于邻域的方法。接下来的博客会一一讨论这些算法。

实验设计

数据集

采用 GroupLens 提供的 MovieLens 数据集,选中等大小的数据集,包含 6000 多用户对 4000 多部电影的 100 万条评分。

实验目的

研究隐反馈数据集中的 Top N 推荐问题,因此忽略数据集中的评分记录。预测的是用户会不会对某部电影评分,而不是预测用户在准备对某部电影评分对前提下会给电影评多少分。

实验过程

离线实验。

  • 将用户行为数据集均匀的随机分成 M 份(这里取 8)
    挑一份作为测试集,剩下 M-1 份作为训练集
  • 在训练集上建立用户兴趣模型,在测试集上评测,统计评测指标
  • M 次实验,每次使用不同的测试集
    M 次试验的评测指标取平均值
    防止过拟合
    如果数据集够大,模型够简单,为了快速通过离线实验初步选择算法,也可以只进行一次实验
      
      
1
2
3
4
5
6
7
8
9
10
      
      
def SplitData(data, M, k, seed):
test = []
train = []
random.seed(seed)
for user, item in data:
if random.randint(0,M) == k:
test.append([user,item])
else:
train.append([user,item])
return train, test

评测指标

  • 准确率
  • 召回率
  • 覆盖率
  • 新颖度
      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
      
      
def Precision(train, test, N):
hit = 0
all = 0
for user in train.keys():
tu = test[user]
rank = GetRecommendation(user, N)
for item, pui in rank:
if item in tu:
hit += 1
all += N
return hit / (all * 1.0)
def Recall(train, test, N):
hit = 0
all = 0
for user in train.keys():
tu = test[user]
rank = GetRecommendation(user, N)
for item, pui in rank:
if item in tu:
hit += 1
all += len(tu)
return hit / (all * 1.0)
def Coverage(train, test, N):
recommend_items = set()
all_items = set()
for user in train.keys():
for item in train[user].keys():
all_items.add(item)
rank = GetRecommendation(user, N)
for item, pui in rank:
recommend_items.add(item)
return len(recommend_items) / (len(all_items) * 1.0)
def Popularity(train, test, N):
item_popularity = dict()
for user, items in train.items():
for item in items.keys():
if item not in item_popularity:
item_popularity[item] = 0
item_popularity[item] += 1
ret = 0
n=0
for user in train.keys():
rank = GetRecommendation(user, N)
for item, pui in rank:
ret += math.log(1 + item_popularity[item])
n += 1
ret /= n * 1.0
return ret

该实验设计用于接下来 基于邻域的方法(neighborhood-based)隐语义模型(latent factor model)基于图的随机游走算法(random walk on graph) 的博客中。



原文地址: http://www.shuang0420.com/2017/02/08/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F--%E7%94%A8%E6%88%B7%E8%A1%8C%E4%B8%BA%E5%92%8C%E5%AE%9E%E9%AA%8C%E8%AE%BE%E8%AE%A1/

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值