查看原文
其他

基于用户协同过滤的电影评分预测模型

柯广 数据科学专栏 2022-10-15


智能推荐系统现在用的非常普遍,一个很明显日常生活中的例子就是网上购物消费。你在京东购物车里的还没买的东西,不管你打开什么网页都会看到,直到你厌烦了,这个广告以后还是会出现,没办法,这,就是智能推荐。

https://v.qq.com/txp/iframe/player.html?vid=t1313tg3bhn&width=500&height=375&auto=0

电影评分如今在电影业用的很多,很多大的视频提供商(爱奇艺、优酷等)都有自己的一套根据电影评分的预测推荐系统,给用户提供个性化服务,以此提升用户体验、留住用户。这里用R语言对著名的MovieLens数据集中的ml-100k里面的10万条用户-电影评分数据进行相对简单的预测建模。


一、获取数据并探索

数据下载地址:http://grouplens.org/datasets/movielens

直接读取u.data数据

>dat<-read.table('F:\\movielens数据集\\ml-100k\\ml-100k\\u.data',header = F,stringsAsFactors=T)

> head(dat)

   V1  V2 V3        V4

1 196 242  3 881250949

2 186 302  3 891717742

3  22 377  1 878887116

4 244  51  2 880606923

5 166 346  1 886397596

6 298 474  4 884182806

发现第四列时间戳对这个模型没影响,可以删除

>dat<-dat[-4]

#加列名,便于查看

>names(dat)<-c('UserId','MovieId','rating')

下面用ggplot2包中的函数绘制直方图,其中横坐标为电影评分。

>library(ggplot2)

>ggplot(dat,aes(x=rating))+geom_histogram(binwidth = 0.1)

这里有三个参数,第一个参数是用的数据对象为dat,第二个aes(x=rating)表示横坐标为电影评分rating(上面起的列名),geom_histogram(binwidth = 0.1)表明直方图宽度为0.1,显然这里Y轴是每个评分数目,不区分电影。可以看出评分为3、4、5的最多,我们猜测最后的电影预测分应该不会小于3~4吧。


二、利用recommenderlab包处理数据

上面一步,我们只是对数据进行了简单的探索与预处理,我们面对的还是一个一行记录了一个用户对一个电影的评分的数据。显然,我们需要一个标准,在这个标准下,每个用户的评分记录。这就需要构建用户-电影评分矩阵,把所有电影组成的集合作为一个正交空间,显然这个矩阵就是一个巨大的稀疏矩阵。这个稀疏矩阵的构建本身不难,R也为我们提供了一个包reshape。

>library(reshape)

>dat_u_m<-cast(dat,UserId~MovieId,value = 'rating')

这里cast()函数参数UserId~MovieId表示以用户为行,电影为列构建,value = 'rating'显然表示矩阵实际的元素。这个过程只需要10秒钟左右时间。

> dat_u_m[1:6,1:6]

  UserId  1  2  3  4  5

1      1  5  3  4  3  3

2      2  4 NA NA NA NA

3      3 NA NA NA NA NA

4      4 NA NA NA NA NA

5      5  4  3 NA NA NA

6      6  4 NA NA NA NA

>dat_u_m<-dat_u_m[,-1]

显然多了一列数据,执行dat_u_m<-dat_u_m[,-1]去掉即可。

但是recommenderlab包要求数据属性为realRatingMatrix,那就需要修改数据属性了。

>class(dat_u_m)<-'data.frame'

>library(recommenderlab)

>dat_u_m<-as.matrix(dat_u_m)

>dat_u_m<-as(dat_u_m,'realRatingMatrix')

首先将其属性改为‘data.frame’,然后修改为‘matrix’,最后用as(dat_u_m,'realRatingMatrix')命令修改为'realRatingMatrix'。

> dat_u_m

943 x 1682 rating matrix of class ‘realRatingMatrix’ with 100000 ratings.

这是由943行、1682列realRatingMatrix类型数据构成的矩阵,包含10万个电影评分,其它为NA。


三、建立模型

对于realRatingMatrix数据类型,recommenderlab包一共提供了6种模型,分别是基于项目协同过滤(IBCF)、主成分分析(PCA)、基于流行度推荐(POPULAR)、随机推荐(RANDOM)、奇异值分解(SVD)和基于用户推荐(UBCF),这里采用基于用户推荐(UBCF)。

基于用户的协同过滤推荐就是根据目标用户的已知电影评分找到兴趣爱好相同(相似度大)的用户,然后计算该用户对其它电影的评分。其实,我们看到上面构建的用户-评分矩阵很稀疏,因为一个用户只评价了几十个电影,而总共由1682个电影(列)。

我们先为每一列数据命名,否则会出错。

>colnames(dat_u_m)<-paste('Movie',1:1682,sep = '')

预处理工作已完成,下面开始建立模型并预测评分。

>dat_u_m.model<-Recommender(dat_u_m[1:700],method='UBCF')

>dat_u_m.predict<-predict(dat_u_m.model,dat_u_m[701:705],type='ratings')

>dat_u_m.predict2<-predict(dat_u_m.model,dat_u_m[701:705],n=6)

> class(dat_u_m.predict2)

[1] "topNList"

attr(,"package")

[1] "recommenderlab"

> class(dat_u_m.predict)

[1] "realRatingMatrix"

attr(,"package")

[1] "recommenderlab"

第一行代码建立了一个基于用户的协同过滤模型,第一个参数指定使用dat_u_m中的前700条数据,第二个参数指定建模方法为基于用户的协同过滤;第二行代码使用predict()函数指定利用前面的模型对第701~705位用户进行预测,第三个参数指定预测类型为ratings,注意这里的ratings是一种数据类型,而不是前面起的列名“rating”。第三行代码使用predict()函数指定利用前面的模型对第701~705位用户推荐6个电影。这里数据是"topNList"和"realRatingMatrix"类型数据,需要变为‘list’类型进行查看。

可以看出预测的评分在3~4左右,与前面的直方图大多数在3~4附近反映的结论是一致的。

>as(dat_u_m.predict2,'list')

可以看出,为每个用户都推荐了指定数目的六个电影。那么,你该明白为什么在实际生活中视频提供商会比较准确地给你推荐电影了吧,这都是赤裸裸地数据计算的哦!


四、直接上代码

协同过滤推荐系统是当今的研究热点,不光在电影娱乐行业,在其它很多行业的也有很大利用,旨在为用户提供更好的服务,留住客户和发现潜在客户。


欢迎留言,觉得不错,记得点赞分享哦!



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存