1 前言:
R的recommenderlab包有许多关于推荐算法建立、处理及可视化的函数。上一次也利用这个包对Movielisence进行了分析,但是这个数据集来源于包本身。本文对于一个实际数据进行分析,该数据集来源于亚马逊网站,我们的目标是利用recommenderlab包构建相应的推荐系统,利用用户对产品的打分,做到给用户个性化推荐,包括
1. 构建多个不同方法的推荐系统,并进行比较,选取最优推荐系统。
2. 给出每个用户Top3的产品推荐。
3. 对于某个产品,预测出用户的评分情况。
2 本文框架:
3 数据清洗
3.1 读取数据,数据处理
这里的数据集比较大,指标有51多个,但是在此主要对三个指标进行分析包括:用户名,产品名称,打分情况构建新的数据集。并删除含有缺失值的行,最后数据仅剩下34621行。
代码语言:javascript复制#导入相关包
library(recommenderlab)
library(reshape)
data = read.csv("C:/Users/DELL/Desktop/2020.08.12亚马逊/data.csv",header = T)
data = data[,c(21,3,15)] #userid,product,rating
#删除na的行
data = na.omit(data)
dim(data)
输出:
为了方便起见,我们对数据进行重命名,V1表示用户名,V2表示产品名称,V3表示打分情况。
代码语言:javascript复制names(data) = c('V1','V2','V3')
3.2 数据探索性分析
首先我们对用户评分进行可视化,利用summary()获取评分数据,可知最大值为5,最小值为1,平均值为4.58。
代码语言:javascript复制summary(data[, 3])
代码语言:javascript复制barplot(prop.table(table(data[, 3])),col="skyblue",
main="各评分分数占比情况",xlab="rating",ylab="proportion")
输出:
并对产品数理进行可视化,一共有39个产品,并对个产品所含数量进行可视化
代码语言:javascript复制length(unique(data[, 2]))
代码语言:javascript复制library(tidyverse)
product <- tibble(
type = factor(unique(data[, 2])),
freq = fre
)
p = ggplot(data = product, mapping = aes(
x = fct_reorder(type, desc(freq)),
y = freq ))
p geom_col() coord_flip()
输出:
3.3 数据格式构造
构造新的数据类型`realRatingMatrix,以便更好的分析。生成一个以v1为行,v2为列的矩阵,使用v3进行填充。最后生成26762 x 39稀疏矩阵。并将获得第一列数字序号进行删除。
代码语言:javascript复制mydata <- cast(data,V1~V2,value="V3",fun.aggregate=mean)
#生成一个以v1为行,v2为列的矩阵,使用v3进行填充
mydata <- mydata[,-1] #第一列数字为序列,可以删除
结果包含两个属性,我们使用data.frame格式,并将其转换为realRatingMatrix。
代码语言:javascript复制class(mydata)class(mydata)<-"data.frame" #只选取data.framemydata<-as.matrix(mydata)mydata<-as(mydata,"realRatingMatrix") mydata
输出:
至此,数据格式已经处理完毕,可以进行建模及分析了。
4 建模与分析
对于realRatingMatrix有六种方法:IBCF(基于物品的推荐)、UBCF(基于用户的推荐)、SVD(矩阵因子化)、PCA(主成分分析)、 RANDOM(随机推荐)、POPULAR(基于流行度的推荐)。
4.1 各模型建模与比较
主要使用:recommenderlab包中的评估方案,对应函数是evaluationScheme,能够设置采用n-fold交叉验证还是简单的training/train分开验证,本文采用后一种方法,即将数据集简单分为training和test,在training训练模型,然后在test上评估。接下来我们使用三种不同技术进行构建推荐系统,并利用评估方案比较三种技术的好坏。
在此我们比较三种方法的结果:IBCF(基于物品的推荐),RANDOM(随机推荐),POPULAR(基于流行度的推荐),结果保存在results中。
代码语言:javascript复制scheme <- evaluationScheme(mydata, method = "split", train = 0.9, k = 1, given = 1, goodRating = 4) algorithms <- list(popular = list(name = "POPULAR", param = list(normalize = "Z-score")),random = list(name = "RANDOM",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))
接下来,按照评价方案建立各种推荐模型:
代码语言:javascript复制model.popular <- Recommender(getData(scheme, "train"), method = "POPULAR")
model.ibcf <- Recommender(getData(scheme, "train"), method = "IBCF")
model.random <- Recommender(getData(scheme, "train"), method = "RANDOM")
对三种推荐模型进行预测。
代码语言:javascript复制predict.popular <- predict(model.popular, getData(scheme, "known"), type = "ratings")
predict.ibcf <- predict(model.ibcf, getData(scheme, "known"), type = "ratings")
predict.random <- predict(model.random, getData(scheme, "known"), type = "ratings")
代码语言:javascript复制#误差计算
predict.err <- rbind(calcPredictionAccuracy(predict.popular,
getData(scheme, "unknown")),calcPredictionAccuracy(predict.random,
getData(scheme,"unknown")),
calcPredictionAccuracy(predict.ibcf,getData(scheme, "unknown")))
rownames(predict.err) <- c("POPULAR", "RANDOM", "IBCF")
predict.err
输出:
通过结果我们可以看到:三种方法的比较基于随机推荐系统对于本案例数据的效果最好,RMSE,MSE,MAE都是三者中的最小值。其次是基于物品的推荐,最后是基于流行度过滤。
4.2 构建最优模型
利用以上结果,我们构建最优模型:基于随机推荐系统。首先先对系数矩阵的行列名进行定义。数据处理完毕,接来下是进行预测,显示三个用户的Top3推荐列表。
代码语言:javascript复制colnames(mydata)<-paste0("asins",1:dim(mydata)[2],sep="")mydata.model <- Recommender(mydata[1:dim(mydata)[1]], method = "RANDOM")
4.2.1 Top3推荐
在此举个例子,给出users201,202,203每人前三个产品的推荐,并用列表进行输出。注意:n指数量,你可以进行修改,输出你想要前n个的产品推荐情况。
代码语言:javascript复制##TopN推荐mydata.predict1 <- predict(mydata.model,mydata[201:203], n = 3)as(mydata.predict1,"list")
4.2.2 用户对产品的评分预测
当然,也可以给出前三个users对前6个产品的评分预测。你可以对以下数字进行变换,做成函数,得到所有不同用户分别对每个产品评分预测。
代码语言:javascript复制mydata.predict2 <- predict(mydata.model, mydata[201:403], type = "ratings")mydata.predict2as(mydata.predict2, "matrix")[1:3, 1:6]
6 总结
本项目利用R的recommenderlab包对亚马逊网站34651个用户对41个产品打分情况进行分析,并构建多个推荐系统,通过RMSE,MSE,MAE比较,发现基于随机推荐系统对于本案例数据的拟合效果最好。于是利用该模型进行建模并给出每个用户Top3的产品推荐以及预测某个产品不同用户的评分情况。
代码与数据存在github中,见文末阅读原文。