recommenderlab 是R语言非常强大的包,能帮助使用者针对评分数据或者0-1(不喜欢/喜欢)二分数据开发和测试推荐算法,本文就是利用该包对于 movielens 的电影评分数据进行预测和推荐,会对比基于用户的协同过滤和基于项的协同过滤在推荐效果上的差别。
1 获取电影数据
电影数据来源于http://grouplens.org/datasets/movielens/网站,本文分析的数据是MovieLens 100k,总共有100,000个评分,来自1000位用户对1700部电影的评价。
2 数据准备和清理
设置好工程路径后,可用读入数据,注意数据的格式,第一列是 user id,第二列是 item id,第三列是 rating,第四列是时间戳,时间戳这里用不到,可去掉。
> ml100k <- read.table("u.data", header = F, stringsAsFactors = T) > head(ml100k) V1 V2 V3 V4 1 196 242 3 881250949 2 186 302 3 891717742 3 22 377 1 878887116 > ml100k <- ml100k[, -4]
可以简单看下 rating 的分布情况
> prop.table(table(ml100k[, 3])) 1 2 3 4 5 0.06106870 0.12977099 0.41984733 0.32061069 0.06870229 > summary(ml100k[, 3]) Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 1.000 3.000 3.000 3.206 4.000 5.000 812
可以看出,3 星和 4 星的数量最多,接近总数的75%,1 星和 5 星的数量最少,和预期的一致。数据格式和我们想要的行为用户,列为项目的 ratingMatrix 还有很大的差距,对此可以使用 reshape 包的 cast()
进行转换,注意转换后的缺失值默认为NA。
> library(reshape) > ml100k <- cast(ml100k, V1 ~ V2, value = "V3") > ml.useritem[1:3, 1:6] 1 2 3 4 5 6 1 5 3 4 3 3 5 2 4 NA NA NA NA NA 3 NA NA NA NA NA NA
到此,把数据整理成 ratingMatrix,接下来利用 recommenderlab 处理数据。