评分预测问题最基本的数据集就是用户评分数据集。该数据集由用户评分记录组成,每一条评分记录是一个三元组(u,i, r),表示用户u给物品i赋予了评分r,本章用r表示用户u对物品i的评分。因为用户不可能对所有物品都评分,因此评分预测问题就是如何通过已知的用户历史评分记录预测未知的用户评分记录。
离线实验方法
评分预测问题基本都通过离线实验进行研究。在给定用户评分数据集后,研究人员会将数据集按照一定的方式分成训练集和测试集,然后根据测试集建立用户兴趣模型来预测测试集中的用
预测的目的就是找到最好的模型最小化测试集RMSE。
关于如何划分训练集和测试集,如果是和时间无关的预测任务,可以以均匀分布随机划分数据集,即对每个用户,随机选择一些评分记录作为测试集,剩下的记录作为测试集。**如果是和时间相关的任务,那么需要将用户的旧行为作为训练集,将用户的新行为作为测试集。**Netflix通过如下方式划分数据集,首先将每个用户的评分记录按照从早到晚进行排序,然后将用户最后10%的评分记录作为测试集,前90%的评分记录作为训练集。
评分预测算法
平均值
最简单的评分预测算法是利用平均值预测用户对物品的评分。
1.全局平均值
定义:训练集中所有评分记录的评分平均值
最终的预测函数可以定义为:
2.用户评分平均值
定义:用户u在训练集中所有评分的平均值
最终的预测函数可以定义为:
3.物品评分平均值
定义:物品i在训练集中接受的所有评分的平均值:
最终的预测函数可以定义为:
4.用户分类对物品分类的平均值
除了这3种特殊的平均值,在用户评分数据上还可以定义很多不同的分类函数。
- 用户和物品的平均分 对于一个用户,可以计算他的评分平均分。然后将所有用户按照评分平均分从小到大排序,并将用户按照平均分平均分成N类。物品也可以用同样的方式分类。
- 用户活跃度和物品流行度 对于一个用户,将他评分的物品数量定义为他的活跃度。得到用户活跃度之后,可以将用户通过活跃度从小到大排序,然后平均分为N类。物品的流行度定义为给物品评分的用户数目,物品也可以按照流行度均匀分成N类。
类类平均值的计算方法
在这段代码中,user_cluster.GetGroup函数接收一个用户ID,然后根据一定的算法返叵用户的类别。item_cluster.GetGroup函数接收一个物品的ID,然后根据一定的算法返回物品的类别。total[gu][gi]/count [gu][gi]记录了第gu类用户给第gi类物品评分的平均分。
上文提到,user_cluster和item_cluster有很多不同的定义方式,下面的Python代码给出了不同的user_cluster和item_cluster定义方式。其中,cluster是基类,对于任何用户和物品,它的cetGroup函数都返回o,因此如果user_cluster和item_cluter都是cluster类型,那么最终的预测函数就是全局平均值。IdCluster的GetGroup函数接收一个ID,会返回这个ID,那么如果user_cluster是cluster类型,而item_cluster是Idcluster类型,那么最终的预测函数给出的就是物品平均值。
以此类推,下表展示了MovieLens数据集中利用不同平均值方法得到的RMSE,实验结果表明对用户使用userVoteCluster,对物品采用ItemVoteCluster,可以获得最小的RMSE。
基于领域的方法
基于用户的邻域算法和基于物品的邻域算法都可以应用到评分预测中。
基于用户的邻域算法
基于用户的邻域算法认为预测一个用户对一个物品的评分,需要参考和这个用户兴趣相似的用户对该物品的评分,即:
用户相似度计算和最终的预测函数:
基于物品的邻域算法
基于物品的邻域算法在预测用户u对物品i的评分时,会参考用户u对和物品i相似的其他物品的评分,即:
Sarwar利用MovieLens最小的数据集对3种相似度进行了对比,并将MAE作为评测指标。实验结果表明利用修正后的余弦相似度进行评分预测可以获得最优的MAE。不过需要说明的是,在一个数据集上的实验并不意味着在其他数据集上也能获得相同的结果。
隐语义模型与矩阵分解模型
最近这几年做机器学习和数据挖掘研究的人经常会看到下面的各种名词,即隐含类别模型( Latent Class Model )、隐语义模型(Latent Factor Model )、pLSA、LDA、Topic Model、MatrixFactorization、Factorized Model。
这些名词在本质上应该是同一种思想体系的不同扩展。在推荐系统领域,提的最多的就是潜语义模型和矩阵分解模型。其实,这两个名词说的是一回事,就是如何通过降维的方法将评分矩阵补全。
用户的评分行为可以表示成一个评分矩阵R,其中R[u][i]就是用户u对物品i的评分。但是,用户不会对所有的物品评分,所以这个矩阵里有很多元素都是空的,这些空的元素称为缺失值( missing value )。因此,评分预测从某种意义上说就是填空,如果一个用户对–个物品没有评过分,那么推荐系统就要预测这个用户是否是否会对这个物品评分以及会评几分。
1.传统SVD分解
对于如何补全一个矩阵,历史上有过很多的研究。一个空的矩阵有很多种补全方法,而我们要找的是一种对矩阵扰动最小的补全方法。那么什么才算是对矩阵扰动最小呢?一般认为,如果补全后矩阵的特征值和补全之前矩阵的特征值相差不大,就算是扰动比较小。所以,最早的矩阵分解模型就是从数学上的SVD(奇异值分解)开始的。
SVD分解数学定义:
SVD分解是早期推荐系统研究常用的矩阵分解方法,不过该方法具有以下缺点,因此很难在实际系统中应用。
- 该方法首先需要用一个简单的方法补全稀疏评分矩阵。一般来说,推荐系统中的评分矩阵是非常稀疏的,一般都有95%以上的元素是缺失的。而一旦补全,评分矩阵就会变成一个稠密矩阵,从而使评分矩阵的存储需要非常大的空间,这种空间的需求在实际系统中是不可能接受的。
- 该方法依赖的SVD分解方法的计算复杂度很高,特别是在稠密的大规模矩阵上更是非常慢。一般来说,这里的SVD分解用于10O0维以上的矩阵就已经非常慢了,而实际系统动辄是上千万的用户和几百万的物品,所以这一方法无法使用。如果仔细研究关于这一方法的论文可以发现,实验都是在几百个用户、几百个物品的数据集上进行的。
2.Simon Funk的SVD分解
正是由于上面的两个缺点,SVD分解算法提出几年后在推荐系统领域都没有得到广泛的关注。直到2006年Netflix Prize开始后,Simon Funk在博客上公布了一个算法°(称为Funk-SVD),一下子引爆了学术界对矩阵分解类方法的关注。而且,Simon Funk的博客也成为了很多学术论文经常引用的对象。Simon Funk提出的矩阵分解方法后来被Netflix Prize的冠军Koren称为LatentFactor Model(简称为LFM )。
Simon Funck的思想很简单:可以通过训练集中的观察值利用最小化RMSE学习P、Q矩阵。
Simon Funk认为,既然我们用RMSE作为评测指标,那么如果能找到合适的P、Q来最小化训练集的预测误差,那么应该也能最小化测试集的预测误差。因此,Simon Funk定义损失函数为:
要最小化上面的损失函数,我们可以利用随机梯度下降法。该算法是最优化理论里最基础的优化算法,它首先通过求参数的偏导数找到最速下降方向,然后通过迭代法不断地优化参数。下面我们将介绍优化方法的数学推导。
下面的代码实现了学习LFM模型时的迭代过程。在LearningLFM函数中,输人train是训练集中的用户评分记录,F是隐类的格式,n是迭代次数。
如上面的代码所示,LearningLFM主要包括两步。首先,需要对P、Q矩阵进行初始化,然后需要通过随机梯度下降法的迭代得到最终的P、Q矩阵。在迭代时,需要在每一步对学习参数α进行衰减(alpha *= 0.9),这是随机梯度下降法算法要求的,其目的是使算法尽快收敛。如果形象一点说就是,如果需要在一个区域找到极值,一开始可能需要大范围搜索,但随着搜索的进行,搜索范围会逐渐缩小。
初始化P、Q矩阵的方法很多,一般都是将这两个矩阵用随机数填充,但随机数的大小还是有讲究的,根据经验,随机数需要和1/sqrt(F)成正比。下面的代码实现了初始化功能。
而预测用户u对物品i的评分可以通过如下代码实现:
LFM提出之后获得了很大的成功,后来很多著名的模型都是通过对LFM修修补补获得的,下面的各节将分别介绍一下改进LFM的各种方法。这些改进有些是对模型的改进,有些是将新的数据引入到模型当中。
3.加入偏置项的LFM
这个预测公式通过隐类将用户和物品联系在了一起。但是,实际情况下,一个评分系统有些固有属性和用户物品无关,而用户也有些属性和物品无关,物品也有些属性和用户无关。因此,Netflix Prize中提出了另一种LFM,其预测公式如下:
-
u 训练集中所有记录的评分的全局平均数。在不同网站中,因为网站定位和销售的物品不同,网站的整体评分分布也会显示出一些差异。比如有些网站中的用户就是喜欢打高分,而另一些网站的用户就是喜欢打低分。而全局平均数可以表示网站本身对用户评分的影响。
-
bu。用户偏置(user bias )项。这一项表示了用户的评分习惯中和物品没有关系的那种因素。比如有些用户就是比较苛刻,对什么东西要求都很高,那么他的评分就会偏
低,而有些用户比较宽容,对什么东西都觉得不错,那么他的评分就会偏高。 -
bi 物品偏置( item bias )项。这一项表示了物品接受的评分中和用户没有什么关系的因素。比如有些物品本身质量就很高,因此获得的评分相对都比较高,而有些物品本身质量很差,因此获得的评分相对都会比较低。
增加的3个参数中,只有bu、bi,是要通过机器学习训练出来的。同样可以求导,然后用梯度下降法求解这两个参数,我们对IearningLFM稍做修改,就可以支持BiasLFM模型:
4.考虑领域影响的LFM
前面的LFM模型中并没有显式地考虑用户的历史行为对用户评分预测的影响。为此,Koren在Netflix Prize比赛中提出了一个模型°,将用户历史评分的物品加人到了LFM模型中,Koren将该模型称为SVD++。
在介绍SVD++之前,我们首先讨论一下如何将基于邻域的方法也像LFM那样设计成一个可以学习的模型。其实很简单,我们可以将ItemCF的预测算法改成如下方式:
加入时间信息
利用时间信息的方法也主要分成两种,一种是将时间信息应用到基于邻域的模型中,另一种是将时间信息应用到矩阵分解模型中。下面将分别介绍这两种算法。
1.基于领域的模型融合事件信息
因为Netflix Prize数据集中用户数目太大,所以基于用户的邻域模型很少被使用,主要是因为存储用户相似度矩阵非常困难。因此,本节主要讨论如何将时间信息融合到基于物品的邻域模型中。
Netflix Prize的参赛队伍BigChaos在技术报告中提到了一种融入时间信息的基于邻域的模型,本节将这个模型称为TItemCF。该算法通过如下公式预测用户在某一个时刻会给物品什么评分:
2.基于矩阵分解的模型融合事件信息
模型融合
Netflix Prize的最终获胜队伍通过融合上百个模型的结果才取得了最终的成功。由此可见模型融合对提高评分预测的精度至关重要。本节讨论模型融合的两种不同技术。
1.模型级联融合
效果:
2.模型加权融合
一般来说,评分预测问题的解决需要在训练集上训练K个不同的预测器,然后在测试集上作出预测。但是,如果我们继续在训练集上融合K个预测器,得到线性加权系数,就会造成过拟合
- 假设数据集已经被分为了训练集A和测试集B,那么首先需要将训练集A按照相同的分割方法分为A1和A2,其中A2的生成方法和B的生成方法一致,且大小相似。
- 在A1上训练K个不同的预测器,在A2上作出预测。因为我们知道A2上的真实评分值,所以可以在A2上利用最小二乘法计算出线性融合系数α。
- 在A上训练K个不同的预测器,在B上作出预测,并且将这K个预测器在B上的预测结果按照已经得到的线性融合系数加权融合,以得到最终的预测结果。
除了线性融合,还有很多复杂的融合方法,比如利用人工神经网络的融合算法。其实,模型融合问题就是一个典型的回归问题,因此所有的回归算法都可以用于模型融合。