R語言:recommenderlab包的總結與應用案例
1. 推薦系統:recommenderlab包整體思路
recommenderlab包提供了一個可以用評分資料和0-1資料來發展和測試推薦算法的架構。
它提供了幾種基礎算法,并可利用注冊機制允許使用者使用自己的算法
recommender包的資料類型采用S4類構造。
(1)評分矩陣資料接口:使用抽象的raringMatrix為評分資料提供接口。raringMatrix采用了很多類似矩陣對象的操作,如 dim(),dimnames() ,rowCounts() ,colMeans() ,rowMeans(),colSums(),rowMeans();也增加了一些特别的操作方法,如sample(),用于從使用者(即,行)中抽樣,image()可以生成像素圖。raringMatrix的兩種具體運用是realRatingMatrix和binaryRatingMatrix,分别對應評分矩陣的不同情況。其中realRatingMatrix使用的是真實值的評分矩陣,存儲在由Matrix包定義的稀疏矩陣(spare matrix)格式中;binaryRatingMatrix使用的是0-1評分矩陣,存儲在由arule包定義的itemMatrix中。
(2)存儲推薦模型并基于模型進行推薦。類Recommender使用資料結構來存儲推薦模型。建立方法是:Rencommender(data=ratingMatrix,method,parameter=NULL),傳回一個Rencommender對象object,可以用來做top-N推薦的預測:
predict(object,newdata,n,type=c('topNlist,ratings'),…)
(3)使用者可以利用registry包提供的注冊機制自定義自己的推薦算法。注冊機制調用recommenderRegistry并存貯推薦算法的名字和簡短描述。
(4)評價推薦算法的表現:recommender包提供了evaluationScheme類的對象用于建立并儲存評價計劃。建立函數如下: evaluatiomScheme(data,method,train,k,given) 這裡的方法可以采用簡單劃分、自助法抽樣、k-折交叉驗證等。接下來可以使用函數evalute()使用評價計劃的多個評價算法的表現。
2.執行個體分析
library(recommenderlab)
library(ggplot2)
##資料處理與資料探索性分析
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
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)
## -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 ")
##推薦算法的情況
# 先看可以使用的方法
recommenderRegistry$get_entries(dataType = "realRatingMatrix")
#對于realRatingMatrix有六種方法:IBCF(基于物品的推薦)、UBCF(基于使用者的推薦)、SVD(矩陣因子化)、PCA(主成分分析)、 RANDOM(随機推薦)、POPULAR(基于流行度的推薦)
#利用前940位使用者建立推薦模型
m.recomm <- Recommender(MovieLense[1:940], method = "IBCF")
m.recomm
#對後三位使用者進行推薦預測,使用predict()函數,預設是topN推薦,這裡取n=3。預測後得到的一個topNList對象,可以把它轉化為清單,看預測結果。
(ml.predict <- predict(m.recomm, MovieLense[941:943], n = 3))
str(ml.predict)
as(ml.predict, "list")#預測結果
#代碼示例
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))
plot(results, annotate = 1:3, legend = "topleft") #ROC
plot(results, "prec/rec", annotate = 3)#precision-recall
# 按照評價方案建立推薦模型
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
#calcPredictionError()的參數“know”和“unknow”表示對測試集的進一步劃分:“know”表示使用者已經評分的,要用來預測的items;“unknow”表示使用者已經評分,要被預測以便于進行模型評價的items。
A man must be on his own!