Recommenderlab包实现电影评分预测(R语言)
来源:互联网 发布:淘宝个人中心在哪里 编辑:程序博客网 时间:2024/04/29 03:52
来源:http://cos.name/cn/topic/150937
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 V41 196 242 3 8812509492 186 302 3 8917177423 22 377 1 878887116> ml100k <- ml100k[, -4]
> prop.table(table(ml100k[, 3])) 1 2 3 4 50.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 stars和4 stars数量最多,接近总数的75%,1 stars和5 stars的数量最少,和预期的一致。数据格式和我们想要的行为user,列为item的ratingMatrix还有很大的差距,对此可以使用reshape包的cast进行转换,注意转换后的缺失值默认为NA。
> library(reshape)> ml100k <- cast(ml100k, V1 ~ V2, value = "V3")
> ml.useritem=ml100k[,-1]> ml.useritem[1:3, 1:6] 1 2 3 4 5 61 5 3 4 3 3 52 4 NA NA NA NA NA3 NA NA NA NA NA NA
到此,把数据整理成ratingMatrix,接下来利用recommenderlab处理数据。
3 commenderlab处理数据
在用commenderlab处理数据之前,需将数据转换为realRatingMatrix类型,这是commenderlab包中专门针对1-5 star的一个新类,需要从matrix转换得到。上文获得的ml.useritem有两个类属性,其中cast_df是不能直接转换为matrix的,因此需要去掉这个类属性,只保留data.frame> class(ml.useritem)[1] "cast_df" "data.frame"> class(ml.useritem) <- "data.frame" ##只保留data.frame的类属性> ml.useritem <- as.matrix(ml.useritem)> ml.ratingMatrix <- as(ml.useritem, "realRatingMatrix") ##转换为realRatingMatrix> ml.ratingMatrix943 x 1682 rating matrix of class ‘realRatingMatrix’ with 100000 ratings.
ml.ratingMatrix是可以用recommenderlab进行处理的realRatingMatrix,943是user数,1682指的是item数, realRatingMatrix可以很方便的转换为matrix和list
> as(ml.ratingMatrix , "matrix")[1:3, 1:10] 1 2 3 4 5 6 7 8 9 101 5 3 4 3 3 5 4 1 5 32 4 NA NA NA NA NA NA NA NA 23 NA NA NA NA NA NA NA NA NA NA> as(ml.ratingMatrix , "list")[[1]][1:10] 1 2 3 4 5 6 7 8 9 10 5 3 4 3 3 5 4 1 5 3
另外,recommenderlab包中有提供用于归一化的函数normalize,默认是均值归一化x – mean,建立推荐模型的函数,里面有归一化处理的,在此不必单独进行归一化。
4 recommender简单介绍
在建模之前可以先看下针对realRatingMatrix,recommederlab有提供那些推荐技术,总共有6种,我们会用到其中的三种random(随机推荐),popular(基于流行度推荐),ibcf(基于项目协同过滤)> recommenderRegistry$get_entries(dataType = "realRatingMatrix")$IBCF_realRatingMatrixRecommender method: IBCF ##基于项目协同过滤Description: Recommender based on item-based collaborative filtering (real data).Parameters: k method normalize normalize_sim_matrix alpha na_as_zero minRating1 30 Cosine center FALSE 0.5 FALSE NA$PCA_realRatingMatrix ##主成份分析Recommender method: PCADescription: Recommender based on PCA approximation (real data).Parameters: categories method normalize normalize_sim_matrix alpha na_as_zero minRating1 20 Cosine center FALSE 0.5 FALSE NA$POPULAR_realRatingMatrix ##基于流行度推荐Recommender method: POPULARDescription: Recommender based on item popularity (real data).Parameters: None$RANDOM_realRatingMatrix ##随机推荐Recommender method: RANDOMDescription: Produce random recommendations (real ratings).Parameters: None$SVD_realRatingMatrix ##奇异值分解Recommender method: SVDDescription: Recommender based on SVD approximation (real data).Parameters: categories method normalize normalize_sim_matrix alpha treat_na minRating1 50 Cosine center FALSE 0.5 median NA$UBCF_realRatingMatrix ##基于用户协同过滤Recommender method: UBCFDescription: Recommender based on user-based collaborative filtering (real data).Parameters: method nn sample normalize minRating1 cosine 25 FALSE center NA
以IBCF为例简单介绍参数的含义
K:取多少个最相似的item,默认为30
method :相似度算法,默认采用余弦相似算法cosine
Normalize:采用何种归一化算法,默认均值归一化x –mean
normalize_sim_matrix:是否对相似矩阵归一化,默认为否
alpha:alpha参数值,默认为0.5
na_as_zero:是否将NA作为0,默认为否
minRating:最小评分,默认不设置
这些参数均可在建立模型时设置,本文全部采用默认参数。
5 建立推荐模型
recommender是recommenderlab包中用于建立模型的函数,用法也相当简单,注意在调用recommender之前需给矩阵的所有列按照itemlabels进行列命名。> colnames(ml.ratingMatrix) <- paste("M", 1:1682, sep = "")> as(ml.ratingMatrix[1,1:10], "list")$<code>1code> M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 5 3 4 3 3 5 4 1 5 3##【Warning】在建立推荐模型之前一定要给item按照itemLabels进行命名,否则会有如下错误##Error in validObject(.Object) :## invalid class “topNList” object: invalid object for slot "itemLabels" in class "topNList": got class "NULL", should be or extend class "character"> ml.recommModel <- Recommender(ml.ratingMatrix[1:800], method = "IBCF")> ml.recommModelRecommender of type ‘POPULAR’ for ‘realRatingMatrix’learned using 800 users.
模型建立以后,可以用来进行预测和推荐了,同样使用predict函数,这里分别给801-803三个用户进行推荐,predict函数有一个type参数,可用来设置是top-n推荐还是评分预测,默认是top-n推荐。
##TopN推荐,n = 5 表示Top5推荐> ml.predict1 <- predict(ml.recommModel, ml.ratingMatrix[801:803], n = 5)> ml.predict1Recommendations as ‘topNList’ with n = 5 for 3 users.> as( ml.predict1, "list") ##显示三个用户的Top3推荐列表[[1]][1] "M50" "M100" "M127" "M98" "M174"[[2]][1] "M50" "M100" "M127" "M174" "M313"[[3]][1] "M50" "M100" "M127" "M98" "M174"##用户对item的评分预测> ml.predict2 <- predict(ml.recommModel, ml.ratingMatrix[801:803], type = "ratings")> ml.predict2> as(ml.predict2, "matrix")[1:3, 1:6] ##查看三个用于对M1-6的预测评分,注意:实际的预测评分还要在此基础上加上用户的平均评分 M1 M2 M3 M4 M5 M6801 0.2909692 -0.2749699 -0.350463 -0.02231146 -0.2300878 0.2049403802 0.2909692 -0.2749699 -0.350463 -0.02231146 -0.2300878 0.2049403803 0.2909692 -0.2749699 -0.350463 -0.02231146 -0.2300878 0.2049403
6 模型的评估
本文只考虑评分预测模型的评估,对于Top-N推荐模型请查看后面的参考资料,对于评分预测模型的评估,最经典的参数是RMSE(均平方根误差)rmse <- function(actuals, predicts){ sqrt(mean((actuals - predicts)^2, na.rm = T))}幸运的是,recommenderlab包有提供专门的评估方案,对应的函数是evaluationScheme,能够设置采用n-fold交叉验证还是简单的training/train分开验证,本文采用后一种方法,即将数据集简单分为training和test,在training训练模型,然后在test上评估。
> model.eval <- evaluationScheme(ml.ratingMatrix[1:943], method = "split",+ train = 0.9, given = 15, goodRating = 5)> model.evalEvaluation scheme with 15 items givenMethod: ‘split’ with 1 run(s).Training set proportion: 0.900Good ratings: >=5.000000Data set: 943 x 1682 rating matrix of class ‘realRatingMatrix’ with 100000 ratings.##分别用RANDOM、UBCF、IBCF建立预测模型> model.random <- Recommender(getData(model.eval, "train"), method = "RANDOM")> model.ubcf <- Recommender(getData(model.eval, "train"), method = "UBCF")> model.ibcf <- Recommender(getData(model.eval, "train"), method = "IBCF")##分别根据每个模型预测评分> predict.random <- predict(model.random, getData(model.eval, "known"), type = "ratings")> predict.ubcf <- predict(model.ubcf, getData(model.eval, "known"), type = "ratings")> predict.ibcf <- predict(model.ibcf, getData(model.eval, "known"), type = "ratings")
这里简单介绍,数据集是如何划分的,其实很简单,对于用户没有评分过的items,是没法进行模型评估的,因为预测值没有参照对象。getData的参数given便是来设置用于预测的items数量。
接下来计算RMSE,对比三个模型的评估参数,calcPredictionError函数可以计算出MAE(绝对值均方误差)、MSE和RMSE。
> error <- rbind(+ calcPredictionError(predict.random, getData(model.eval, "unknown")),+ calcPredictionError(predict.ubcf, getData(model.eval, "unknown")),+ calcPredictionError(predict.ibcf, getData(model.eval, "unknown")))> rownames(error) <- c("RANDOM", "UBCF", "IBCF")> error MAE MSE RMSERANDOM 1.7267304 4.486820 2.118211UBCF 0.8254453 1.062409 1.030732IBCF 0.8444152 1.333968 1.154976
为了更好的说明RMSE与training/test ratio、given等参数的关系,我们可以进行多组的比较。
从上面的两张图可以得出如下结论:
1、training/test ratio对RMSE没什么影响,并不是training比重越大RMSE越小,因此在实际过程中可适当降低training的比例,减少建立模型所需时间;
2、given值对协同过滤的推荐系统影响很多,given越大(用于预测items数量)RMSE越小,当然这里最大given值为20,在[1, 20]范围内,显然given = 20是最优的;
3、基于用户的协同过滤表现好,随机推荐最差,另外,items的数量超过2倍的用户数,因此无论从降低RMSE还是提高模型性能来说,UBCF都是最好的选择。有兴趣的童鞋还可以尝试分析近邻数K、相似度算法和RMSE的关系。
在《recommender system handbook》的4.2.5节,很详细对比了IBCF和UBCF,再结合以上的数据,可以很好的理解为什么在这个案例中UBCF要明显优于IBCF。
7 参考资料
[1] recommender system handbook[2] Item-Based Collaborative Filtering Recommendation Algorithms
[3] recommenderlab: A Framework for Developing and Testing Recommendation Algorithms
0 0
- Recommenderlab包实现电影评分预测(R语言)
- 基于R语言构建的电影评分预测模型
- 基于R语言构建的电影评分预测模型
- 基于R语言构建的电影评分预测模型
- 基于R语言构建的电影评分预测模型
- R语言实现电影评分推荐
- [置顶]R语言:recommenderlab包的总结与应用案例
- 电影评分预测
- kaggle-电影评分预测从零开始
- R语言编写函数——豆瓣电影评分查询
- R语言实现人工神经网络预测
- 用recommenderlab做电影推荐
- 用协同过滤算法对电影评分,并使用RMSE算出预测误差的MapReduce实现
- 【R语言 评分模型】R语言建立信用评分模型
- BP神经网络原理与应用-基于电影评分预测案例
- 【Kaggle笔记】预测Imdb电影评分(随机森林)
- 回归预测及R语言实现 Part1 回归基础综述
- 回归预测及R语言实现 Part2 回归R语言实现
- 端口映射
- NYOJ56 阶乘因式分解(一)
- (work and tools)tcpdump的用法
- django 笔记
- 详细解读JVM中的对象生命周期(1)
- Recommenderlab包实现电影评分预测(R语言)
- 移植rootfs错误Failed to execute /linuxrc. Attempting defaults的解决
- WPF流程预览
- 资源文件国际化
- js正则校验输入空格
- 网络通信
- webkit简介
- 程序员成熟的标志
- 在.h文件和.m文件里使用import指令有何区别?