参考列表:
https://wenku.baidu.com/view/e4c5bb4811661ed9ad51f01dc281e53a5902513b.html
https://www.cnblogs.com/imczxj/p/3949222.html
https://blog.csdn.net/zhaoxinfan/article/details/12580135
摘要
用户的偏好通常是时变的,这要求我们在推荐系统中加入时变元素。由于推荐系统本身的复杂性,一般的加入时间窗等方法并不适用。本文通过改进已有的两种协同过滤方法将时间因素加入了考虑,并获得了不错的结果。
绪论
建模时变问题是数据挖掘的核心问题之一。模型不仅要实时地反映出数据的动态,还要在【暂时性的影响】和【长期的内在特征】中找到平衡。这一问题我们叫做concept drift。
探究每个用户的时变行为对算法提出了挑战:因为每个用户自己的数据量显然是很有限的,那么在探究时间影响因素的时候就要有比简单的忽略或对过去行为加权更加精细的算法来挖掘数据中的特征。
总之,我们需要在排除瞬态噪声的同时提取长期模式。仅仅关注现在或不久以后的东西是不够的,我们需要对过去的每个点进行精确建模,这要求我们区分捕获的持久信号和应该与模型的长期部分隔离的噪声。
用户偏好应该是一个时间锚定的问题,这反映了在两个方面,一是用户反馈表现的变化,比如在一个用户为产品提供星级评级的系统中,一个曾经通过“3星”输入来表示中性偏好的用户,现在可能会对相同的“3星”反馈表示不满;另一个方面,在许多情况下,系统不能将访问同一账户的不同家庭成员分开,区分不同的人的一种方法就是假设时间相邻的访问是由同一成员(有时代表其他成员)完成的
所有这些事实说明,时间因素应该成为构建推荐系统的主要因素,而且这一算法有望在其他时间序列中获得应用。我们使用的数据集是Netflix数据集,它规模大、时间长,而且我们在分析中还发现04年以后用户的评分突然变高,而且老电影比新电影有更高的评分,我们会在第6部分中分析这一点。
本文最主要的贡献是给出了一个可以应用于推荐系统中,建模用户偏好时间漂移的方法。我们在广泛使用的数据集上评估这个方法,这样我们就可以和别人作比较。比较结果显示加入时间因素以后,结果好了很多。
第二部分介绍了基本概念和符号,第三部分介绍了解决时间变化用户偏好的原则,然后在第四章和第五章中分别基于隐语义模型和ItemCF模型实现了这个原则。第六章中给出了探索性研究,第七章阐述了相关工作。
准备工作
m名用户,n个物品,uv代表用户,ij代表物品,t代表时间或日期
代表用户u在时间t喜欢物品i,从1到5越大的值表示越强烈的喜欢。
代表预测值。通常绝大多数评分都是未知的。
已知的那些集合为
数据集按照大家一贯的标准使用Netflix的探针集(训练)和测验集。测验集时间晚于探针集。
评估指标是RMSE
追踪用户偏好漂移
当我们提到概念漂移时,大多数情况下它表示一类漂移影响全局。但在推荐系统的问题中,不同时间用户可能受到不同概念漂移的影响。考虑到同一个用户的数据又少,我们需要更加精细、高效的算法和对数据的更彻底利用。
通常追踪时间漂移的思路有三种:
1.实例选择,加入时间窗,只考虑窗内数据。这样做的问题是所有窗内数据被同样重视,而所有窗外数据被同样丢弃。对于时间渐变的情况这样不好。
2. 实例加权。根据和当前时间点的距离来对数据甲醛。
3.集成学习。使用了不止一个分类器,通过它们和当前时间的关联情况对分类器加权。
我们对实例加权方案进行了广泛的尝试,发现调整衰减因子可以改进评估性能,其中,评估性能最好的是没有衰减的时候(…),这说明尽管用户的偏好是缓慢变化的,过去的偏好还是会严重影响未来的偏好,绝对不能简单地丢弃过去的数据。
至于集成学习,一方面它把用户偏好分成很多小方面,这可能导致丢失一些全局特征;另一方面它需要把不同的用户分开考虑,这严重违背了协同过滤的原则,所以我们不是很想要它。
所以我们总结出了下面几个原则:
1.在整个时间轴而不仅仅是某个时间点上提取用户行为特征。
2.考虑多个变化概念,基于用户的/物品的/渐变的/突变的
3.需要对整体建立一个统一的框架,而不是用户建一个,物品建一个,漂移建一个这样子
4.不需要推断未来的瞬态变化。这个信息当然是有用的,但是它太难了,我们的目标是捕捉过去的时间模式,从瞬态噪声中分离出持久信号,这已经很有用了。
Ok,下面来看如何改进ItemCF和隐语义模型算法,来实现这些想法。
时间感知分解模型
4.1分解模型剖析
为了将用户和物品联系起来,矩阵分解做了这样的事情:
下面给出熟悉的baseline模型
然后加入因子模型
上面这个式子的物理意义很明显。等式右边前三项表示总体、用户个体、物品个体自己的性质,第四项表示用户和物品的相互作用。
进一步,考虑物品更隐含的信息(无论它是否被评分),得到SVD++
SVD++的具体介绍可以看这里https://blog.csdn.net/turing365/article/details/80544594
4.2 时变基线预测器
现在我们在上面的信号中加入时变信号。当我们考虑时变信号的时候,首先容易想到,用户的偏好是会变的,一部电影的流行度也是会变的
如何建模随时间变化的函数是一个重要的问题。分的太细则数据不够,分的太粗则精确度不够。根据我们的观察,用户的偏好变化需要更细的时间颗粒度。
划分时间的方法是分桶。我们先考虑的分桶,因为它对时间颗粒度的要求比较低。我们发现在一个比较大的范围里分桶的结果都差不多,最后决定10天分一桶,总共30桶。
也就是说,每个时间段对应选择不同的,但是其实它们都是常数。
但对用户分桶就会更难一些。因为用户行为的变化周期更快,我们又不能简单地细化分桶,因为这样的话会导致每个桶里的数据太少。
我们可以简单的使用一个线性函数来捕捉用户行为模式的漂移
然后,将它和全局行为组合起来
这得到了一个简单的形式,每个用户有b和alpha两个独立的参数。
还有一种方法是使用样条函数,这是一种插值方法。令表示对时间轴的均匀划分,是从数据中学习的、和时间有关的变量,则有
这样,用户偏差就形成了这些参数的时间加权组合。这样的修改只能完成对全局模式的描述,不能观测用户单个天数里的行为。假设用户每天会根据自己的心情有一个评分偏差(当然,这种近似可能带来误差,比如用户的坏心情持续了半天或者3天),模型改写为
用随机梯度下降法优化当前得到的目标函数
下面总结一下我们讲过的所有baseline分类器
它们预测的RMSE如下:
实验结果告诉我们,影响最大的是,这说明用户在不同时间的“标准”改变是很重要的。关于这一点,可以有一些拓展应用,比如不同月份、不同季节、星期几甚至每天的几点等等,当我们谈到时变问题时,都可以应用这样分桶的思想。
另一个问题是随着时间的变化,用户评分的范围也有可能变化,可以将预测式进一步改写为
的求解方法和一致。这里,选择,实验结果表明RMSE可以进一步下降。有趣的是,Netflix他们自己用的推荐系统RMSE也就0.9514,我们的baseline就可以和它的水平差不多!牛逼(破音)!
4.3 时变隐语义模型
用户对于话题的爱好也有可能发生变化,所以我们来对用户偏好做分桶
这里几个符号的意思和上面一样。
Ok。到目前为止,我们就可以把所有因素综合起来,得到扩展的SVD++模型了。梯度下降法真好,修改目标函数就只要在后面加东西。下面这个模型我们取名叫做timeSVD++:
在这里我有一个问题一直没有想明白。以为例,它表示的是用户某一天的心情。如果我们知道用户一天评价了10首歌,然后去预测第11首歌,没有问题,但是假设用户在训练集上有某个月1号到20号的数据,那么显然,一共有20个,分别对应1号到20号。那么,根据论文的阐述,所有测试集的数据都在训练集之后,假设测试集的数据对应的是这个月21号到30号,那么,这10天是没有对应的的呀!我们不能把测试集拿来训练,这是一种信息泄露。猜测是否有可能(1)是用本月1号到30号预测下个月1号到30号(2)是否是指同一个用户只用之前的数据预测,并不一定训练集全部在测试集之前?希望有大佬指教下。
时间感知邻域模型
邻域模型中,我们需要衡量两个物品的相似度。现在要考虑的问题是,用户一天之内给两个物品打了高分,和用户隔了5年给两个物品打了高分,是不一样的。
初始的邻域模型:
我们修改过的邻域模型:
优化问题改写为
这个问题依然可以用随机梯度下降法来解决。效果比很多复杂的算法都要好。这再次提醒我们,关注时间信息可能带来意想不到的好处。
一个探索性研究
做人要讲究有始有终,所以我们不能忘记在绪论中我们曾经告诉大家,04年以后用户的评分突然变高,而且老电影比新电影有更高的评分。下面我们用我们提出的模型解释一下这件事。
04年以后用户的评分突然变高可能有下面三个原因。
1.2004年起,Netflix改进了他们的推荐系统,这使得用户可以看到更加符合他们口味的电影。
2.人们对于级别的要求不那么严格了。这就是娱乐至死的后果啊!!
3.很多人2004年之前都还没有评分。
去掉那些2004年之前没有评分的用户,结果并没有什么变化。第3条排除。
而假设1对应即interaction,假设2对应即baseline。
无疑baseline也有一些变化,但是变化最大的是interaction。所以,评分变高是因为2004年起,Netflix改进了他们的推荐系统,这使得用户可以看到更加符合他们口味的电影。
老电影比新电影有更高的评分可能有两个原因:
1.老电影的匹配率更好(对应interaction)
2.老电影就是更好(对应baseline)
只观察1500天以后的电影(摆脱2004年大跳变的影响),我们可以发现,数据有力地支持了第一条假设:老电影比新电影得到了更准确的推荐。
最后是没耐心看的结论。
结论(来自谷歌翻译)
跟踪客户对产品的偏好的时间动态提出了独特的挑战。每个用户和产品可能会对其特征进行一系列不同的更改。此外,我们经常需要在单个模型中对所有这些变化进行建模,从而将用户(或产品)相互连接以识别共同的行为模式。仅仅衰老的旧实例或多个单独模型的使用会丢失太多信号,从而降低预测准确性。我们采用的解决方案是对整个时间段的时间动态进行建模,使我们能够智能地将瞬态因子与持久因子分开。我们将这种方法应用于两种领先的推荐技术。在分解模型中,我们模拟了用户和产品特征随时间变化的方式,以便从嘈杂模式中提取长期趋势。在项目项邻域模型中,我们展示了如何通过学习用户评定的两个项目之间的影响如何随时间衰减来揭示项目之间更基本的关系。在分解和邻域模型中,包含时间动态证明在提高预测质量方面非常有用,而不仅仅是各种算法增强。这导致了迄今为止在广泛分析的电影评级数据集上发布的最佳结果。
我的思考
这篇文章让我非常惊喜的地方在于第六部分对于数据异常原因的分析。众所周知,现在是深度学习横行天下的时代,大家都说,深度学习的解释性很差,到底这是什么意思?解释性好有什么用?这篇文章给了我答案。自己清清楚楚地知道模型中每一部分的含义,就能真正反过来用模型解释数据、认识数据,从而从发现那些从数据中挖掘出来的规律,知其然知其所以然,从原理上解释数据生成的机理,而不是面对一大堆自己也不知道什么意思的网络参数。
下面是技术总结:
1.在简单的模型中加入时间因素可能有很好的效果。方法有时间窗、时间衰减因子、模型集成等。
2.捕捉时间因子时,将特别个性的时间因子按日期或周期建模,可能有奇效(4.2的最后一部分非常详细地解释了这件事)。
3.学会利用有明确物理意义的模型,来解释数据。