recommenderlab:构建基于R的推荐系统(1)

http://site.douban.com/182577/widget/notes/10567212/note/345073868/

recommenderlab:构建基于R的推荐系统(1)

1.推荐系统和recommenderlab包

recommenderlab包提供了一个可以用评分数据和0-1数据来发展和测试推荐算法的框架。它提供了几种基础算法,并可利用注册机制允许用户使用自己的算法
recommender包的数据类型采用S4类构造,使用抽象的raringMatrix为评分数据提供接口。raringMatrix采用了很多类似矩阵对象的操作,如dim(),dimnames(),rowCounts(),colMeans(),rowMeans(),colSums(),rowMeans();也增加了一些特别的操作方法,如sample(),用于从用户(即,行)中抽样,image()可以生成像素图。raringMatrix的两种具体运用是realRatingMatrix和binaryRatingMatrix,分别对应评分矩阵的不同情况。其中realRatingMatrix使用的是真实值的评分矩阵,存储在由Matrix包定义的稀疏矩阵(spare matrix)格式中;binaryRatingMatrix使用的是0-1评分矩阵,存储在由arule包定义的itemMatrix中。

类Recommender使用数据结构来存储推荐模型。创建方法是:

Rencommender(data=ratingMatrix,method,parameter=NULL)

返回一个Rencommender对象object,可以用来做top-N推荐的预测:

predict(object,newdata,n,type=c('topNlist,ratings'),…)

使用者可以利用registry包提供的注册机制自定义自己的推荐算法。注册机制调用recommenderRegistry并存贮推荐算法的名字和简短描述。

为评价推荐算法的表现,recommender包提供了evaluationScheme类的对象用于创建并保存评价计划。创建函数如下: evaluatiomScheme(data,method,train,k,given) 这里的方法可以采用简单划分、自助法抽样、k-折交叉验证等。接下来可以使用函数evalute()使用评价计划的多个评价算法的表现。

下面用一个简单的人工例子来说明recommender包的数据结构和数据操作
m <- matrix(sample(c(as.numeric(0:5), NA), 30, replace = TRUE, prob = c(rep(0.5/6, 
    6), 0.5)), ncol = 6, dimnames = list(user = paste("u", 1:5, sep = ""), item = paste("i", 
    1:6, sep = "")))
m
## item
## user i1 i2 i3 i4 i5 i6
## u1 2 2 NA 0 NA NA
## u2 3 3 3 NA NA NA
## u3 NA 1 0 NA 0 1
## u4 NA 2 0 2 NA NA
## u5 NA NA NA NA 1 0
在这里所有没评分的值都是NA

把m转化为realRatingMatrix
library(recommenderlab)
m.real <- as(m, "realRatingMatrix")
m.real
## 5 x 6 rating matrix of class 'realRatingMatrix' with 15 ratings.
str(m.real)
## Formal class 'realRatingMatrix' [package "recommenderlab"] with 2 slots
## ..@ data :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
## .. .. ..@ i : int [1:15] 0 1 0 1 2 3 1 2 3 0 ...
## .. .. ..@ p : int [1:7] 0 2 6 9 11 13 15
## .. .. ..@ Dim : int [1:2] 5 6
## .. .. ..@ Dimnames:List of 2
## .. .. .. ..$ user: chr [1:5] "u1" "u2" "u3" "u4" ...
## .. .. .. ..$ item: chr [1:6] "i1" "i2" "i3" "i4" ...
## .. .. ..@ x : num [1:15] 2 3 2 3 1 2 3 0 0 0 ...
## .. .. ..@ factors : list()
## ..@ normalize: NULL
(rating <- m.real@data)
## 5 x 6 sparse Matrix of class "dgCMatrix"
## item
## i1 i2 i3 i4 i5 i6
## u1 2 2 . 0 . .
## u2 3 3 3 . . .
## u3 . 1 0 . 0 1
## u4 . 2 0 2 . .
## u5 . . . . 1 0
# 和下面的命令是等价的
dropNA(m)
## 5 x 6 sparse Matrix of class "dgCMatrix"
## item
## i1 i2 i3 i4 i5 i6
## u1 2 2 . 0 . .
## u2 3 3 3 . . .
## u3 . 1 0 . 0 1
## u4 . 2 0 2 . .
## u5 . . . . 1 0
identical(rating, dropNA(m))
## [1] TRUE

