推荐

Posted by ZhengYang on 2016-08-28

推荐实验方法

离线实验

  1. 通过日志系统获得用户行为数据,并按照一定格式生成一个标准的数据集
  2. 将数据集分为训练集和测试集
  3. 在训练集上训练模型,在测试集上测试
  4. 通过事先定义的评测指标判断测试效果

用户调查

离线实验的指标和实际的指标会存在差异,比如预测准确率和用户满意度之间就存在差异,高预测准确率不等于高用户满意度。最好的方法就是直接上线测试,但直接上线会存在风险,因此会在上线前做用户调查。

在线实验 (AB测试)

举个简单的例子,当你有一个日IP过千的网站,而你的网站首页几百年没有更改了,这个时候你想启用新的网页,而你有害怕新的页面用户不一定就非常喜欢,那么这个时候你就需要进行A/B测试了。测试的方法是将老页面定义为A页面,新页面定义为B页面。到谷歌网站优化工具申请进行A/B测试(免费的),这是时候谷歌会给你一串代码,我们只需要将代码添加到谷歌要求的页面即可。

代码添加完毕,如果有一千个用户访问你的网站,那么会有500个用户看到A页面,500个用户看到B页面,这个时候再统计下通过A页面到达网站内页的用户占的百分比是多少,通过B页面到达内页的用户占的百分比是多少。假设A的是6%,B的是20%那么恭喜你,这说明你新设计的页面是博得了用户的欢心。如果你对20%的结果还不满意,那么继续修改你的页面,直到这个转化率不能够再提高为止。

A/B测试是一个科学的统计方法,这一统计的诞生,再也不用为了争吵是使用A图片好,还是使用B图片好,好不好,按照效果说算。还是邓爷爷说的好,实践是检验真理的唯一标准。停止争吵,来做个A/B测试吧。

前提是你要有上千的IP,而且还是每日。数据太小的话,往往不准确。

小结

一般来说,一个新的推荐算法的最终上线,需要完成3个步骤

  1. 离线实验,证明它在很多离线指标上优于现有的算法。
  2. 用户调查,用户满意度不低于现有的算法。
  3. 在线测试,通过在线的AB测试确定指标是否优于现有算法。

评测指标

1.用户满意度

网易云音乐的歌曲 喜欢

2.预测准确率

豆瓣读书 想读 在读 读过 评分

评分预测

均方根误差
$$RMSE=\sqrt\frac{\sum_{u,i\in T}(r_{ui}-\hat r_{ui})^2}{|T|}$$
$u$表示用户,
$i$表示物品,
$r_{ui}$表示用户u对物品i实际评分,
$\hat r_{ui}$表示用户u对物品i预测评分,
$T$表示记录总数
平均绝对误差
$$MAE=\frac{\sum_{u,i\in T}|r_{ui}-\hat r_{ui}|}{|T|}$$

TopN

精确率
$$Recall=\frac{\sum_{u\in U}|R(u)\cap T(u)|}{\sum_{u \in U}|R(u)|}$$
$R(u)$表示推荐给用户u的物品集合
$T(u)$表示用户u实际点击的物品集合
召回率
$$Recall=\frac{\sum_{u\in U}|R(u)\cap T(u)|}{\sum_{u \in U}|T(u)|}$$

3.覆盖率

推荐的物品占总物品的比例。
$$Coverage=\frac{|\bigcup_{u\in U}R(u)|}{|I|}$$
$R(u)$表示推荐给用户u的物品集合
$I$表示所有物品集合

基于用户的协同过滤 UserCF

先找到与用户A有相似兴趣的其他用户,然后再把其他用户喜欢的,而用户A没有听说过的物品推荐给A。

  1. 计算用户间的相似度
    Jaccard距离
    $$w_{uv}=\frac{|N(u)\cap N(v)|}{|N(u)\cup N(v)|}$$
    $N(u)$表示用户u使用过的物品集合
    余弦相似度
    $$w_{uv}=\frac{|N(u)\cap N(v)|}{\sqrt{|N(u)||N(v)|}}$$
    改进的余弦相似度
    两个用户对冷门物品采用同样的行为更能说明他们兴趣的相似度
    $$w_{uv}=\frac{\sum_{i\in\{N(u)\cap N(v)\}}\frac{1}{log(1+|N(i)|)}}{\sqrt{|N(u)||N(v)|}}$$
    $N(i)$表示使用过物品i的用户的集合
  2. 计算用户A对为听说过,未使用过的物品的感兴趣程度
    $$p(u,i)=\sum_{v\in \{ S(u,K)\cap N(i)\}}w_{uv}r_{vi}$$
    $p(u,i)$表示用户u对物品i的感兴趣程度
    $S(u,K)$表示与用户u最相似的K个用户
    $N(i)$表示使用过物品i的用户的集合
    $w_{uv}$表示用户u和用户v的相似度
    $r_{vi}$表示用户v对物品i的感兴趣程度,可以看成是评分

