Collaborative Filtering for Implicit Feedback Datasets

论文地址 http://yifanhu.net/PUB/cf.pdf

这篇论文是spark的协同过滤算法隐式反馈方法实现方案的论文。为什么要读?因为在生产过程中发现有同学在用RMSE来衡量spark的协同过滤隐式反馈参数的好坏。

论文的目的是如何利用隐式反馈(观测值没有实锤,没有一个完全可比的)来进行矩阵分解。思路是将观测值转换成0/1预测值和相关的置信度。

什么是隐式反馈

1)没有负面评价;2)天然就带噪声(比如买东西可能只是用来送礼);3)观测值不能直接表示为兴趣,只能代表置信程度;4)需要有合适的方法来对隐式反馈进行评价,而不能直接用RMSE。

在论文中隐式反馈rui定义为观看show的次数,0.7相当于观看了70%,2相当于观看了两次。

比较的方法

1)最近邻推荐

2)用于显式反馈的SVD算法

对比一下显式反馈和隐式反馈的优化函数



其中,隐式反馈的预测值和置信度分别定义为:


具体的训练过程和算法在这里就不说了,重点在实际的应用中如何使用隐式反馈,以及如果评价算法的效果。

数据集和预处理

电视的用户观看数据,rui自然是观看的时长的比例,由于电视解决的季节性,使用4个星期的数据作为训练数据,接下来的那个星期为测试数据。训练集一共有1.7w的节目和3200w有效的观看。为了让测试得更准确,做了这两件事情:1)去掉了用户在训练集中观看过的数据;2)rui少于0.5的全部置为为0,训练集倒是没做这样的设置。这样,测试机还有200w的非0rui数据,超参数设置为10-8(疑问:为什么这么设置?)

另外一个观察是有很多用户有可能不是在完全认真的观看电视,也许睡着了或者只是出于惯性在继续观看,所以设置了一个momentum effect,这样用来在同一个session中将接下来的观看降权,实验中他们发现通频道第三个观看降低为一半的置信度,第五个没换频道的观看降权99%是一个合理的方式。通过设置超参数a=2,b=6。



实际的评价指标

定义为一个排序指标,训练时为每个用户生成一个节目的列表,然后通过测试集中节目在列表中的百分位作为一个打分,乘以置信度作为一个加权。最后的rank得分定义如下。如果rank等于50%,其实说明是在随机,如果rank大于50%,说明效果还不如随机。



实验结果

第一个实验衡量的是取长度维度特征(作者说在计算能力足够的情况下,长度越长越好)的隐式反馈排序结果与热门排序和最近邻排序的比较;

另外一个是来验证最终的推荐质量:如果排序方法好,那么所有观看的节目应该在排序百分位占比更低,这个比较可以通过计算累计分布函数来完成。


Collaborative Filtering for Implicit Feedback Datasets_第1张图片

作者还做了一个事情,如果直接拿观测值或者0/1预测值来做基于显式反馈的矩阵分解,效果都不如隐式反馈的矩阵分解。

作者分析了模型在实际中的一些效果,将测试集按照节目的热门程度进行了分桶,一共分了15个桶,然后来看排序的rank值,结果发现模型其实更愿意去推荐热门的数据,另外一方面,将观看者也放到这15个桶中,发现对于不同用户推荐的rank值差不多,说明其实对于那些什么都看的重度观看用户模型表现得并不是特别好。


Collaborative Filtering for Implicit Feedback Datasets_第2张图片

推荐模型的解释性方面,之前对于矩阵分解的推荐方法来说,解释性比基于领域的方法差了很多。作者巧妙的通过转换最近邻方法(没看懂具体的方法)来对推荐结果进行解释。top5的节目能给30%-40%的推荐结果进行解释。


Collaborative Filtering for Implicit Feedback Datasets_第3张图片


感想

作者不仅提出了一个更有效的解决问题的方法,同时还在验证也说明该方法有效性上做了特别多的工作,包括离线评价指标、基于推荐效果的评价指标、推荐模型的解释性。实际应用中,对于数据观察得很仔细,做了很多有意义的预处理工作,值得学习。

你可能感兴趣的:(Collaborative Filtering for Implicit Feedback Datasets)