# 转换回矩阵
as.matrix(rating)
## item
## user i1 i2 i3 i4 i5 i6
## u1 2 2 0 0 0 0
## u2 3 3 3 0 0 0
## u3 0 1 0 0 0 1
## u4 0 2 0 2 0 0
## u5 0 0 0 0 1 0
# NA没有了,这种转换是不合适的。需要这样做
as(m.real, "matrix")
## item
## user i1 i2 i3 i4 i5 i6
## u1 2 2 NA 0 NA NA
## u2 3 3 3 NA NA NA
## u3 NA 1 0 NA 0 1
## u4 NA 2 0 2 NA NA
## u5 NA NA NA NA 1 0

数据操作:
# 转化为列表
as(m.real, "list")
## $u1
## i1 i2 i4 
## 2 2 0 
## 
## $u2
## i1 i2 i3 
## 3 3 3 
## 
## $u3
## i2 i3 i5 i6 
## 1 0 0 1 
## 
## $u4
## i2 i3 i4 
## 2 0 2 
## 
## $u5
## i5 i6 
## 1 0
# 转化为数据框
head(as(m.real, "data.frame"))
## user item rating
## 1 u1 i1 2
## 3 u1 i2 2
## 10 u1 i4 0
## 2 u2 i1 3
## 4 u2 i2 3
## 7 u2 i3 3
# 标准化
n.real <- normalize(m.real)
# 标准化前后的比较,像素图
image(m.real, main = "Raw rating")

 

image(n.real, main = "Normalized rating")

 

2.协同过滤(Collaborative Flitering)方法

(1) 数据探索

协同过滤的基本思想是如果用户在过去有相同的偏好,那么在未来也会有相似的偏好,所以可以利用已知的用户过去的行为或评分对当前用户的喜好进行预测。 协同推荐技术一般分为基于记忆的和基于模型的。基于记忆的模型根据保存在内存中的原始评分数据直接生成推荐,常用的如基于物品的推荐(IBCF)和基于用户的推荐(UBCF)。

下面利用recommender包自带的数据集MovieLense,讨论基本的协同过滤推荐方法的使用。这个数据集收集了网站MovieLens(movielens.umn.edu)从1997年9月19日到1998年4月22日的数据,包括943名用户对1664部电影的评分。

首先利用可视化了解数据集的情况。
data(MovieLense)
# 可视化原始数据
image(MovieLense)

 

# 获取评分
ratings.movie <- data.frame(ratings = getRatings(MovieLense))
summary(ratings.movie$ratings)
## Min. 1st Qu. Median Mean 3rd Qu. Max. 
## 1.00 3.00 4.00 3.53 4.00 5.00
library(ggplot2)
ggplot(ratings.movie, aes(x = ratings)) + geom_histogram(fill = "beige", color = "black", 
    binwidth = 1, alpha = 0.7) + xlab("rating") + ylab("count")

 

# 标准化
ratings.movie1 <- data.frame(ratings = getRatings(normalize(MovieLense, method = "Z-score")))
summary(ratings.movie1$ratings)
## Min. 1st Qu. Median Mean 3rd Qu. Max. 
## -4.850 -0.647 0.108 0.000 0.751 4.130
ggplot(ratings.movie1, aes(x = ratings)) + geom_histogram(fill = "beige", color = "black", 
    alpha = 0.7) + xlab("rating") + ylab("count")

 

标准化的目的是为了去除用户评分的偏差