基于物品的协同过滤 ItemCF

UserCF缺点:

  • 随着用户数目的增多,计算用户相似度矩阵越来越困难
  • UserCF不好解释,不能说B和A相似,B习惯的物品 A都喜欢

ItemCF的特点:

  • ItemCF给用户推荐那些和他们之前喜欢的物品相似的物品,是物品之间的相似度
  • ItemCF并不利用物品的内容属性,计算物品间的相似度,而是通过分析用户的行为记录计算物品间的相似度。
  • ItemCF认为,物品u和物品v具有很大的相似度,是因为喜欢物品u的用户大都也喜欢物品v。
  • 可以理解为把人推荐给物品。
  • ItemCF可以解释,因为用户A之前喜欢过物品u,而物品u和物品v很相似,所以将物品v推荐给用户A。

Amazon更具体的推荐

  • 根据浏览过的商品推荐
  • 根据心愿单推荐
  • 根据所购商品推荐
  • 图书销售排行榜 每小时更新
  • 热卖新品
  • 分类推荐
  1. 计算物品之间的相似度
    $$w_{ij}=\frac{|N(i)\cap N(j)|}{|N(i)|}$$
    该相似度的计算等同于关联规则的置信度(Confidence)
    购买了物品i的用户也经常购买物品j
    但这个公式存在一个问题,即对于热门的物品$w_{ij}$会变得很大,因此加了对物品i热度的惩罚权重。
    改进的物品相似度
    $$w_{ij}=\frac{|N(i)\cap N(j)|}{\sqrt{|N(i)||N(j)|}}$$
    $N(i)$表示使喜欢物品i的用户的集合
    改进的相似度 IUF
    $$w_{ij}=\frac{\sum_{u\in N(i)\cap N(j)}\frac{1}{log(1+|N(u)|)}}{\sqrt{|N(i)||N(j)|}}$$
    该相似度认为,不活跃的用户对物品相似度的贡献应 大于 活跃用户
    归一化相似度
    $$w^*_{ij}=\frac{w_{ij}}{max_j w_{ij}}$$

  2. 计算用户u对物品j的兴趣度
    $$p(u,i)=\sum_{j \in \{ N(u)\cap S(i,K)\}}r_{uj}w_{ji}$$
    和用户历史上感兴趣的物品越相似,越有可能在用户的推荐列表里获得较高的排名。
    $N(u)$表示用户u的历史物品
    $S(i,K)$表示与物品i最相似的K个物品
    $r_{uj}$表示用户u对物品j的评价
    $w_{ji}$表示物品j和物品i的相似度

UserCF & ItemCF

UserCF给用户推荐那些和他有共同兴趣的用户喜欢的物品
ItemCF给用户推荐那些和他之前喜欢的物品相似的物品
UserCF的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度
ItemCF的推荐更个性化,反映了用户自己的兴趣延续。

如果需要提供推荐解释,选择ItemCF
如果用户量太大,计算成本太高,选择ItemCF
如果物品量太大,计算成本太高,选择UserCF

UserCF ItemCF
性能 适用于用户较少 适用于物品较少
领域 时效性强,用户个性化兴趣不太明显的领域 长尾物品丰富,用户个性化需求强
实时性 用户有新的行为,不一定造成推荐结果的立即变化 用户有新的行为,一定会造成推荐结果的实时变化
冷启动 新用户对很少物品产生行为后,不能立即对他进行推荐,因为用户相似度表是每隔一段时间离线计算的; 新物品上线后,一旦有用户对该物品产生行为,就可以将新物品推荐给与他相似的用户 新用户只要对一个物品产生了行为,就可以给他推荐和该物品相似的物品;新物品上线后,需要很多用户对该物品产生行为,才能计算该物品与其它物品的相似度,才能推荐
推荐理由 很难提供令用户信服的推荐解释 利用用户的历史行为给用户做推荐解释,可以令用户比较信服