到目前为止我们都是在讨论TopN推荐,即给定一个用户,如何给他生成一个长度为N的推荐列表,使该推荐列表能够尽量满足用户的兴趣和需求。但是,很多从事推荐系统研究的同学最早接触的却是评分预测问题。评分预测问题都是推荐系统研究的核心。评分预测问题最基本的数据集就是用户评分数据集。该数据集由用户评分记录组成,每一条评分记录是一个三元组(u,i,r),表示用户u给物品i赋予了评分r。因为用户不可能对所有物品都评分,因此评分预测问题就是如何通过已知的用户历史评分记录预测未知的用户评分记录。
离线实验方法
评分预测问题基本都通过离线实验进行研究。研究人员会根据测试集建立用户兴趣模型来预测测试集中的用户评分。对于测试集中的一对用户和物品(U,i),用户U对物品i的真实评分是r,而推荐算法预测的用户U对物品i的评分为r’,那么一般可以用均方根误差RMSE度量预测的精度:
评分预测的目的就是找到最好的模型最小化测试集的RMSE。
评分预测算法
平均值
最简单的评分预测算法是利用平均值预测用户对物品的评分的。下面将分别介绍各种不同的平均值。
全局平均值,用户评分平均值和物品评分平均值都是类类平均值的一种特例。
除了这3种特殊的平均值,在用户评分数据上还可以定义很多不同的分类函数。
用户和物品的平均分: 对于一个用户,可以计算他的评分平均分。然后将所有用户按照评分平均分从小到大排序,并将用户按照平均分平均分成物品也可以用同样的方式分类。
用户活跃度和物品流行度: 对于一个用户,将他评分的物品数量定义为他的活跃度。得到用户活跃度之后,可以将用户通过活跃度从小到大排序,然后平均分为N类。物品的流行度定义为给物品评分的用户数目,物品也可以按照流行度均匀分成N类。
基于领域的方法
arwar利用MovieLens最小的数据集对3种相似度进行了对比®,并将MAE作为评测指标。实验结果表明利用修正后的余弦相似度进行评分预测可以获得最优的MAE。不过需要说明的是, 在一个数据集上的实验并不意味着在其他数据集上也能获得相同的结果。
隐语义模型与矩阵分解
在推荐系统领域,提的最多的就是潜语义模型和矩阵分解模型。其实,这两个名词说的是一回事,就是如何通过降维的方法将评分矩阵补全。 用户的评分行为可以表示成一个评分矩阵R,其中R[u][i]就是用户u对物品i的评分。但是,用 户不会对所有的物品评分,所以这个矩阵里有很多元素都是空的,这些空的元素称为缺失值 (missing value)。因此,评分预测从某种意义上说就是填空,如果一个用户对一个物品没有评过分,那么推荐系统就要预测这个用户是否是否会对这个物品评分以及会评几分。
1.传统的SVD分解
对于如何补全一个矩阵,历史上有过很多的研究。一个空的矩阵有很多种补全方法,而我们 要找的是一种对矩阵扰动最小的补全方法。那么什么才算是对矩阵扰动最小呢? 一般认为,如果 补全后矩阵的特征值和补全之前矩阵的特征值相差不大,就算是扰动比较小。所以,最早的矩阵 分解模型就是从数学上的SVD (奇异值分解)开始的。给定w个用户和n个物品,和用户对物品的评分矩阵R。首先需要对评分矩阵中的缺失值进行简单地补全,比如用全局平均值,得到补全后的矩阵R’。接着,可以用SVD分解将R’分解成如下形式:
SVD分解是早期推荐系统研究常用的矩阵分解方法,不过该方法具有以下缺点,因此很难在 实际系统中应用。
- 该方法首先需要用一个简单的方法补全稀疏评分矩阵。一般来说,推荐系统中的评分矩阵是非常稀疏的,一般都有95%以上的元素是缺失的。而一旦补全,评分矩阵就会变成一 个稠密矩阵,从而使评分矩阵的存储需要非常大的空间,这种空间的需求在实际系统中 是不可能接受的。
- 该方法依赖的SVD分解方法的计算复杂度很高,特别是在稠密的大规模矩阵上更是非常慢。一般来说,这里的SVD分解用于1000维以上的矩阵就已经非常慢了,而实际系统动 辄是上千万的用户和几百万的物品,所以这一方法无法使用。
2. Simon Funk的SVD分解
正是由于上面的两个缺点,SVD分解算法提出几年后在推荐系统领域都没有得到广泛的关注。直到Simon Funk在博客上公布了一个算法Latent Factor Model (简称为LFM )
从矩阵分解的角度说,如果我们将评分矩阵R分解为两个低维矩阵相乘:
LearningLFM主要包括两步。首先,需要对p、q矩阵进行初始化,然后需要通过随机梯度下降法的迭代得到最终的p,q矩阵。
LFM提出之后获得了很大的成功,后来很多著名的模型都是通过对LFM修修补补获得的,下面将分别介绍一下改进LFM的各种方法。
3.加入偏执项后的LFM
这个预测公式中加人了3项u、bu、bi。我们将这个模型称为BiasSVD。这个模型中新增加的三项的作用如下。
u:训练集中所有记录的评分的全局平均数。在不同网站中,因为网站定位和销售的物品不同,网站的整体评分分布也会显示出一些差异。比如有些网站中的用户就是喜欢打 高分,而另一些网站的用户就是喜欢打低分。而全局平均数可以表示网站本身对用户评 分的影响。
bu:用户偏置(user bias)项。这一项表示了用户的评分习惯中和物品没有关系的那种 因素。比如有些用户就是比较苛刻,对什么东西要求都很高,那么他的评分就会偏低,
而有些用户比较宽容,对什么东西都觉得不错,那么他的评分就会偏高。
bi:物品偏置(item bias)项。这一项表示了物品接受的评分中和用户没有什么关系的 因素。比如有些物品本身质量就很高,因此获得的评分相对都比较高,而有些物品本身 质量很差,因此获得的评分相对都会比较低。
4.考虑邻域影响的LFM
前面的LFM模型中并没有显式地考虑用户的历史行为对用户评分预测的影响。为此,Koren在Netflix Prize比赛中提出了一个模型将用户历史评分的物品加人到了LFM模型中,Koren将该模型称为SVD++。
在介绍SVD++之前,我们首先讨论一下如何将基于邻域的方法也像LFM那样设计成一个可以学习的模型。我们可以将ItemCF的预测算法改成如下方式:
加入时间信息
研究人员提出了利用时间信息降低预测误差的方法。 利用时间信息的方法也主要分成两种,一种是将时间信息应用到基于邻域的模型中,另一种是将时间信息应用到矩阵分解模型中。下面将分别介绍这两种算法。
- 基于邻域的模型融合时间信息
因为NetflixPrize数据集中用户数目太大,所以基于用户的邻域模型很少被使用,主要是因为存储用户相似度矩阵非常困难。因此,本节主要讨论如何将时间信息融合到基于物品的邻域模型中。
Netflix Prize的参赛队伍BigChaos在技术报告中提到了一种融人时间信息的基于邻域的模型,本节将这个模型称为TItemCF。该算法通过如下公式预测用户在某一个时刻会给物品什么评分:
- 基于矩阵分解的模型融合时间信息
在引入时间信息后,用户评分矩阵不再是一个二维矩阵,而是变成了一个三维矩阵。不过,我们可以仿照分解二维矩阵的方式对三维矩阵进行分解。回顾一下前面的BiasSVD模型:
模型融合
Netflix Prize的最终获胜队伍通过融合上百个模型的结果才取得了最终的成功。由此可见模型融合对提高评分预测的精度至关重要。本节讨论模型融合的两种不同技术。
由上面的描述可以发现,级联融合很像Adaboost算法。和Adaboost算法类似,该方法每次产生一个新模型,按照一定的参数加到旧模型上去,从而使训练集误差最小化。不同的是,这里每 次生成新模型时并不对样本集采样,针对那些预测错的样本,而是每次都还是利用全样本集进行 预测,但每次使用的模型都有区别。
一般来说,级联融合的方法都用于简单的预测器,比如前面提到的平均值预测器。
一般来说,评分预测问题的解决需要在训练集上训练K个不同的预测器,然后在测试集上作出预测。但是,如果我们继续在训练集上融合K个预测器,得到线性加权系数,就会造成过拟合的问题。因此,在模型融合时一般采用如下方法。
- 假设数据集已经被分为了训练集A和测试集B那么首先需要将训练集A按照相同的分割方法分为A1和A2,其中A2的生成方法和B的生成方法一致,且大小相似。
- 在A1上训练K个不同的预测器,在A2上作出预测。因为我们知道A2上的真实评分值,所以可以在A2上利用最小二乘法计算出线性融合系数α。
- 在A上训练K个不同的预测器,在B上作出预测,并且将这K个预测器在B上的预测结果按照已经得到的线性融合系数加权融合,以得到最终的预测结果。
除了线性融合,还有很多复杂的融合方法,比如利用人工神经网络的融合算法。其实,模型 融合问题就是一个典型的回归问题,因此所有的回归算法都可以用于模型融合。