# 用户的电影点评数
movie.count <- data.frame(count = rowCounts(MovieLense))
ggplot(movie.count, aes(x = count)) + geom_histogram(fill = "beige", color = "black", 
    alpha = 0.7) + xlab("counts of users") + ylab("counts of movies rated")

 

用户存在长尾

# 电影的平均评分
rating.mean <- data.frame(rating = colMeans(MovieLense))
ggplot(rating.mean, aes(x = rating)) + geom_histogram(fill = "beige", color = "black", 
    alpha = 0.7) + xlab("rating") + ylab("counts of movies ")

 

(2)预测推荐

# 先看可以使用的方法
recommenderRegistry$get_entries(dataType = "realRatingMatrix")
## $IBCF_realRatingMatrix
## Recommender method: IBCF
## Description: Recommender based on item-based collaborative filtering (real data).
## Parameters:
## k method normalize normalize_sim_matrix alpha na_as_zero minRating
## 1 30 Cosine center FALSE 0.5 FALSE NA
## 
## $PCA_realRatingMatrix
## Recommender method: PCA
## Description: Recommender based on PCA approximation (real data).
## Parameters:
## categories method normalize normalize_sim_matrix alpha na_as_zero
## 1 20 Cosine center FALSE 0.5 FALSE
## minRating
## 1 NA
## 
## $POPULAR_realRatingMatrix
## Recommender method: POPULAR
## Description: Recommender based on item popularity (real data).
## Parameters: None
## 
## $RANDOM_realRatingMatrix
## Recommender method: RANDOM
## Description: Produce random recommendations (real ratings).
## Parameters: None
## 
## $SVD_realRatingMatrix
## Recommender method: SVD
## Description: Recommender based on SVD approximation (real data).
## Parameters:
## categories method normalize normalize_sim_matrix alpha treat_na
## 1 50 Cosine center FALSE 0.5 median
## minRating
## 1 NA
## 
## $UBCF_realRatingMatrix
## Recommender method: UBCF
## Description: Recommender based on user-based collaborative filtering (real data).
## Parameters:
## method nn sample normalize minRating
## 1 cosine 25 FALSE center NA
对于realRatingMatrix有六种方法:IBCF(基于物品的推荐)、UBCF(基于用户的推荐)、SVD(矩阵因子化)、PCA(主成分分析)、 RANDOM(随机推荐)、POPULAR(基于流行度的推荐)

利用前940位用户建立推荐模型
m.recomm <- Recommender(MovieLense[1:940], method = "IBCF")
m.recomm
## Recommender of type 'IBCF' for 'realRatingMatrix' 
## learned using 940 users.
对后三位用户进行推荐预测,使用predict()函数,默认是topN推荐,这里取n=3。预测后得到的一个topNList对象,可以把它转化为列表,看预测结果。

(ml.predict <- predict(m.recomm, MovieLense[941:943], n = 3))
## Recommendations as 'topNList' with n = 3 for 3 users.
str(ml.predict)
## Formal class 'topNList' [package "recommenderlab"] with 3 slots
## ..@ items :List of 3
## .. ..$ : int [1:3] 10 14 19
## .. ..$ : int [1:3] 3 39 47
## .. ..$ : int [1:3] 13 128 206
## ..@ itemLabels: chr [1:1664] "Toy Story (1995)" "GoldenEye (1995)" "Four Rooms (1995)" "Get Shorty (1995)" ...
## ..@ n : int 3
as(ml.predict, "list")#预测结果
## [1]
## [1] "Richard III (1995)" "Postino, Il (1994)" "Antonia's Line (1995)"
## 
## [2]
## [1] "Four Rooms (1995)" "Strange Days (1995)" "Ed Wood (1994)" 
## 
## [3]
## [1] "Mighty Aphrodite (1995)" "Supercop (1992)" 
## [3] "Akira (1988)"

recommenderlab:构建基于R的推荐系统(2)

3.评价推荐系统的表现

