推荐实验方法
离线实验
- 通过日志系统获得用户行为数据,并按照一定格式生成一个标准的数据集
- 将数据集分为训练集和测试集
- 在训练集上训练模型,在测试集上测试
- 通过事先定义的评测指标判断测试效果
用户调查
离线实验的指标和实际的指标会存在差异,比如预测准确率和用户满意度之间就存在差异,高预测准确率不等于高用户满意度。最好的方法就是直接上线测试,但直接上线会存在风险,因此会在上线前做用户调查。
在线实验 (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个步骤
- 离线实验,证明它在很多离线指标上优于现有的算法。
- 用户调查,用户满意度不低于现有的算法。
- 在线测试,通过在线的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。
- 计算用户间的相似度
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的用户的集合 - 计算用户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更具体的推荐
- 根据浏览过的商品推荐
- 根据心愿单推荐
- 根据所购商品推荐
- 图书销售排行榜 每小时更新
- 热卖新品
- 分类推荐
计算物品之间的相似度
$$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}}$$计算用户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 | |
---|---|---|
性能 | 适用于用户较少 | 适用于物品较少 |
领域 | 时效性强,用户个性化兴趣不太明显的领域 | 长尾物品丰富,用户个性化需求强 |
实时性 | 用户有新的行为,不一定造成推荐结果的立即变化 | 用户有新的行为,一定会造成推荐结果的实时变化 |
冷启动 | 新用户对很少物品产生行为后,不能立即对他进行推荐,因为用户相似度表是每隔一段时间离线计算的; 新物品上线后,一旦有用户对该物品产生行为,就可以将新物品推荐给与他相似的用户 | 新用户只要对一个物品产生了行为,就可以给他推荐和该物品相似的物品;新物品上线后,需要很多用户对该物品产生行为,才能计算该物品与其它物品的相似度,才能推荐 |
推荐理由 | 很难提供令用户信服的推荐解释 | 利用用户的历史行为给用户做推荐解释,可以令用户比较信服 |