亚马逊产品的推荐算法

2021-04-09 10:54:09 浏览数 (1)

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中,见文末阅读原文。

0 人点赞