recommenderlab 包提供了函数 evaluationScheme()建立评价方案,能够使用简单划分、k折交叉验证、自助法进行模型的评价。下面采用简单划分的方法(split),即将数据集简单分为训练集和测试集,在训练集训练模型,然后在测试集上评价。 evaluationScheme()的主要参数:method,评估方法;train,划分为训练集的数据比例;k运行评估的折数或倍数(split的默认值为1);given表示用来进行模型评价的items的数量。

library(recommenderlab)
data(MovieLense)
scheme <- evaluationScheme(MovieLense, method = "split", train = 0.9, k = 1, 
    given = 10, goodRating = 4)
algorithms <- list(popular = list(name = "POPULAR", param = list(normalize = "Z-score")), 
    ubcf = list(name = "UBCF", param = list(normalize = "Z-score", method = "Cosine", 
        nn = 25, minRating = 3)), ibcf = list(name = "IBCF", param = list(normalize = "Z-score")))
results <- evaluate(scheme, algorithms, n = c(1, 3, 5, 10, 15, 20))
## POPULAR run 
## 1 [0.08sec/0.16sec] 
## UBCF run 
## 1 [0.09sec/4.96sec] 
## IBCF run 
## 1 [114.8sec/0.84sec]

recomenderlab包也提供了绘制表现图的方法,可以绘制ROC曲线和 precision-recall曲线

plot(results, annotate = 1:3, legend = "topleft") #ROC

 

plot(results, "prec/rec", annotate = 3)#precision-recall

 

用calcPredictionError()函数可以计算由用户精确评分给出的预测评分的MAE,MSE和RMSE这三种误差

# 按照评价方案建立推荐模型
model.popular <- Recommender(getData(scheme, "train"), method = "POPULAR")
model.ibcf <- Recommender(getData(scheme, "train"), method = "IBCF")
model.ubcf <- Recommender(getData(scheme, "train"), method = "UBCF")
# 对推荐模型进行预测
predict.popular <- predict(model.popular, getData(scheme, "known"), type = "ratings")
predict.ibcf <- predict(model.ibcf, getData(scheme, "known"), type = "ratings")
predict.ubcf <- predict(model.ubcf, getData(scheme, "known"), type = "ratings")
# 做误差的计算
predict.err <- rbind(calcPredictionError(predict.popular, getData(scheme, "unknown")), 
    calcPredictionError(predict.ubcf, getData(scheme, "unknown")), calcPredictionError(predict.ibcf, 
        getData(scheme, "unknown")))
rownames(predict.err) <- c("POPULAR, "UBCF", "IBCF")
predict.err
## MAE MSE RMSE
##POPULAR 3.5402 13.489 3.673
## UBCF 0.8051 1.062 1.030
## IBCF 0.8414 1.333 1.154

calcPredictionError()的参数“know”和“unknow”表示对测试集的进一步划分:“know”表示用户已经评分的,要用来预测的items;“unknow”表示用户已经评分,要被预测以便于进行模型评价的items。

recommenderlab:构建基于R的推荐系统相关推荐

  1. 用python做股票量化分析豆瓣_[转]构建基于R的交易系统(5)quantstrat包(中)(来源:豆瓣-数据铺子)...

    生命不息,学习不止~ 尊重原创,原帖地址(豆瓣-数据铺子): 感谢 数据铺子 的"构建基于R的交易系统"系列帖子. --- faruto按 (2)基于quantstrat包的回测: ...

  2. 基于python的系统构建_利用python构建一个简单的推荐系统

    摘要: 快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫. 本文将利用python构建一个简单的推荐系统,在此之前读者需要对pandas和numpy等数据分析包有所了解. 什 ...

  3. python推荐系统-利用python构建一个简单的推荐系统

    摘要: 快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫. 本文将利用python构建一个简单的推荐系统,在此之前读者需要对pandas和numpy等数据分析包有所了解. 什 ...

  4. python推荐_利用Python构建一个简单的推荐系统

    原标题:利用Python构建一个简单的推荐系统 摘要:快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫.在此之前读者需要对pandas和numpy等数据分析包有所了解. 什么 ...

  5. python对电影进行预测评分_基于R语言构建的电影评分预测模型

    原标题:基于R语言构建的电影评分预测模型 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求职,一站式搞定! 对商业智能BI.大数据分析 ...

  6. R语言构建logistic回归模型并评估模型:构建基于混淆矩阵计算分类评估指标的自定义函数、阳性样本比例(垃圾邮件比例)变化对应的分类器性能的变化、基于数据阳性样本比例选择合适的分类评估指标

    R语言构建logistic回归模型并评估模型:构建基于混淆矩阵计算分类评估指标的自定义函数.阳性样本比例(垃圾邮件比例)变化对应的分类器性能的变化.基于数据阳性样本比例选择合适的分类评估指标 目录

  7. R语言splines包构建基于logistic回归的自然样条分析:南非心脏病数据集、非线性:基函数展开和样条分析、你简单分析的不重要特征,可能只是线性不显著、而非线性是显著的

    R语言splines包构建基于logistic回归的自然样条分析:南非心脏病数据集.非线性:基函数展开和样条分析.你简单分析的不重要特征,可能只是线性不显著.而非线性是显著的 目录

  8. R语言xgboost模型构建:基于prima糖尿病数据集

    R语言xgboost模型构建:基于prima糖尿病数据集 目录 R语言xgboost模型构建:基于prima糖尿病数据集

  9. 基于 word2vec 商城推荐系统的设计与实现

    今天在整理磁盘空间时,无意中找到了 2018 年写的毕业论文对应的 Word 文档,翻看了一下,感觉还有点价值,所以决定将其搬运到公众号上,希望对有需要的读者朋友有所帮助. 内容概述:通过 NLP 中 ...

最新文章

  1. tensorflow2 存取模型_思维导图:长短期记忆模型
  2. 力荐 | 吴恩达《序列模型》精炼笔记(1)-- 循环神经网络(RNN)
  3. 资讯|WebRTC M93 更新
  4. python打印网页成pdf_vue中将网页打印成pdf
  5. python中设置时间格式--模块datetime中日期和时间格式的参数
  6. JStorm—实时流式计算框架入门介绍
  7. vue3.0项目服务器部署
  8. 网站前端和后台性能优化22
  9. OpenBSD 现已支持 USB 3.0
  10. 2017.3.18 PPT汇报--总结
  11. 数据库DBeaverEE 22.0.2
  12. cas 单点登录_5分钟明了单点登录SSO、OAuth、LDAP、CAS的流程与应用
  13. 三星滑盖手机java游戏_三星滑盖手机大全简介
  14. ASP.NET快速入门
  15. CC2530串口中断接收字符并且判断
  16. [转载]唐僧的亲爹究竟是谁 (2016-02-17 16:37:21)
  17. 烟台服务器装系统,【图】- 烟台芝罘区上门修电脑安装系统电话多少三站 - 烟台芝罘电脑维修 - 烟台百姓网...
  18. 电脑中的快捷键(常用)
  19. 什么是根服务器?我国的根服务器发展如何?
  20. 【cmake学习】cmake 引入第三方库(头文件目录、库目录、库文件)

热门文章

  1. python如何读取weboutlook内容_用Python通过MAPI读取Outlook中的电子邮件
  2. 数据分析师是青春饭吗,前景如何?
  3. Ubuntu使用备忘
  4. Cytoscape安装及使用
  5. 【安卓-自定义布局】安卓App开发思路 一步一个脚印(十二)实现自定义左右滚动的信息块-仿蘑菇街
  6. oca考试及ocp考试指南
  7. FFmpeg[22] - 解决ffmpeg yasm not found, use --disable-yasm for a crippled build
  8. 编译 bonjour
  9. linux文件目录详解
  10. Git教程 | (9) 自定义Git和使用SourceTree